• 使用HttpClient访问接口(Rest接口和普通接口)


    这里总结一下使用HttpClient访问外部接口的用法。后期如果发现有什么缺陷会更改。欢迎读者指出此方法的不足之处。

    首先,创建一个返回实体:

    public class HttpResult {
        // 响应的状态码
        private int code;
    
        // 响应的响应体
        private String body;
    
        public HttpResult(int code, String body) {
            this.code = code;
            this.body = body;
        }
    	//省略get/set
    }
    

    创建一个HttpClientUtil:

    public class HttpClientUtil {
    
        private static CloseableHttpClient httpClient =  HttpClients.createDefault();	//用static实现单例,此处不完善,当多线程时会出现问题。
    
        /**
         * 带参数的get请求
         * 
         * @param url
         * @param map
         * @return
         * @throws Exception
         */
        public static HttpResult doGet(String url, Map<String, Object> map) throws Exception {
    
            // 声明URIBuilder
            URIBuilder uriBuilder = new URIBuilder(url);
    
            // 判断参数map是否为非空
            if (map != null) {
                // 遍历参数
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    // 设置参数
                    uriBuilder.setParameter(entry.getKey(), entry.getValue().toString());
                }
            }
    
            // 2 创建httpGet对象,相当于设置url请求地址
            HttpGet httpGet = new HttpGet(uriBuilder.build());
    
            // 3 使用HttpClient执行httpGet,相当于按回车,发起请求
            CloseableHttpResponse response = httpClient.execute(httpGet);
    
            // 4 解析结果,封装返回对象httpResult,相当于显示相应的结果
            // 状态码
            // response.getStatusLine().getStatusCode();
            // 响应体,字符串,如果response.getEntity()为空,下面这个代码会报错,所以解析之前要做非空的判断
            // EntityUtils.toString(response.getEntity(), "UTF-8");
            HttpResult httpResult = null;
            // 解析数据封装HttpResult
            if (response.getEntity() != null) {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(),
                        EntityUtils.toString(response.getEntity(), "UTF-8"));
            } else {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(), "");
            }
    
            // 返回
            return httpResult;
        }
    
        /**
         * 不带参数的get请求
         * 
         * @param url
         * @return
         * @throws Exception
         */
        public static HttpResult doGet(String url) throws Exception {
            HttpResult httpResult = doGet(url, null);
            return httpResult;
        }
    
        /**
         * 带参数的post请求
         * 
         * @param url
         * @return
         * @throws Exception
         */
        public static HttpResult doPost(String url, Map<String, Object> reqMap, Map<String,String> headersMap) throws Exception {
            // 声明httpPost请求
            HttpPost httpPost = new HttpPost(url);
            for (Map.Entry<String, String> entry: headersMap.entrySet())
                httpPost.addHeader(entry.getKey(), entry.getValue());
    
            // 判断map不为空
            if (reqMap != null) {
    
                // 创建form表单对象
                StringEntity formEntity = new StringEntity(JSON.toJSONString(reqMap), "UTF-8");
    
                // 把表单对象设置到httpPost中
                httpPost.setEntity(formEntity);
            }
    
            // 使用HttpClient发起请求,返回response
            CloseableHttpResponse response = httpClient.execute(httpPost);
    
            // 解析response封装返回对象httpResult
            HttpResult httpResult = null;
            if (response.getEntity() != null) {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(),
                        EntityUtils.toString(response.getEntity(), "UTF-8"));
            } else {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(), "");
            }
    
            // 返回结果
            return httpResult;
        }
    
        /**
         * 不带参数的post请求
         * 
         * @param url
         * @return
         * @throws Exception
         */
        public static HttpResult doPost(String url) throws Exception {
            HttpResult httpResult = doPost(url, null,null);
            return httpResult;
        }
    
        /**
         * 带参数的Put请求
         * 
         * @param url
         * @param map
         * @return
         * @throws Exception
         */
        public static HttpResult doPut(String url, Map<String, Object> map) throws Exception {
            // 声明httpPost请求
            HttpPut httpPut = new HttpPut(url);
    
            // 判断map不为空
            if (map != null) {
                // 声明存放参数的List集合
                List<NameValuePair> params = new ArrayList<NameValuePair>();
    
                // 遍历map,设置参数到list中
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    params.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
                }
    
                // 创建form表单对象
                UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, "UTF-8");
    
                // 把表单对象设置到httpPost中
                httpPut.setEntity(formEntity);
            }
    
            // 使用HttpClient发起请求,返回response
            CloseableHttpResponse response = httpClient.execute(httpPut);
    
            // 解析response封装返回对象httpResult
            HttpResult httpResult = null;
            if (response.getEntity() != null) {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(),
                        EntityUtils.toString(response.getEntity(), "UTF-8"));
            } else {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(), "");
            }
    
            // 返回结果
            return httpResult;
        }
    
        /**
         * 带参数的Delete请求
         * 
         * @param url
         * @param map
         * @return
         * @throws Exception
         */
        public static HttpResult doDelete(String url, Map<String, Object> map) throws Exception {
    
            // 声明URIBuilder
            URIBuilder uriBuilder = new URIBuilder(url);
    
            // 判断参数map是否为非空
            if (map != null) {
                // 遍历参数
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    // 设置参数
                    uriBuilder.setParameter(entry.getKey(), entry.getValue().toString());
                }
            }
    
            // 2 创建httpGet对象,相当于设置url请求地址
            HttpDelete httpDelete = new HttpDelete(uriBuilder.build());
    
            // 3 使用HttpClient执行httpGet,相当于按回车,发起请求
            CloseableHttpResponse response = httpClient.execute(httpDelete);
    
            // 4 解析结果,封装返回对象httpResult,相当于显示相应的结果
            // 状态码
            // response.getStatusLine().getStatusCode();
            // 响应体,字符串,如果response.getEntity()为空,下面这个代码会报错,所以解析之前要做非空的判断
            // EntityUtils.toString(response.getEntity(), "UTF-8");
            HttpResult httpResult = null;
            // 解析数据封装HttpResult
            if (response.getEntity() != null) {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(),
                        EntityUtils.toString(response.getEntity(), "UTF-8"));
            } else {
                httpResult = new HttpResult(response.getStatusLine().getStatusCode(), "");
            }
    
            // 返回
            return httpResult;
        }
    
        /**
         * 返回常用请求头
         * @return
         */
        public static Map<String, String> commentHeader(){
            Map<String, String> map = new HashMap<>();
            map.put("Content-Type", "application/json");
            return map;
        }
    }
    

    测试一下:

    package cn.xxxxxx.httpclient.test;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import org.junit.Before;
    import org.junit.Test;
    
    import cn.itcast.httpclient.APIService;
    import cn.itcast.httpclient.HttpResult;
    
    public class APIServiceTest {
    
        // 查询
        @Test
        public void testGet() throws Exception {
            // http://manager.aaaaaa.com/rest/item/interface/{id}
    
            String url = "http://manager.aaaaaa.com/rest/item/interface/42";
    
            HttpResult httpResult = HttpClientUtil.doGet(url);
    
            System.out.println(httpResult.getCode());
            System.out.println(httpResult.getBody());
    
        }
    
    	// 查询
        @Test
        public void testPost() throws Exception {
          	//设置参数
            Map reqMap = new HashMap();
    		reqMap.put("distCode", arsArg.getDistCode());
    		HttpResult httpResult = null;
    		try {
              	//RestUrlsCommons.RMDS_DISTRICT_FINDBYDISTCODE为url
              	//reqMap:请求参数
              	//HttpClientUtil.commentHeader():请求头
    			httpResult = HttpClientUtil.doPost(RestUrlsCommons.RMDS_DISTRICT_FINDBYDISTCODE, reqMap, HttpClientUtil.commentHeader());
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    
            System.out.println(httpResult.getCode());
            System.out.println(httpResult.getBody());
        }
    
    }
    

    参考资料:使用HttpClient调用接口

  • 相关阅读:
    Java笔记(2)
    java笔记(1) java环境
    黑马javaSE内部编程题10道
    Openblas编译Android NDK库的步骤
    Android layout的横竖屏处理
    会议整理
    概率论总结
    数据分析推荐书籍
    操作系统(蒲晓蓉)7
    运筹学整理笔记1
  • 原文地址:https://www.cnblogs.com/sean-zeng/p/11176969.html
Copyright © 2020-2023  润新知