zoukankan      html  css  js  c++  java
  • Java开发小技巧(五):HttpClient工具类

    前言

    大多数Java应用程序都会通过HTTP协议来调用接口访问各种网络资源,JDK也提供了相应的HTTP工具包,但是使用起来不够方便灵活,所以我们可以利用Apache的HttpClient来封装一个具有访问HTTP协议基本功能的高效工具类,为后续开发使用提供方便。

    文章要点:

    • HttpClient使用流程
    • 工具类封装
    • 使用实例

    HttpClient使用流程

    1、导入Maven依赖

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.5</version>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.11</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>
    

    2、创建HttpClient实例

    HttpClient client = HttpClientBuilder.create().build();
    

    3、创建请求方法的实例

    GET请求使用HttpGet,POST请求使用HttpPost,并传入请求的URL

    // POST请求
    HttpPost post = new HttpPost(url);
    // GET请求,URL中带请求参数
    HttpGet get = new HttpGet(url);
    

    4、添加请求参数

    普通形式

    List<NameValuePair> list = new ArrayList<>();
    list.add(new BasicNameValuePair("username", "admin"));
    list.add(new BasicNameValuePair("password", "123456"));
    
    // GET请求方式
    // 由于GET请求的参数是拼装在URL后方,所以需要构建一个完整的URL,再创建HttpGet实例
    URIBuilder uriBuilder = new URIBuilder("http://www.baidu.com");
    uriBuilder.setParameters(list);
    HttpGet get = new HttpGet(uriBuilder.build());
    
    // POST请求方式
    post.setEntity(new UrlEncodedFormEntity(list, Charsets.UTF_8));
    

    JSON形式

    Map<String,String> map = new HashMap<>();
    map.put("username", "admin");
    map.put("password", "123456");
    Gson gson = new Gson();
    String json = gson.toJson(map, new TypeToken<Map<String, String>>() {}.getType());
    post.setEntity(new StringEntity(json, Charsets.UTF_8));
    post.addHeader("Content-Type", "application/json");
    

    5、发送请求

    调用HttpClient实例的execute方法发送请求,返回一个HttpResponse对象

    HttpResponse response = client.execute(post);
    

    6、获取结果

    String result = EntityUtils.toString(response.getEntity());
    

    7、释放连接

    post.releaseConnection();
    

    工具类封装

    HttpClient工具类代码(根据相应使用场景进行封装):

    public class HttpClientUtil {
        // 发送GET请求
        public static String getRequest(String path, List<NameValuePair> parametersBody) throws RestApiException, URISyntaxException {
            URIBuilder uriBuilder = new URIBuilder(path);
            uriBuilder.setParameters(parametersBody);
            HttpGet get = new HttpGet(uriBuilder.build());
            HttpClient client = HttpClientBuilder.create().build();
            try {
                HttpResponse response = client.execute(get);
                int code = response.getStatusLine().getStatusCode();
                if (code >= 400)
                    throw new RuntimeException((new StringBuilder()).append("Could not access protected resource. Server returned http code: ").append(code).toString());
                return EntityUtils.toString(response.getEntity());
            }
            catch (ClientProtocolException e) {
                throw new RestApiException("postRequest -- Client protocol exception!", e);
            }
            catch (IOException e) {
                throw new RestApiException("postRequest -- IO error!", e);
            }
            finally {
                get.releaseConnection();
            }
        }
    
        // 发送POST请求(普通表单形式)
        public static String postForm(String path, List<NameValuePair> parametersBody) throws RestApiException {
            HttpEntity entity = new UrlEncodedFormEntity(parametersBody, Charsets.UTF_8);
            return postRequest(path, "application/x-www-form-urlencoded", entity);
        }
    
        // 发送POST请求(JSON形式)
        public static String postJSON(String path, String json) throws RestApiException {
            StringEntity entity = new StringEntity(json, Charsets.UTF_8);
            return postRequest(path, "application/json", entity);
        }
    
        // 发送POST请求
        public static String postRequest(String path, String mediaType, HttpEntity entity) throws RestApiException {
            logger.debug("[postRequest] resourceUrl: {}", path);
            HttpPost post = new HttpPost(path);
            post.addHeader("Content-Type", mediaType);
            post.addHeader("Accept", "application/json");
            post.setEntity(entity);
            try {
                HttpClient client = HttpClientBuilder.create().build();
                HttpResponse response = client.execute(post);
                int code = response.getStatusLine().getStatusCode();
                if (code >= 400)
                    throw new RestApiException(EntityUtils.toString(response.getEntity()));
                return EntityUtils.toString(response.getEntity());
            }
            catch (ClientProtocolException e) {
                throw new RestApiException("postRequest -- Client protocol exception!", e);
            }
            catch (IOException e) {
                throw new RestApiException("postRequest -- IO error!", e);
            }
            finally {
                post.releaseConnection();
            }
        }
    }
    

    使用实例

    GET请求

    List<NameValuePair> parametersBody = new ArrayList();
    parametersBody.add(new BasicNameValuePair("userId", "admin"));
    String result = HttpClientUtil.getRequest("http://www.test.com/user",parametersBody);
    

    POST请求

    List<NameValuePair> parametersBody = new ArrayList();
    parametersBody.add(new BasicNameValuePair("username", "admin"));
    parametersBody.add(new BasicNameValuePair("password", "123456"));
    String result = HttpClientUtil.postForm("http://www.test.com/login",parametersBody);
    

    POST请求(JSON形式)

    Map<String,String> map = new HashMap<>();
    map.put("username", "admin");
    map.put("password", "123456");
    Gson gson = new Gson();
    String json = gson.toJson(map, new TypeToken<Map<String, String>>() {}.getType());
    String result = HttpClientUtil.postJSON("http://www.test.com/login", json);
    

    关于HttpClient的详细介绍看这里:HttpClient入门

    本文为作者kMacro原创,转载请注明来源:https://zkhdev.github.io/2018/10/12/java_dev5/

  • 相关阅读:
    第二十一章流 1流的操作 简单
    第二十章友元类与嵌套类 1友元类 简单
    第十九章 19 利用私有继承来实现代码重用 简单
    第二十章友元类与嵌套类 2嵌套类 简单
    第十九章 8链表类Node 简单
    第二十一章流 3用cin输入 简单
    第十九章 10 图书 药品管理系统 简单
    第十九章 11图书 药品管理系统 简单
    第二十一章流 4文件的输入和输出 简单
    第十九章 12 什么时候使用私有继承,什么时候使用包含 简单
  • 原文地址:https://www.cnblogs.com/zkh101/p/9777973.html
Copyright © 2011-2022 走看看