HttpClient远程调用基本使用(详解)

简介: HttpClient远程调用基本使用(详解)

通过HttpClient实现远程调用

如果在不同的服务要实现服务与服务之间的调用,有众多选择,如HttpclientOkhttp

HttpURLConnectionRestTemplate这几种,当然还有那些封装好的框架,如feign等。这里主要讲解一下这个HttpClient的使用。

1,通过get方式实现

public static String get(String url,String tokenName,String tokenValue,Map<String,String> map) {
  //构建客户端对象
  CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  //设置参数
  if (CollectionUtils.isNotEmpty(map)) {
    //添加参数
    String paramData = addParamByGet(map);
    //拼接参数
    url = url + "?" + paramData ;
  }
  //String url = ""http://127.0.0.1:8080/user"
  HttpGet httpGet = new HttpGet(url);
  //响应体
  CloseableHttpResponse response;
  try {
    //添加请求头,添加token
    //httpGet.addHeader("token", "eyJ0eXAiOiJKc29uV2ViVG9rZW4iLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOi");
    httpGet.addHeader(tokenName, tokenValue);
    //添加请求配置,设置响应时间等
    RequestConfig requestConfig = RequestConfig.custom()
      .setSocketTimeout(2000) //服务器响应超时时间
      .setConnectionRequestTimeout(2000) //连接服务器超时时间
      .build();
    //将配置信息添加到 httpGet 中
    httpGet.setConfig(requestConfig);
    //调用接口,获取响应
    response = httpClient.execute(httpGet);
    //将响应转化为一个结果集
    HttpEntity entity = response.getEntity();
    //将内容转化为字符串,并且设定指定字符集
    String result= EntityUtils.toString(entity, "UTF-8");
    //最终将结果集返回
    return result;
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    //资源释放
    if (httpGet != null) {
      try {
        httpGet.clone();
      } catch (CloneNotSupportedException e) {
        e.printStackTrace();
      }
    }
    if (httpClient != null) {
      try {
        httpClient.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

get请求添加参数

    /**
     * get添加参数
     */
    public static StringBuilder addParamByGet(Map<String,String> map){
        StringBuilder param = new StringBuilder();
        //遍历参数
        for (Map.Entry<String, String> m :map.entrySet()) {
            param.append(m.getKey()).append("=").append(m.getValue()).append("&");
        }
        return param;
    }

2,通过post的方式实现

里面有一些token,参数之类的,如果不用,直接将代码注释即可

public static String post(String url, String tokenName,String tokenValue, Map<String,String> map) throws IOException {
  //构建客户端对象
  CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  CloseableHttpResponse response = null;
  try {
    //创建http post请求对象 这个url可以手动封装一个
    HttpPost post = new HttpPost("http://127.0.0.1:8080/user/addUser");
    //设置请求头
    //post.setHeader("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwidXN" +
    //  "lckluZm8iOnsidXNlcklkIjoxNTg5ODIxMzMwNTY1NjQ0Mjg5fSwiZXhwIjoxNjY4MDU5MzQ3LCJpYXQiOjE2N" +
    //  "jc5NzI5NDd9.mcmgzc0yEyTyfeo-2D5vpaYhdyD9LFBwCwP8s30r0Hs");
    post.addHeader(tokenName, tokenValue);
    //设置文本类型
    post.setHeader("Content-Type", "application/json");
        //如果只有一两个参数的话,也可以通过这个反转义字符手动传参变成json格式,反正最终是要转成json的形式的
    //post.setEntity(new StringEntity("{\"type\":\"1\"}", "UTF-8"));
    //构建参数
        if (CollectionUtils.isNotEmpty(map)){
            JSONObject jo = new JSONObject();
            //增加参数
            addParam(map,jo);
      post.setEntity(new StringEntity(jo.toString(), ContentType.APPLICATION_JSON));
        }else {
          post.setEntity(new StringEntity(null, ContentType.APPLICATION_JSON));
        }
        //创建响应对象
    response = httpClient.execute(post);
    /**
     * 由于响应接口返回的是一个字符串,因此需要转换
     * 响应体数据封装在HttpEntity对象中
     */
    String result = EntityUtils.toString(response.getEntity(), "utf-8");
    return result;
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    //关闭资源
    response.close();
    httpClient.close();
  }
}

post请求添加参数

/**
 * post添加参数
 */
public static JSONObject addParam(Map < String, String > map, JSONObject jsonObject) {
  for (Map.Entry < String, String > entry: map.entrySet()) {
    jsonObject.put(entry.getKey(), entry.getValue());
  }
  return jsonObject;
}

3,解析返回数据

上面两种方式都是返回一个json格式的字符串,因此可以将这个字符串解析,或者直接在方法里面解析,我这里选择在外面解析

public static vois mian(String Args[]) {
  //调用get请求,可以将里面的url,token等作为参数传入
  String url = "localhost:8080/user/message";
  String tokenName = "token";
  String tokenValue = "xxx";
  String message = get(url,tokenName,tokenValue,null);
  //如果里面有多条数据,那么可以用数组方式解析,即使一条数据,也是可以通过这个解析的
  JSONArray jsonArray = JSONArray.parseArray(message);
  //遍历
    List<User> list = new ArrayList<>();
  jsonArray.stream().forEach(json - > {
    JSONObject jsonObject = JSONArray.parseObject(json.toString());
        User user = JSON.toJavaObject(jsonObject, User.class);
        list.add(user);
  });
    //遍历全部的用户
    list.stream.forEach(e->{System.out.println(e)});
}


相关文章
|
NoSQL Java Redis
SpringBoot 配置Redis操作
SpringBoot 配置Redis操作
313 0
|
NoSQL JavaScript 前端开发
MongoDB系列--深入理解MongoDB聚合(Aggregation )
MongoDB中聚合(aggregate) 操作将来自多个document的value组合在一起,并通过对分组数据进行各种操作处理,并返回计算后的数据结果,主要用于处理数据(诸如统计平均值,求和等)。MongoDB提供三种方式去执行聚合操作:聚合管道(aggregation pipeline)、Map-Reduce函数以及单一的聚合命令(count、distinct、group)。
2176 0
MongoDB系列--深入理解MongoDB聚合(Aggregation )
|
机器学习/深度学习 自然语言处理 安全
LLM系列 | 12: 如何编写思维链Prompt?以智能客服为例
本文介绍如何编写ChatGPT的思维链Prompt从而为用户提供智能客服服务。在智能客服场景中,经常会有用户询问对比各种产品的价格,如何让智能客服提供准确的答案?这就需要在构建Prompt过程中引入思维链的编写方式。
|
存储 分布式计算 搜索推荐
连载6:阿里巴巴大数据实践:大数据建设方法论OneData
避免重复建设和数据不一致性,保证数据的规范性,一直是大数据系统建设不断追求的方向。
8914 1
连载6:阿里巴巴大数据实践:大数据建设方法论OneData
|
7月前
|
测试技术 开发者
基础测试用例
顾翔 作者相关精选 基础测试用例 关注作者 腾讯云 开发者社区 免费试用云直播,了解直播推流的操作方式 文档 建议反馈 控制台 登录/注册 首页 学习 活动 专区 圈层 工具 MCP广场 文章/答案/技术大牛 搜索 发布 社区首页 > 专栏 > 基础测试用例 基础测试用例
299 40
封装httpclient工具类
httpclient远程调用工具封装使用
|
Java Apache
远程调用工具HttpClient工具类封装
java远程调用工具HttpClient工具类类封装
|
Java 编译器 程序员
【c++】基础知识——快速入门c++
本文介绍了C++的基础知识,包括C++相对于C语言的新特性,如面向对象编程、引用、函数重载、模板库STL等。文章通过“Hello World”程序展示了C++的基本语法,并详细解释了命名空间、输入输出、缺省参数、函数重载、内联函数和空指针的概念。通过实例代码和运行结果,帮助读者快速掌握C++的核心知识点。
441 9
|
机器学习/深度学习 算法 开发者
探索深度学习中的优化器选择对模型性能的影响
在深度学习领域,优化器的选择对于模型训练的效果具有决定性作用。本文通过对比分析不同优化器的工作原理及其在实际应用中的表现,探讨了如何根据具体任务选择合适的优化器以提高模型性能。文章首先概述了几种常见的优化算法,包括梯度下降法、随机梯度下降法(SGD)、动量法、AdaGrad、RMSProp和Adam等;然后,通过实验验证了这些优化器在不同数据集上训练神经网络时的效率与准确性差异;最后,提出了一些基于经验的规则帮助开发者更好地做出选择。
|
存储 缓存 JSON
详解HTTP四种请求:POST、GET、DELETE、PUT
【4月更文挑战第3天】
75244 5
详解HTTP四种请求:POST、GET、DELETE、PUT