zoukankan      html  css  js  c++  java
  • HttpClient 远程接口调用方式

    远程接口调用方式HttpClient
    问题:现在我们已经开发好了接口了,那该如何调用这个接口呢?
    答:使用Httpclient客户端。
     
    Httpclient简介
    什么是httpclient
    HttpClient Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
    下载地址:http://hc.apache.org/
     
    httpclient作用
    java代码中,发送Http请求。通常用来实现远程接口调用。
    HttpClient测试
    在工程中添加httpclientpom依赖。
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>
    
    执行GET请求
    public static void doGet(){
     // 创建Httpclient对象
            CloseableHttpClient httpclient = HttpClients.createDefault();
     
            // 创建http GET请求
            HttpGet httpGet = new HttpGet("http://www.oschina.net/");
     
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpclient.execute(httpGet);
                System.out.println(response.getStatusLine());
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                    System.out.println("内容长度:" + content.length());
                }
            }catch(Exception e){
             e.printStackTrace();
            
            } finally {
                if (response != null) {
                    try {
    response.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
                }
                try {
    httpclient.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
            }
     
    执行GET带参数
    public static void doGetParam(){
     // 创建Httpclient对象
    CloseableHttpClient httpclient = HttpClients.createDefault();
    CloseableHttpResponse response = null;
    try {
     
            // 定义请求的参数
            URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "数据库").build();
     
            System.out.println(uri);
     
            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);
     
                // 执行请求
                response = httpclient.execute(httpGet);
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                    System.out.println(content);
                }
            }catch(Exception e){
             e.printStackTrace();
            
            }finally {
                if (response != null) {
                    try {
    response.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
                }
                try {
    httpclient.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
            }
    }
    执行post请求
    public static void doPost(){
     // 创建Httpclient对象
            CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
     
            // 创建http POST请求
            HttpPost httpPost = new HttpPost("http://www.oschina.net/");
     
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpclient.execute(httpPost);
                System.out.println(response.getStatusLine());
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                    System.out.println(content);
                }
            }catch(Exception e){
             e.printStackTrace();
            
            }finally {
                if (response != null) {
                    try {
    response.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
                }
                try {
    httpclient.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
            }
        }
     
    执行post带参数
    public static void doPostParam() throws Exception{
     // 创建Httpclient对象
            CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
     
            // 创建http POST请求
            HttpPost httpPost = new HttpPost("http://www.oschina.net/search");
           
            // 设置2个post参数,一个是scope、一个是q
            List<NameValuePair> parameters = new ArrayList<NameValuePair>();
            parameters.add(new BasicNameValuePair("scope", "project"));
            parameters.add(new BasicNameValuePair("q", "java"));
            // 构造一个form表单式的实体
            UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);
            // 将请求实体设置到httpPost对象中
            httpPost.setEntity(formEntity);
     
            CloseableHttpResponse response = null;
            try {
                // 执行请求
                response = httpclient.execute(httpPost);
                System.out.println(response.getStatusLine());
                // 判断返回状态是否为200
                if (response.getStatusLine().getStatusCode() == 200) {
                    String content = EntityUtils.toString(response.getEntity(), "UTF-8");
                    System.out.println(content);
                }
            } finally {
                if (response != null) {
                    response.close();
                }
                httpclient.close();
            }
    }
     
    httpclient常见问题及解决方案
    请求参数乱码
    设置请求的编码格式:
    obj.addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
    
     
    响应HTTP/1.1 403 Forbidden
    原因:网站设置了反爬虫机制,禁止非法访问。
    解决方案:伪装浏览器。
    obj.addHeader("User-Agent"," Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/31.0.1650.63")
    
    封装通用工具类HttpClientUtils
    package org.chu.ego.base.utils;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.client.LaxRedirectStrategy;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    /**
     * --发送get请求的api
     * CloseableHttpClient类 ,client实现类
     * HttpClients类 ,client工具类,用于创建客户端对象。
     * CloseableHttpResponse接口,请求的响应对象
     * URIBuilder类 :url构建类,用于设置get请求的路径变量
     * HttpGet类 :get请求的发送对象
     * EntityUtils类 实体处理类
     * 
     * --发送post 请求使用的api
     * CloseableHttpClient类
     * HttpClientBuilder client构建对象,用于创建客户端对象。
     * LaxRedirectStrategy类,post请求重定向的策略
     * CloseableHttpResponse 请求的响应对象
     * HttpPost post请求的发送对象
     * NameValuePair 类,用于设置参数值
     * UrlEncodedFormEntity:用于设置表单参数给发送对象HttpPost
     * 
     * @author ranger
     *
     */
    public class HttpClientUtils {
    
    public static String doGet(String url,Map<String, String> params){
            
            //获取httpclient客户端
            CloseableHttpClient httpclient = HttpClients.createDefault();
            
            String resultString = "";
            
            CloseableHttpResponse response = null;
            
            try {
                URIBuilder builder = new URIBuilder(url);
                
                if(null!=params){
                    for (String key:params.keySet()) {
                        builder.setParameter(key, params.get(key));
                    }
                }
                
                HttpGet get = new HttpGet(builder.build());
                
                
                response = httpclient.execute(get);
                
                System.out.println(response.getStatusLine());
                
                if(200==response.getStatusLine().getStatusCode()){
                    HttpEntity entity = response.getEntity();
                    resultString = EntityUtils.toString(entity, "utf-8");
                }
                
            } catch (Exception e) {
                
                e.printStackTrace();
            } finally {
                if(null!=response){
                    try {
                        response.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if(null!=httpclient){
                    try {
                        httpclient.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            
            return resultString;
        }
        
        public static String doGet(String url){
            return doGet(url, null);
        }
        
        public static String doPost(String url,Map<String,String> params){
            /**
             * 在4.0及以上httpclient版本中,post需要指定重定向的策略,如果不指定则按默认的重定向策略。
             * 
             * 获取httpclient客户端
             */
            CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy( new LaxRedirectStrategy()).build();
            
            String resultString = "";
            
            CloseableHttpResponse response = null;
            
            try {
                
                
                HttpPost post = new HttpPost(url);
                
                List<NameValuePair> paramaters = new ArrayList<>();
                
                if(null!=params){
                    for (String key : params.keySet()) {
                        paramaters.add(new BasicNameValuePair(key,params.get(key)));
                    }
                    
                    UrlEncodedFormEntity  formEntity = new UrlEncodedFormEntity (paramaters);
                    
                    post.setEntity(formEntity);
                }
                
                
                /**
                 * HTTP/1.1 403 Forbidden
                 *   原因:
                 *      有些网站,设置了反爬虫机制
                 *   解决的办法:
                 *      设置请求头,伪装浏览器
                 */
                post.addHeader("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
                
                response = httpclient.execute(post);
                
                System.out.println(response.getStatusLine());
                
                if(200==response.getStatusLine().getStatusCode()){
                    HttpEntity entity = response.getEntity();
                    resultString = EntityUtils.toString(entity, "utf-8");
                }
                
            } catch (Exception e) {
                
                e.printStackTrace();
            } finally {
                if(null!=response){
                    try {
                        response.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if(null!=httpclient){
                    try {
                        httpclient.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            
            return resultString;
        }
        
        public static String doPost(String url){
            return doPost(url, null);
        }
     
    }
     
     
     
  • 相关阅读:
    python练习--1、简易登录接口
    python--1、入门
    mysql数据库安装
    第八章总结
    第七章总结
    第三周总结
    第二周总结
    if、switch语句
    2章总结
    1月14日总结
  • 原文地址:https://www.cnblogs.com/aknife/p/11265878.html
Copyright © 2011-2022 走看看