一、什么是httpclient
超文本传输协议(HTTP)可能是当今Internet上使用的最重要的协议。Web服务,支持网络的设备和网络计算的增长继续将HTTP协议的作用扩展到用户驱动的Web浏览器之外,同时增加了需要HTTP支持的应用程序的数量。
尽管java.net软件包提供了用于通过HTTP访问资源的基本功能,但它并未提供许多应用程序所需的全部灵活性或功能。HttpClient试图通过提供高效,最新且功能丰富的程序包来实现此空白,以实现最新HTTP标准和建议的客户端。
HttpClient是为扩展而设计的,同时提供了对基本HTTP协议的强大支持,对于构建HTTP感知的客户端应用程序(例如Web浏览器,Web服务客户端或利用或扩展HTTP协议进行分布式通信的系统)的任何人来说,HttpClient都可能会感兴趣。
HttpClient不是浏览器。它是一个HTTP通信库,因此它仅提供通用浏览器应用程序期望的功能子集。
最根本的区别是HttpClient中没有用户界面,不执行js脚本。浏览器需要显示页面,并解释用户输入,例如在显示页面上某处的鼠标单击。有一个布局引擎可以计算应如何显示HTML页面,包括级联样式表和图像。JavaScript解释器运行嵌入在HTML页面中或从HTML页面引用的JavaScript代码。
HttpClient也完全与内容无关。它可以传输消息内容,但是无法以任何方式呈现或处理它。
另一个主要区别是对错误输入或违反HTTP标准的容忍度。必须对无效的用户输入具有容忍性,以使浏览器易于使用。还需要容忍从服务器检索到的格式错误的文档,以及执行协议时服务器行为的缺陷,以使用户能够访问尽可能多的网站。但是,HttpClient努力遵守HTTP标准规范和相关标准,并且尽可能默认。它还提供了放松与非兼容HTTP源或代理服务器兼容所允许或要求的,由规范施加的某些限制的方法。
二、httpclient中获取服务器端设置的cookie
cookie是从HttpContext中获取的,需要执行httpClient的带httpcontext参数的请求方法。
//---s 创建请求
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
);
//请求配置
RequestConfig reqConfig = RequestConfig
.custom()
.setConnectionRequestTimeout(-1)//从连接池阻塞的时限-永久阻塞
.setConnectTimeout(8000) // 设置连接超时时间
.setSocketTimeout(8000) // 设置读取超时时间
.setExpectContinueEnabled(false)
.setCircularRedirectsAllowed(true) // 允许多次重定向
.setCookieSpec(CookieSpecs.STANDARD_STRICT )
.build();
httpGet.setConfig(reqConfig);
//---e 创建请求
//---创建httpcontext
HttpClientContext context = HttpClientContext.create();
//---s 执行请求
try {
String respBody = httpClient.execute(httpGet,new ResponseHandler() {
@Override
public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
System.out.println("响应状态码=" + status);
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity,"utf-8") : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
}
},context);
System.out.println("响应内容=" + respBody);
//通过context获取cookieStore
CookieStore cookieStore = context.getCookieStore();
// 获取cookies信息
List cookies = cookieStore.getCookies();
if(cookies.size()==0) {
System.err.println("=========无cookie=========");
}
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
String domain = cookie.getDomain();
String path = cookie.getPath();
SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = cookie.getExpiryDate();
System.out.println("cookies: key= "+ name + " value= " + value +" domain="+domain +" path="+path+" 过期时间"+sdf1.format(date));
}
} catch (Exception e) {
e.printStackTrace();
}
//---e 执行请求
如若转载,请注明出处:https://www.javaidea.cn/article/8162.html