1. 程式人生 > >java實現HTTP的post請求 key-value格式與json格式的區別

java實現HTTP的post請求 key-value格式與json格式的區別

之前寫過介面接收json格式的post請求,當時自己寫完以為可以適應各種報文的傳送,最近對方說要有個”content=傳送內容”,這不就是最簡單的post請求嗎,那直接用我之前寫的http://blog.csdn.net/do_finsh/article/details/70237544傳送方法加上“content=“不就可以了,結果對方說沒有content,後來網上找的很多方法都可以成功,為什麼我之前寫的不行,之後改了行程式碼就可以了。先說明改了哪行程式碼,再探究一下為什麼。

/**
     * 向指定URL傳送post方法的請求,字串
     * @param urlString 地址
     * @param
reqString 請求引數 name1=value1&name2=value2 的形式。 * @return String 返回內容 */
public static String postString(String urlString ,String reqString) { StringBuffer sb = new StringBuffer(""); try { // 建立連線 URL url = new URL(urlString); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"
); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setInstanceFollowRedirects(true); //下邊這行註釋掉 /***connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");** */
connection.connect(); DataOutputStream out = new DataOutputStream( connection.getOutputStream()); out.write(reqString.getBytes("UTF-8")); out.flush(); out.close(); // 讀取響應 BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream(),"utf-8")); String lines; while ((lines = reader.readLine()) != null) { sb.append(lines); } reader.close(); // 斷開連線 connection.disconnect(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (sb.toString().length()==0|sb.toString().trim().length()==0) { return ""; } return sb.toString(); }

只改變了一行程式碼,就相當於兩種傳輸格式了。下面分析一下Content-Type不同的影響
application/json
application/json 用來告訴服務端訊息主體是序列化後的 JSON 字串。
JSON 格式支援比鍵值對複雜得多的結構化資料,但是如果在這種格式下用到key—value形式,接收方就接收不到value,因為本人小白,其實不懂這之間的本質,只能多測試幾次,首先傳輸json格式的報文,傳輸之後解析成功,傳輸非json格式的報文的話,其實也可以接收到報文的整體內容,那麼可能不是application/json 的影響,看下邊這種格式,

application/x-www-form-urlencoded
常見的 POST 提交資料的方式。瀏覽器的原生 form 表單,如果不設定 enctype 屬性,以及 ajax 提交資料那麼最終就會以 application/x-www-form-urlencoded 方式提交資料。我們只看資料通過post請求介面提交資料,按照key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。例:
從別人那裡拿了張圖
第一部分 請求行,請求方法 post
第二部分 請求頭部 Content-Type: application/x-www-form-urlencoded
Content-Length: 38
一個空行
第三部分 請求的資料 經過URLEncoder.encode的資料
區別就應該在第三部分的處理形式,application/json形式的傳輸沒有第三部分的處理