创建httpclient的方式:
1. HttpClient client = new HttpClient();
2. CloseableHttpClient httpclient = HttpClients.createDefault();
maven管理所需jar包
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
问题发现:当使用此jar包的时候发现使用第一种方式创建httpclient的时候创建出一大堆东西,很恐怖。。。。
查阅资料发现使用 commons-httpclient版本可以用第一种方式去创建httpclient,而不会出现很多东西出来。
而使用httpclient的jar包就只能用第二中方式去创建httpclient
推荐使用第二中方式进行创建,原因是因为commons-httpclient不再提供更新和开发,意思就是被抛弃了。。。。
补充:@RequestParam, @RequestBody
在接口的参数中,我们经常看到这两个注释,或许知道怎么用,但是说不出个所以然来 对吧~
@RequestParam
- 尝尝使用此注解来处理简单类型的绑定,次注解使用的是request.getParameter()的方式去获取参数,所以它可以用在get、post请求中
用来处理请求信息中的Content-Type为application/x-www-form-urlencoded编码的内容。
@RequestBody
次注解用来处理Content-type:(看清楚!!!)不不不不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
进入正题牛刀小试:为了大家留言问要导入什么什么包,我直接将所有的贴出吧。也不一定能回复的到。具体解释看注释
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.Consts;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
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.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import net.sf.json.JSONObject;
/**
* 功能描述:创建一个登陆的线程,此线程用于登陆测试系统
* @author:yqh
* @date:2018年4月11日
*/
public class Login implements Runnable{
@Override
public void run() {
CloseableHttpClient httpClient = HttpClients.createDefault();
//不想暴露自己的接口了,各位自己写一个接口直接使用吧
HttpPost httpPost = new HttpPost("******************");
HttpClientBuilder httpConfig = HttpClientBuilder.create().setDefaultRequestConfig(RequestConfig.custom()
.setConnectionRequestTimeout(30000)
.setSocketTimeout(30000)
.setConnectTimeout(30000).build()).setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
//拼httpPost的头信息
HashMap<String, String> headers = new HashMap<String,String>();
//接收application/json等类型的数据
headers.put("Accept","application/json, text/plain, */*");
headers.put("Accept-Encoding","gzip, deflate");
headers.put("Accept-Language","zh-CN,zh;q=0.9");
headers.put("Connection","keep-alive");
//application/json 说明需要穿json数据,所以设置参数的时候要用json格式的数据
headers.put("Content-Type","application/json;charset=UTF-8");
headers.put("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5024.400 QQBrowser/10.0.932.400");
for (Map.Entry<String, String> entry : headers.entrySet()) {
httpPost.setHeader(entry.getKey(), entry.getValue());
}
JSONObject jsonParam = new JSONObject();
//如果需要模拟登陆其他网站的话,要先下载验证码图片,而且一般网站都会将生成的内容存入session中,如果直接打开网页看验证码输入到此处是行不通的,此方式只能自己模拟简单的实现过程,别踩我。。。。各位大佬
jsonParam.put("checkCode", "1234");
jsonParam.put("password", "1q2w3e4r");
jsonParam.put("username", "qhyu");
StringEntity entity = new StringEntity(jsonParam.toString(),Consts.UTF_8);
httpPost.setEntity(entity);
httpClient = httpConfig.build();
try {
CloseableHttpResponse response = httpClient.execute(httpPost);
int code = response.getStatusLine().getStatusCode();
//如果返回两百,皆大欢喜
if(HttpStatus.SC_OK == code){
System.out.println(EntityUtils.toString(response.getEntity(), Consts.UTF_8));
}else{
System.out.println("出错了!! "+EntityUtils.toString(response.getEntity(), Consts.UTF_8));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Login login = new Login();
Thread thread = new Thread(login);
thread.start();
}
}
到此就实现了httpclient发送post请求,同时还模拟了一下登陆过程。。。后续加强学习给大家一个好一些的教程