• 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方式获取数据

    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("长度:	" + httpEntity.getContentLength());
                    System.out.println("内容:	" + EntityUtils.toString(httpEntity,"UTF-8"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    response.close();
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    HttpPost方式获取数据

    @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();
                }
            }
        }
    

      

     

  • 相关阅读:
    玩转oracle学习第五天
    硅谷科技巨头最刁钻面试题集锦
    Python模拟登录wap版百度贴吧+自己主动回贴
    Flask 源代码阅读笔记
    Spark1.0.0 生态圈一览
    listView.getChildAt(i)时java.lang.NullPointerException
    选择排序
    JNI 系统钩子
    MySQL Cluster2个数据节点压力测试--mysqlslap工具压400W写
    VVDocumenter
  • 原文地址:https://www.cnblogs.com/shirandedan/p/8423521.html
Copyright © 2020-2023  润新知