HttpClient使用指南——POST請求
1.創建一個請求客戶端:HttpClients.createDefault(),用來實際發起調用post請求,可以類比成瀏覽器。
2.組裝表單請求數據:因需要傳遞文件,所以通過 MultipartEntityBuilder 構造器組裝表單實體請求數據。
2.1 設置mode為 HttpMultipartMode.RFC6532 (必須);
2.2 設置字符集為UTF-8(必須);
2.3 通過 addBinaryBody 追加文件;
2.4 通過 addTextBody 追加文本參數,若文本為中文則必須指定字符集為GBK或者UTF-8。
3.創建一個post請求:通過請求構造器 RequestBuilder 的post方法構造一個post請求,通過 tEntity 方法向post請求里放置請求參數,通過addHeader方法向post請求里追加請求頭信息,請求頭信息比如雙方約定的token,通過build方法返回請求對象。
4.發起post請求并獲得響應:通過請求客戶端的execute方法執行請求并獲得返回值請求響應。
5.獲取響應結果:獲取響應對象的實體HttpEntity,通過 EntityUtils 的 toString 方法將實體轉成字符串,這里一般還要指定字符集,尤其是當實體里沒有指定字符集時。
注意 : MultipartEntityBuilder 必須指定 mode 為 HttpMultipartMode.RFC6532 ,且必須設置字符集為 UTF-8 , 否則若傳遞的文件名包含中文,則 文件名亂碼 ;對于普通的文本參數,中文指定UTF-8或者GBK接收方均未發現亂碼情況; 接收方 需要將請求轉為 MultipartHttpServetRequest 方可獲取到文件,示例代碼如下:
怎么用httpclient發送post請求
有時候我們在發送HTTP請求的時候會使用到POST方式,如果是傳送普通的表單數據那將很方便,直接將參數到一個Key-value形式的Map
中即可。但是如果我們需要傳送的參數是Json格式的,會稍微有點麻煩,我們可以使用HttpClient類庫提供的功能來實現這個需求。假設我們需要發
送的數據是:
{
"blog": "http://www.iteblog.com",
"Author": "iteblog"
}
我們可以通過JSONObject夠著Json:
JSONObject jsonObject = new JSONObject();
jsonObject.put("blog", "http://www.iteblog.com");
jsonObject.put("Author", "iteblog");
如果需要使用Post方式來發送這個數據,我們可以如下實現:
private HttpMethodBa createMethod(String url, int timeout) {
PostMethod method = null;
try {
method = new PostMethod(url);
JSONObject jsonObject = new JSONObject();
jsonObject.put("blog", "http://www.iteblog.com");
jsonObject.put("Author", "iteblog");
String transJson = jsonObject.toString();
RequestEntity = new StringRequestEntity(transJson, "application/json", "UTF-8");
method.tRequestEntity();
//使用系統提供的默認的恢復策略
method.getParams().tParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
//設置超時的時間
method.getParams().tParameter(HttpMethodParams.SO_TIMEOUT, timeout);
} catch (IllegalArgumentException e) {
logger.error("非法的URL:{}", url);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return method;
}
我們通過StringRequestEntity來構造請求實體,在這里,StringRequestEntity將接收三個參數,如下:
public StringRequestEntity(String content, String contentType, String chart)
throws UnsupportedEncodingException
其中參數content就是我們需要傳輸的數據;contentType是傳送數據的格式,因為我們的數據格式是json的,所以contentType必須填寫application/json(更多的contentType可以參見《HTTP Content-Type常用一覽表》);chart是字符集編碼。
然后我們再通過HttpClient對象的executeMethod方法來執行:
int statusCode = httpClient.executeMethod(getMethod);
//只要在獲取源碼中,服務器返回的不是200代碼,則統一認為抓取源碼失敗,返回null。
if (statusCode != HttpStatus.SC_OK) {
logger.error("Method failed: " + getMethod.getStatusLine() + "\tstatusCode: " + statusCode);
return null;
}
pom.xml文件的關鍵內容
<dependencies>
<!--網絡爬蟲-->
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.1</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
</dependency>
</dependencies>
C#怎么使用HttpClient來Post數據
對HttpWebRespon獲取的HTML進行文字編碼轉換,使之不會出現亂碼; 自動在Session間保持Cookie,Referer等相關信息; 模擬HTML表單提交; 向服務器上傳文件; 對二進制的資源,直接獲取返回的字節數組(byte[]),或者保存為文件 為了解決這些問題,我開發了HttpClient類.下面是使用的方法: 獲取編碼轉換后的字符串 HttpClient client=new HttpClient(url); string html=client.GetString(); GetString()函數內部會查找Http Headers, 以及HTML的Meta標簽,試圖找出獲取的內容的編碼信息.如果都找不到,它會使用client.DefaultEncoding, 這個屬性默認為utf-8, 也可以手動設置. 自動保持Cookie, Referer HttpClient client=new HttpClient(url1, null, true); string html1=client.GetString(); client.Url=url2; string html2=client.GetString(); 這里HttpClient的第三個參數,keepContext設置為真時,HttpClient會自動記錄每次交互時服務器對Cookies進行的操作,同時會以前一次請求的Url為Referer.在這個例子里,獲取html2時,會把url1作為Referer, 同時會向服務器傳遞在獲取html1時服務器設置的Cookies. 當然,你也可以在構造HttpClient時直接提供第一次請求要發出的Cookies與Referer: HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true); 或者,在使用過程中隨時修改這些信息: client.Context.Cookies=cookies; client.Context.referer=referer; 模擬HTML表單提交 HttpClient client=new HttpClient(url); client.PostingData.Add(fieldName1, filedValue1); client.PostingData.Add(fieldName2, fieldValue2); string html=client.GetString(); 上面的代碼相當于提交了一個有兩個input的表單. 在PostingData非空,或者附加了要上傳的文件時(請看下面的上傳和文件), HttpClient會自動把HttpVerb改成POST, 并將相應的信息附加到Request上. 向服務器上傳文件 HttpClient client=new HttpClient(url); client.AttachFile(fileName, fieldName); client.AttachFile(byteArray, fileName, fieldName); string html=client.GetString(); 這里面的fieldName相當于<input type="file" name="fieldName" />里的fieldName. fileName當然就是你想要上傳的文件路徑了. 你也可以直接提供一個byte[] 作為文件內容, 但即使如此,你也必須提供一個文件名,以滿足HTTP規范的要求. 不同的返回形式 字符串: string html = client.GetString(); 流: Stream stream = client.GetStream(); 字節數組: byte[] data = client.GetBytes(); 保存到文件: client.SaveAsFile(fileName); 或者,你也可以直接操作HttpWebRespon: HttpWebRespon res = client.GetRespon(); 每調用一次上述任何一個方法,都會導致發出一個HTTP Request, 也就是說,你不能同時得到某個Respon的兩種返回形式. 另外,調用后它們任意一個之后,你可以通過client.ResponHeaders來獲取服務器返回的HTTP頭. 下載資源的指定部分(用于斷點續傳,多線程下載) HttpClient client=new HttpClient(url); //發出HEAD請求,獲取資源長度 int length=client.HeadContentLength(); //只獲取后一半內容 client.StartPoint=length/2; byte[] data=client.GetBytes(); HeadContentLength()只會發出HTTP HEAD請求.根據HTTP協議, HEAD與GET的作用等同, 但是,只返回HTTP頭,而不返回資源主體內容. 也就是說,用這個方法,你沒法獲取一個需要通過POST才能得到的資源的長度,如果你確實有這樣的需求,建議你可以通過GetRespon(),然后從ResponHeader里獲取Content-Length.
httpclient中post參數設置
// post Sent cookie 這個Post 發送去的Cookie
HttpPost httpPost = new HttpPost(uri)
httpPost.addHeader("Cookie", "ONE_VER=1_0");
//下面是發送的實體內容。發出去的是被轉義的內容,如果是不轉義發送,我也不知道怎么發,請高手指教。
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("實體內容", ""));
//下面是返回內容
CloableHttpRespon respon = httpclient.execute(httpPost);
try{
//要運行內容,如果要處理接收的內容,請在這里寫。
} finally {
respon.clo();
}
C#怎么使用HttpClient來Post數據
public static string PostRequest(string url, Encoding encoding, Dictionary<string, object> input = null)
{
var request = WebRequest.Create(new Uri(url));
request.Method = System.Net.WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
if (input != null)
{
var builder = new StringBuilder();
foreach (var item in input)
{
var value = HttpUtility.UrlEncode(item.Value.ToString(), encoding);
builder.AppendFormat("{0}={1}&", item.Key, value);
}
var bytesForArray = encoding.GetBytes(builder.ToString());
request.ContentLength = bytesForArray.Length;
var stream = request.GetRequestStream();
stream.Write(bytesForArray, 0, bytesForArray.Length);
stream.Clo();
}
var respon = request.GetRespon();
var list = new List<byte>();
var buffer = new byte[1024];
int len = 0;
var rStream = respon.GetResponStream();
while ((len = rStream.Read(buffer, 0, buffer.Length)) > 0)
{
list.AddRange(buffer.Take(len));
}
respon.Clo();
return encoding.GetString(list.ToArray());
}
如何使用httpclient進行post請求
http請求傳遞的都是字符串。這種情況一般使用xml為信息載體。把java類轉成xml, client得到xml再轉成java類。 UrDTO ur = new UrDTO(); ...//填充ur XStream xstream = new XStream();//使用xstream轉換pojo和xml字符串 // HttpPost連接...