HttpClient获取数据
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。如果只是需要向Web站点的某个简单页面提交请求并获取服务器响应,HttpURLConnection完全可以胜任。但在绝大部分情况下,Web站点的网页可能没这么简单,这些页面并不是通过一个简单的URL就可访问的,可能需要用户登录而且具有相应的权限才可访问该页面。在这种情况下,就需要涉及Session、Cookie的处理了,如果打算使用HttpURLConnection来处理这些细节,当然也是可能实现的,只是处理起来难度就大了。
为了更好地处理向Web站点请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。但不会缓存服务器的响应,不能执行HTML页面中嵌入的Javascript代码;也不会对页面内容进行任何解析、处理。
简单来说,HttpClient就是一个增强版的HttpURLConnection,HttpURLConnection可以做的事情HttpClient全部可以做;HttpURLConnection没有提供的有些功能,HttpClient也提供了,但它只是关注于如何发送请求、接收响应,以及管理HTTP连接。
HttpClient的使用
使用HttpClient发送请求、接收响应很简单,只要如下几步即可。
1.创建HttpClient对象。
2.如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4.调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
HttpGet方式获取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import java.io.IOException; public class HttpClientTest { public static void main(String[] args) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); RequestConfig config = RequestConfig.custom() .setConnectTimeout( 60000 ) .setConnectionRequestTimeout( 60000 ) .setSocketTimeout( 60000 ) .build(); HttpGet httpGet = new HttpGet( "https://baike.baidu.com/item/httpclient/5766483?fr=aladdin" ); httpGet.setConfig(config); CloseableHttpResponse response = null ; try { //执行httpGet请求 response = httpClient.execute(httpGet); System.out.println(response.getStatusLine().getStatusCode()); //获取响应实体 HttpEntity httpEntity = response.getEntity(); if (httpEntity != null ) { System.out.println( "长度:\t" + httpEntity.getContentLength()); System.out.println( "内容:\t" + EntityUtils.toString(httpEntity, "UTF-8" )); } } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
HttpPost方式获取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | @Test public void httpPost(){ CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpPost post = new HttpPost( "http://localhost:8080/Servlet/do_login.do" ); //设置post请求传递参数 List<NameValuePair> list = new ArrayList<>(); list.add( new BasicNameValuePair( "username" , "test" ) ); list.add( new BasicNameValuePair( "password" , "admin" )); try { UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list); post.setEntity(entity); } catch (Exception e){ e.printStackTrace(); } //执行请求并处理响应 try { CloseableHttpResponse response = httpClient.execute(post); HttpEntity httpEntity = response.getEntity(); if (httpEntity!= null ){ System.out.println(EntityUtils.toString(httpEntity, "UTF-8" )); } response.close(); } catch (Exception e){ e.printStackTrace(); } finally { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步