java中處理header請求以及跟cookie相關的一些細節
來自: 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¶m2=%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中保留
一項。如果你連header都不需要,發起一個get請求甚至可以簡化成這樣:Accept-Charset
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(); // ...