java中處理header請求以及跟cookie相關的一些細節

mu_wangyue 8年前發布 | 5K 次閱讀 Java開發

來自: http://www.jcodecraeer.com//a/anzhuokaifa/androidkaifa/2014/0402/1610.html


服務端是否在cookie中返回phpsessionid取決于處理該頁面請求的腳本是否調用了session_start(),不管是服務端返回cookie給客戶端,還是客戶端返回cookie給服務端,都是在header中保存的,而header的本質其實是幾行用冒號:分割的鍵值對。如下的get請求:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Cookie:bdshare_firstime=1394693898320; Hm_lvt_2f2ac530df20294f718580cea710780e=1396330354,1396332063,1396332065,1396402453; Hm_lpvt_2f2ac530df20294f718580cea710780e=1396404308
Host:jcodecraeer.com
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36

上面的請求頭中,我們可以看到cookie不同變量之間是用分號間隔的,沒有包含phpsessionid。在某些處理http協議的java包中,可以看到對header的生成提供了專門的方法,類似于addHeader()這樣的,有的還封裝了專門針對cookie的方法,搞得好像cookie和header是兩碼事,我在用org.apache.http的時候都被搞暈了。http協議很簡單,能放數據的地方真的不多,那些額外的數據幾乎都是放在header中。

所以我還是覺得在使用那些看似方便的包之前還是從最基礎的java.net.HttpURLConnection來實現http聯網操作。

使用java.net


使用java.net一般只需引入兩個類就可以了:

import java.net.HttpURLConnection;
import java.net.URL;

準備

首先你需要一個url,以及字符集charset,url后面的參數為可選的。如下在代碼中先定義url、字符集以及由兩個參數param1,param2組成的查詢參數。

String url = "http://example.com";
String charset = "UTF-8";
String param1 = "value1";
String param2 = "value2";
// ...
String query = String.format("param1=%s&param2=%s",
     URLEncoder.encode(param1, charset),
     URLEncoder.encode(param2, charset));

 

查詢參數都是有name=value這種形式組成的不同的name=value
之間用&分割。參數可以用 URL-encode指定字符集,

發起一個get請求

代碼如下:

URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...

在url與查詢條件之間需要用‘?’連接請求頭Accept-Charset暗示服務器傳入的參數是何種字符集,如果你根本沒有參數,可以不用在header中保留Accept-Charset一項。如果你連header都不需要,發起一個get請求甚至可以簡化成這樣:

InputStream response = new URL(url).openStream();
// ...

實際上發出get請求我們還需要指定method為get

connection.setRequestMethod("GET");

但是默認請求就是get的因此上面那行代碼也可以不要。

發起post請求

URLConnection#setDoOutput()設置為true則意味著請求是post的,即使調用了

connection.setRequestMethod("GET");

setDoOutput(true)會使setRequestMethod("GET")無效。

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); // Triggers POST.
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = connection.getOutputStream();
try {
     output.write(query.getBytes(charset));
} finally {
     try { output.close(); } catch (IOException logOrIgnore) {}
}
InputStream response = connection.getInputStream();
// ...

 

 本文由用戶 mu_wangyue 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!