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连接...