• 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/

  • 相关阅读:
    【Coursera】Third Week(2)
    【TCP/IP详解 卷一:协议】第二章:链路层
    【Coursera】Third Week(1)
    【Coursera】SecondWeek(2)
    【Coursera】SecondWeek(1)
    【Coursera】History: Dawn of Electronic Computing学后小结
    【TCP/IP详解 卷一:协议】第一章概论 学习笔记
    NS3 fifth.cc 拥塞窗口实例
    NS3 利用Gnuplot生成拥塞窗口例子fifth.cc的png图像
    C++小结:迟到的小结和重新起航的故事
  • 原文地址:https://www.cnblogs.com/zkh101/p/9777973.html
Copyright © 2020-2023  润新知