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

 

     

点赞