httpclient发送post请求(参数json)模拟登陆记录

创建httpclient的方式:
1. HttpClient client = new HttpClient();
2. CloseableHttpClient httpclient = HttpClients.createDefault();

maven管理所需jar包

<dependency>
      <groupId>org.apache.httpcomponentsgroupId>
      <artifactId>httpclientartifactId>
      <version>4.5.2version>
    dependency>

问题发现:当使用此jar包的时候发现使用第一种方式创建httpclient的时候创建出一大堆东西,很恐怖。。。。

查阅资料发现使用 commons-httpclient版本可以用第一种方式去创建httpclient,而不会出现很多东西出来。
而使用httpclient的jar包就只能用第二中方式去创建httpclient

推荐使用第二中方式进行创建,原因是因为commons-httpclient不再提供更新和开发,意思就是被抛弃了。。。。


补充:@RequestParam, @RequestBody
在接口的参数中,我们经常看到这两个注释,或许知道怎么用,但是说不出个所以然来 对吧~

@RequestParam

  1. 尝尝使用此注解来处理简单类型的绑定,次注解使用的是request.getParameter()的方式去获取参数,所以它可以用在get、post请求中
  2. 用来处理请求信息中的Content-Type为application/x-www-form-urlencoded编码的内容。

    @RequestBody

  3. 次注解用来处理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 headers = new HashMap();
        //接收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 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请求,同时还模拟了一下登陆过程。。。后续加强学习给大家一个好一些的教程

你可能感兴趣的:(Java基础知识)