HttpClient背景
-
掌握HttpClient后,相信对于Http协议的了解会更加深入。
org.apache.commons.httpclient.HttpClient与org.apache.http.client.HttpClient的区别
-
Commons的HttpClient项目不再被开发
-
Apache HttpComponents项目HttpClient和HttpCore模组,提供更好的性能和更大的灵活性。
使用HttpClient发送请求、接收响应过程
-
创建HttpClient对象--->关注接口是否需要带cookie值去请求。如果不需要则直接build即可
/*不需要带cookie*/
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
/*带cookie*/
CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
//再创建客户端的时候就已经带了cookie去创建对象
//这里涉及到的是Http请求和TCP连接的内容,之前的博客已经有所说明
-
创建请求方法实例--->指定URL--->如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
HttpPost httpPost = new HttpPost(url);
-
创建请求参数
-
调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;
-
HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
-
//先创造容器存放参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
/*
这个NameValuePair是一个接口,里面提供了两个抽象方法:
getName
getValue
这是一个设计模式
*/
//实例化BasicNameValuePair类的引用--->注意这个构造器
NameValuePair nameValuePair = new BasicNameValuePair("", "");
/*
构造器里面有两个传参:
1、传递两个String的值
2、第一个String会调用args类里面的notNull方法,重新创建源码。该方法会判断传参,如果传参不为空就返回参数本身。如果传参为空返回提示语
3、构造器对于第二个String是直接返回该值
所以再BasicNameValuePair实例化下传递需要的参数的key和value
*/
//将创建好的参数放入到容器中
params.add(nameValuePair);
-
调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
//传参的第一步是将参数拼接成完整的内容--->使用JSON(alibaba的包)下的toJSONString方法,将容器对象转为字符串--->该方法传入一个Object根类对象,返回一个String值
String jsonString = JSON.toJSONString(params);
//再调用String实体类将字符串转为实体字符串引用
/*
这个类的构造器传入两个字符量:
1、字符串
2、字符集编码
字符集编码会将传入的字符串参数转为另一个编码参数--->源码内部调用了很多东西,这里不做展开
*/
StringEntity stringEntity = new StringEntity(jsonString, "UTF-8");
//调用HttpClient类的setEntity方法设置传参实体--->这个方法的形参是传入一个Http实体,返回传入的实体对象
httpPost.setEntity(stringEntity);
//调用HttpClient类下的setHeader方法设置Content-Type的类型--->这个方法传递两个形参字符串的值
/*
第一个字符串会调用IDEA的方法判断是否为空,不为空返回一个值
第二个字符串会调用内部的updateHeader去将第二个字符串的内容添加到headers后面
一个key-value的底层实现
*/
//调用execute方法发送本次请求
httpClient.execute(httpPost);
//这样就发送了本次httpPost请求
-
调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;
-
调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
-
//创建响应模型
CloseableHttpResponse response = null;
//新建一个HttpEntity接口的引用对象,该接口可以调用相应模型中的getContentType方法,该方法返回一个HttpEntity值
HttpEntity responseEntity = response.getEntity();
//这样就拿到的响应的实体
//接下来的处理就是调用HttpEntity类下提供的方法获取实体的内容
System.out.println("响应状态为:" + responseEntity.getContentLength());
//判断
if (responseEntity!=null){
System.out.println("响应内容长度为:" + responseEntity.getContentLength());
System.out.println("响应内容为:" + EntityUtils.toString(responseEntity));
}
完整的请求代码
package OmsOrdersPullInterface;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
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.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 测试订单拉取接口问题
* @since JDK 1.8
* @date 2021/07/16
* @author Lucifer
*/
public class omsOrdersPullInterface {
/*
Content-Type:x-www-form-urlencoded
*/
//定义接口地址
private static final String Url = "http://oms.spocoo.com/v1/orders/index/pull.html";
//Cookie值
public static String Cookie = "is_show_search=1;" +
"_ati=5995140554762;" +
"_ga=GA1.2.69664751.1620351776;" +
"users=Pe5XXPUBxTPbVMlNcrItqq8zw_TdG4XMPUyhT-eKh2J7lD45f7Bj17mkI01TgmSMZ2yS41_avK_7p4xPF6q77hmtzhNs_DzeTLMZpndc0_mIgvJbbEt_idqAzXU8luW9sypFYV_dx9PSktF4Pt2Vc0_y-nHWmCf_JdhwInPiqF3Agit6XwQ7T-n1rbQnvjJyIFU1kTqcMlE698Y5qD4um6IZq4ZaBceHJHCrsFkj9Yds5E-Mjt843kEJapHyVAtj2FwZWs7uupVj4BlpWpQWHXKCaskGp0cyLbRQk4RJSYFqzOpghyidiU4hau2X5pRA16u5KKPvWxsHcOOp6egYL3lvG3wVqlyXsTHdX4DLatu6YJZuAqSoZiwrNndYRNt2GD7hUspoF-EoSR9LiCBhoQ;" +
"think_var=zh-cn;" +
"PHPSESSID=d948c1d3f915007cea083937eeeed29c";
/**
*用HttpClient类下的方法创建POST请求demo
* Content-Type:x-www-form-urlencoded
*/
public static void doPostPullOrders(String url){
//创建Cookie存储
CookieStore cookieStore = new BasicCookieStore();
//设置Cookie值
BasicClientCookie cookie = new BasicClientCookie("Cookie", Cookie);
cookie.setDomain("oms.spocoo.com");
cookie.setPath("/");
//将Cookie放入cookie存储中
cookieStore.addCookie(cookie);
//使用HttpClient创建客户端
CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
//创建httppost类引用
HttpPost httpPost = new HttpPost(url);
/*这个httpPost既是我们的表单,创建表单参数*/
List<NameValuePair> params = new ArrayList