Java利用HttpClient模拟POST表单操作应用及注意事项
前言
在实现Java程序中模拟POST表单操作时,HttpClient是一个非常常用的工具。本文将介绍HttpClient的基本使用方法,以及在模拟POST表单操作时需要注意的一些细节。
HttpClient是什么
HttpClient是一个基于Http协议的开源库,可以通过HttpClient模拟Http请求,实现Http客户端程序的编写。它提供了强大的访问和支持Http请求。
模拟POST表单操作
基本方法
下面是一个基本的模拟POST表单操作的例子:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpPostForm {
public static void main(String[] args) {
String url = "http://localhost:8080/test/postForm";
String json = "{\"name\":\"test\",\"age\":\"25\"}";
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(json, "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
CloseableHttpResponse response = null;
try {
response = httpclient.execute(httpPost);
String result = EntityUtils.toString(response.getEntity(), "utf-8");
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (response != null) {
response.close();
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
其中,涉及到的类和方法含义如下:
-
CloseableHttpClient:HttpClient实例,可以通过静态方法HttpClients.createDefault()获取。
-
HttpPost:HTTP POST请求。
-
StringEntity:请求的实体,包含需提交的参数信息等。
-
CloseableHttpResponse:请求响应。
-
EntityUtils:一些与HTTP实体相关的工具方法。
模拟header信息
有时候在提交POST请求时,需要模拟HTTP头信息,以便服务器能够正确处理请求。下面是一个模拟HTTP头信息的例子:
import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class HttpPostHeader {
public static void main(String[] args) {
String url = "http://localhost:8080/test/postForm";
String json = "{\"name\":\"test\",\"age\":\"25\"}";
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(json, "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);
httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
httpPost.addHeader("Accept-Encoding", "gzip, deflate, sdch");
httpPost.addHeader("Accept-Language", "zh-CN,zh;q=0.8");
httpPost.addHeader("Connection", "keep-alive");
httpPost.addHeader("Cache-Control", "max-age=0");
httpPost.addHeader("Referer", "http://www.baidu.com/");
HttpResponse response = null;
try {
HttpClientContext context = HttpClientContext.create();
response = httpclient.execute(httpPost, context);
HttpEntity result = response.getEntity();
Header[] heads = response.getAllHeaders();
System.out.println(result.getContentEncoding());
System.out.println(result.getContentType());
System.out.println(EntityUtils.toString(result, "utf-8"));
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (response != null) {
EntityUtils.consume(response.getEntity());
}
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
其中,需要注意以下几点:
-
addHeader:设置HTTP头信息。
-
HttpClientContext:HttpClient执行上下文对象。
-
HttpResponse:HTTP响应对象。
-
getAllHeaders:获取所有头信息。
注意事项
在使用HttpClient模拟POST表单操作时,需要注意以下几点:
-
请求参数的编码:content encoding应该和mime type中的字符集一致。
-
请求参数的类型:如果是传输JSON格式的数据,mime type应该为"application/json"。
-
请求头信息的设置:有时候需要模拟HTTP头信息,以便服务器能够正确处理请求。
-
HttpClient为空的情况:在请求结束后,一定要及时关闭HttpResponse和HttpClient,否则会占用系统资源。
-
同步与异步请求:同步请求会阻塞主线程,造成用户体验不佳,建议使用异步请求方式。
总结
本文简单介绍了HttpClient模拟POST表单操作的基本使用方法和注意事项。HttpClient可以很方便地模拟Http请求,然而在使用时需要注意请求参数编码、请求参数类型、请求头信息的设置、HttpClient为空的情况等,这些都是开发人员需要注意的点。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java利用HttpClient模拟POST表单操作应用及注意事项 - Python技术站