1. 程式人生 > >使用urlconnection和json傳送post請求到伺服器

使用urlconnection和json傳送post請求到伺服器

客戶端:

***
*HttpURLConnection連線伺服器<br>
*<功能詳細描述><br>
*1、通過後臺得到sessionID<br>
*2、檢查MAC地址是否正確<br>
*3、處理從伺服器讀取的JSON物件<br>
*4、從伺服器讀取物件<br>
*5、得到物件輸出流<br>
*6、設定HttpURLConnection引數<br>
*
* @author "zhaohaiyang"<br>
*@version 版本號 2010-1-14 下午02:01:41<br>
*@see

相關類/方法<br>
**/
public class ConUtils
{

 /**
*通過後臺得到sessionID<br>
*<功能詳細描述><br>
*
* @param parameters
*            登陸資訊
* @return 登陸成功返回sessionId 失敗返回“”
* @see [類、類#方法、類#成員]
*/
public static String receiveSessionID(String[] parameters, String[] values)
{
String tempSessionId = "";// SessionID

  URL url = null;// 請求處理的Servlet

  ObjectOutputStream objOutputStrm = null;// 物件輸出流

  InputStream inStrm = null;// 得到HttpURLConnection的輸入流

  HttpURLConnection httpUrlConnection = null;

   // 設定HttpURLConnection引數
httpUrlConnection = setURLConnectionProperties(url);

   // 得到物件輸出流
objOutputStrm = getObjOutStream(httpUrlConnection);

   JSONObject obj = new JSONObject();
for (int i = 0; i < parameters.length; i++)
{
obj.put(parameters[i], values[i]);
}
// 向物件輸出流寫出資料,這些資料將存到記憶體緩衝區中
objOutputStrm.writeObject(obj.toString());
// 重新整理物件輸出流,將任何位元組都寫入潛在的流中(些處為ObjectOutputStream)
objOutputStrm.flush();
// 關閉流物件。此時,不能再向物件輸出流寫入任何資料,先前寫入的資料存在於記憶體緩衝區中,
// 在呼叫下邊的getInputStream()函式時才把準備好的http請求正式傳送到伺服器
// objOutputStrm.close();

   // 呼叫HttpURLConnection連線物件的getInputStream()函式,
// 將記憶體緩衝區中封裝好的完整的HTTP請求電文傳送到服務端。
inStrm = httpUrlConnection.getInputStream(); // <===注意,實際傳送請求的程式碼段就在這裡

   // 上邊的httpConn.getInputStream()方法已呼叫,本次HTTP請求已結束,下邊向物件輸出流的輸出已無意義,
// 既使物件輸出流沒有呼叫close()方法,下邊的操作也不會向物件輸出流寫入任何資料.
// 因此,要重新發送資料時需要重新建立連線、重新設引數、重新建立流物件、重新寫資料、
// 重新發送資料(至於是否不用重新這些操作需要再研究)
// objOutputStrm.writeObject(new String(""));
// httpUrlConnection.getInputStream();

   // 從伺服器讀取物件
Object inObj = readObjectFromServer(inStrm);
// 處理從伺服器讀取的JSON物件
tempSessionId = doJsonObjectFromServerForSesId(tempSessionId, inObj);
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (ProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (JSONException e)
{
e.printStackTrace();
}
finally
{
try
{
if (objOutputStrm != null)
{
objOutputStrm.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
try
{
if (inStrm != null)
{
inStrm.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}

  return tempSessionId;
}

 /**
*檢查MAC地址是否正確<br>
*
* @param mac
* @return MAC地址正確返回true 錯誤返回false
*@see [類、類#方法、類#成員]
*/
public static boolean checkMac(String mac)
{

  URL url = null;// 請求處理的Servlet

  boolean flag = false;// MAC地址是否正確

  ObjectOutputStream objOutputStrm = null;// 物件輸出流

  InputStream inStrm = null;// 得到HttpURLConnection的輸入流

   // 設定HttpURLConnection引數
httpUrlConnection = setURLConnectionProperties(url);

   // 得到物件輸出流
objOutputStrm = getObjOutStream(httpUrlConnection);

   JSONObject obj = new JSONObject();
obj.put("mac", mac);
// 向物件輸出流寫出資料,這些資料將存到記憶體緩衝區中
objOutputStrm.writeObject(obj.toString());
// 重新整理物件輸出流,將任何位元組都寫入潛在的流中(些處為ObjectOutputStream)
objOutputStrm.flush();
// 關閉流物件。此時,不能再向物件輸出流寫入任何資料,先前寫入的資料存在於記憶體緩衝區中,
// 在呼叫下邊的getInputStream()函式時才把準備好的http請求正式傳送到伺服器
// objOutputStrm.close();

   // 呼叫HttpURLConnection連線物件的getInputStream()函式,
// 將記憶體緩衝區中封裝好的完整的HTTP請求電文傳送到服務端。
inStrm = httpUrlConnection.getInputStream(); // <===注意,實際傳送請求的程式碼段就在這裡

   // 上邊的httpConn.getInputStream()方法已呼叫,本次HTTP請求已結束,下邊向物件輸出流的輸出已無意義,
// 既使物件輸出流沒有呼叫close()方法,下邊的操作也不會向物件輸出流寫入任何資料.
// 因此,要重新發送資料時需要重新建立連線、重新設引數、重新建立流物件、重新寫資料、
// 重新發送資料(至於是否不用重新這些操作需要再研究)
// objOutputStrm.writeObject(new String(""));
// httpUrlConnection.getInputStream();

   // 從伺服器讀取物件
Object inObj = readObjectFromServer(inStrm);
// 處理從伺服器讀取的JSON物件
flag = doJsonObjectFromServer(flag, inObj);

  }
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (JSONException e)
{
e.printStackTrace();
}
finally
{

  }

  return flag;
}

 /**
*處理從伺服器讀取的JSON物件 用於校驗MAC地址<br>
*<功能詳細描述><br>
*
* @param flag
*            MAC是否正確
* @param inObj
*            從伺服器讀到的JSON物件
* @return MAC是否正確
* @throws JSONException
*@see [類、類#方法、類#成員]
*/

 private static boolean doJsonObjectFromServer(boolean flag, Object inObj)
throws JSONException
{
// 做非空處理
if (inObj != null)
{
// 根據得到的序列化物件 構建JSON物件
JSONObject injson = new JSONObject(inObj.toString());
// 拿到JSON物件中 對應key的值
String getStr = injson.getString("returnstring");
if (getStr.equals("true"))
{
flag = true;
}
}
return flag;
}

 private static String doJsonObjectFromServerForSesId(String tempSessionID,
Object inObj) throws JSONException
{
// 做非空處理
if (inObj != null)
{
// 根據得到的序列化物件 構建JSON物件
JSONObject injson = new JSONObject(inObj.toString());
// 拿到JSON物件中 對應key的值
tempSessionID = injson.getString("sessionID");
}
return tempSessionID;
}

 /**
*從伺服器讀取物件<br>
*<功能詳細描述><br>
*
* @param inStrm
*            輸入流
* @return 從伺服器返回的物件
* @throws IOException
*@see [類、類#方法、類#成員]
*/

 private static Object readObjectFromServer(InputStream inStrm)
throws IOException
{
ObjectInputStream objInStream; // 輸入流 從伺服器讀取JSON物件
objInStream = new ObjectInputStream(inStrm);// 輸入流 從伺服器讀取JSON物件
Object inObj = null;
try
{
inObj = objInStream.readObject();// 讀取物件
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
return inObj;
}

 /**
*得到物件輸出流<br>
*<功能詳細描述><br>
*
* @param httpUrlConnection
*            後臺與伺服器之間的通訊
* @return 物件輸出流
* @throws IOException
*@see [類、類#方法、類#成員]
*/

 private static ObjectOutputStream getObjOutStream(
HttpURLConnection httpUrlConnection) throws IOException
{
OutputStream outStrm;// 得到HttpURLConnection的輸出流
ObjectOutputStream objOutputStrm;// 物件輸出流
// 此處getOutputStream會隱含的進行connect(即:如同呼叫上面的connect()方法,
// 所以在開發中不呼叫上述的connect()也可以)。
outStrm = httpUrlConnection.getOutputStream();

  // 現在通過輸出流物件構建物件輸出流物件,以實現輸出可序列化的物件。
// 使用JSON傳值
objOutputStrm = new ObjectOutputStream(outStrm);
return objOutputStrm;
}

 /**
*設定HttpURLConnection引數<br>
*<功能詳細描述><br>
*
* @param url
*            請求處理的地址
* @return 後臺與伺服器之間的通訊連線
* @throws IOException
* @throws ProtocolException
*@see [類、類#方法、類#成員]
*/

 private static HttpURLConnection setURLConnectionProperties(URL url)
throws IOException, ProtocolException
{
HttpURLConnection httpUrlConnection;
URLConnection rulConnection = url.openConnection();// 此處的urlConnection物件實際上是根據URL的
// 請求協議(此處是http)生成的URLConnection類
// 的子類HttpURLConnection,故此處最好將其轉化
// 為HttpURLConnection型別的物件,以便用到
// HttpURLConnection更多的API.如下:

  httpUrlConnection = (HttpURLConnection) rulConnection;

  // 設定是否向httpUrlConnection輸出,因為這個是post請求,引數要放在
// http正文內,因此需要設為true, 預設情況下是false;
httpUrlConnection.setDoOutput(true);

  // 設定是否從httpUrlConnection讀入,預設情況下是true;
httpUrlConnection.setDoInput(true);

  // Post 請求不能使用快取
httpUrlConnection.setUseCaches(false);

  // 設定傳送的內容型別是可序列化的java物件
// (如果不設此項,在傳送序列化物件時,當WEB服務預設的不是這種型別時可能拋java.io.EOFException)
// httpUrlConnection.setRequestProperty("Content-type",
// "application/x-java-serialized-object");
//   
httpUrlConnection
.setRequestProperty("Content-type", "application/json");

  // 設定請求的方法為"POST",預設是GET
httpUrlConnection.setRequestMethod("POST");

  try
{
// 連線,從上述至此的配置必須要在connect之前完成,
httpUrlConnection.connect();
httpUrlConnection.setConnectTimeout(1);
httpUrlConnection.setReadTimeout(1);
}
catch (ConnectException e1)
{
if (e1.getMessage().equals("Connection refused: connect"))
{
JOptionPane.showMessageDialog(null, "連線超時");
System.exit(0);
}
}
return httpUrlConnection;
}

 public static void main(String[] args)
{
if (checkMac("40-61-86-69-82-E2"))
{
System.out.println("mac地址校驗成功");
}
else
{
System.out.println("mac地址校驗失敗");
}
}
}

伺服器端:

checkMac.java

      public class CheckMac extends HttpServlet
{
private static final long serialVersionUID = 1L;
private String    returnstring  = "false";

 @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
InputStream inStream = req.getInputStream();
ObjectInputStream objInStream = new ObjectInputStream(inStream);
Object obj = null;
try
{
obj = objInStream.readObject();
}
catch (ClassNotFoundException e1)
{
e1.printStackTrace();
}
JSONObject json = null;
String mac = "";
JSONObject outjson = new JSONObject();
try
{
if (obj != null)
{
json = new JSONObject(obj.toString());
mac = json.getString("mac");

    if (mac.equals("40-61-86-69-82-E2"))
{
returnstring = "true";
}
}
}
catch (JSONException e)
{
e.printStackTrace();
}
try
{
outjson.put("returnstring", returnstring);
}
catch (JSONException e)
{
e.printStackTrace();
}
resp.setContentType("text/html;charset=utf-8");
OutputStream out = resp.getOutputStream();
ObjectOutputStream objOutputStrm = new ObjectOutputStream(out);
objOutputStrm.writeObject(outjson.toString());
objOutputStrm.flush();
objOutputStrm.close();
}

LoginValidate.java

private String    dept    = ""; // 部門
private String    name    = ""; // 姓名
private String    pass    = ""; // 密碼
private String    mac     = ""; // MAC地址
private String    ip     = ""; // IP地址
private String    sessionID   = "";

 @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
InputStream inStream = req.getInputStream();
ObjectInputStream objInStream = new ObjectInputStream(inStream);
Object obj = null;
try
{
obj = objInStream.readObject();
}
catch (ClassNotFoundException e1)
{
e1.printStackTrace();
}
JSONObject json = null;
JSONObject outjson = new JSONObject();
try
{
if (obj != null)
{
json = new JSONObject(obj.toString());
if (json != null)
{
dept = json.getString("dept");
name = json.getString("name");
pass = json.getString("pass");
mac = json.getString("mac");
ip = json.getString("ip");
}
}
}
catch (JSONException e)
{
e.printStackTrace();
}

  /**
* 判斷登陸資訊 登陸成功建立Session
*/
if (validateInfo())
{
//   HttpSession session = req.getSession(true);
//   sessionID = session.getId();
sessionID = "sessionid";
}
// 把sessionID放入JSON中
try
{
outjson.put("sessionID", sessionID);
}
catch (JSONException e)
{
e.printStackTrace();
}

  // 將sessionID以JSON方式傳送到客戶端
resp.setContentType("text/html;charset=utf-8");
OutputStream out = resp.getOutputStream();
ObjectOutputStream objOutputStrm = new ObjectOutputStream(out);
objOutputStrm.writeObject(outjson.toString());
objOutputStrm.flush();
objOutputStrm.close();
}

 /**
*校驗登陸資訊是否正確<br>
*<功能詳細描述><br>
*
* @return 正確返回true 否則返回false
*@see [類、類#方法、類#成員]
*/

 private boolean validateInfo()
{return true;
}

相關推薦

使用urlconnectionjson傳送post請求伺服器

客戶端: ****HttpURLConnection連線伺服器<br>*<功能詳細描述><br>*1、通過後臺得到sessionID<br>*2、檢查MAC地址是否正確<br>*3、處理從伺服器讀取的JSON物件<br>*4、從伺服器讀

Scrapy模擬表單Ajax傳送POST請求

scrapy.FormRequest 普通請求使用scrapy.Request類就可以實現,但是遇到模擬表單或Ajax提交post請求的時候,Request類就不如 子類 FormRequest類方便了,因為他自帶 formdata ,專門用來設定表單欄位資料

vue使用axios傳送post請求(data為json格式)

安裝axios cnpm install axios 在main.js中新增axios,此處注意axios外掛不同於其他,引用不能使用Vue.use();而是使用Vue.prototype.$axios = axios; import axios from '

前端js匯出,引數以json格式傳送post請求

前端菜鳥一個. 剛開始就ajax POST請求介面下載Excel, 但是狀態為200, 也不下載文件,也不報錯, 換了好幾種方式才知道ajax因為response流的原因不可以下載文件. 後參考了https://www.jb51.net/article/122797.htm  ,實現了功能 //冷汗 特此記錄

Linux--Shell指令碼逐行讀文字處理並curl傳送post請求json格式等問題

問題:Shell指令碼逐行讀取文字,字串分割,Curl傳送Post請求Json格式等相關問題 在linux中使用curl傳送一個post請求時,帶有json的資料,在傳送時發現json中的變數沒有解析出來: curl -d '{"Pin": "${line}"}' -H"

okhttp傳送post請求攜帶json資料,並接收json資料

okhttp工具類: package tools; import com.squareup.okhttp.*; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; /

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下:

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下: <form method="post"action="http://w.soh

Kettle將資料轉成JSON格式後通過restClient傳送POST請求

第一步:處理好自己的資料,然後轉成JSON格式,使用JSON Output控制元件,並且把要轉成JSON併發送出去的欄位和元素名稱的對映關係對應好 資料條目行數選擇不填,填數字將會按照填寫的數字拆分資料,會導致後面傳送POST請求變成一條一條傳,效率低下 輸出值outputVal

java傳送post請求json陣列形式

public static void dspDaoRu(DspNews dspNews) throws Exception {String result = "";// 新增url引數Map<String, Object> map = new HashMap<

Java傳送POST請求,引數為JSON格式,並接收返回JSON資料

/** * 傳送post請求 * @param url 路徑 * @param jsonObject 引數(json型別) * @param encoding 編碼格式 * @return * @throws P

java傳送post請求並傳json格式引數

/** * 傳送post請求 * @param url 路徑 * @param jsonObject 引數(json型別) * @param encoding 編碼格式 * @return * @throws P

soapUI傳送post請求json格式,返回請求資料為空

使用soupUI傳送post請求,活的結果告訴請求引數為空,意思就是沒有請求到body的內容,但是用postman等工具都是正常的。於是,檢視系統介面日誌。提示獲取http請求的body失敗。網上查詢第二句話,”java.nio.charset.MalformedInputE

linux shell中curl 傳送post請求json格式問題 【轉】

今天在linux中使用curl傳送一個post請求時,帶有json的資料,在傳送時發現json中的變數沒有解析出來 如下 curl -i -X POST -H 'Content-type':'application/json' -d {"BTime":""$bt

Python中request傳送post請求傳遞json引數的問題

昨天遇到了一個奇怪的問題,在Python中需要傳遞dict引數,利用json.dumps將dict轉為json格式用post方法發起請求:params = {"score":{"gt":"80", "lt":"90"}} request.post(url, json.dump

ExtJS傳送POST請求 引數格式為JSON

背景     這要從我比較懶說起。技術框架ExtJS + resteasy,預設請求方式是ajax get,這後臺方法就要寫很多@QueryParam來獲取引數。我比較喜歡前臺用ajax post請求,後臺方法引數就是一個map,所有前臺引數對映成map的key-val

如何使用webmagic傳送post請求,並解析傳回的JSON

1.分析頁面 看到引數有3個,分別是cbfy,pageno和pagesize。傳回來的資料是以json形式存在: 2.json的解析方法 webmagic-extension包中提供了

Python 中request以json形式傳送post請求

一個http請求包括三個部分,為別為請求行,請求報頭,訊息主體,類似以下這樣: 請求行 請求報頭 訊息主體 以json串提交資料,編碼格式:application/json 舉例如下: 可以將一json串傳給requests.post()的data引數 #

.netcore持續整合測試篇之Xunit結合netcore記憶體伺服器傳送post請求

系列目錄 .net core整合測試之Post請求 Web專案中,很多與使用者資料互動的請求都是Post請求,想必大家都用過HttpClient構造過post請求,這裡並不對HttpClient做詳細介紹,只介紹一些常用的功能.並結合AutoFixture演示如何自動構造請求資料,簡單手動建立Json或者

Java學習--HttpURLConnection傳送post請求

import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; /**

axios傳送post請求返回400狀態碼

今天在用 axios 傳送一個跨域的post請求時,遇到了一個坑:Uncaught (in promise) Error: Request failed with status code 400。 前臺程式碼如下: axios({ method: "post", u