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


相关文章
|
druid 数据库
几行代码轻松复现druid连接泄露的BUG之keepalive
几行代码轻松复现druid连接泄露的BUG之keepalive
1158 6
|
负载均衡 Cloud Native Java
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
【云原生】Spring Cloud Alibaba 之 Gateway 服务网关实战开发
2831 0
|
前端开发 测试技术 API
DDD领域驱动设计实战-分层架构及代码目录结构(上)
DDD领域驱动设计实战-分层架构及代码目录结构
1677 0
DDD领域驱动设计实战-分层架构及代码目录结构(上)
|
存储 安全 Java
解析 Java 的 MultipartFile 接口:实现文件上传的全面指南
在现代的 Web 开发中,文件上传是一个常见的需求,而 Java 中的 `MultipartFile` 接口正是用来处理这类任务的重要工具。无论是上传图片、音频、视频还是其他文件类型,`MultipartFile` 都提供了便捷的方法来处理文件的接收和存储。本文将带您深入探索 Java 中的 `MultipartFile` 接口,揭示其功能、用法以及在实际开发中的应用场景。
|
NoSQL Linux 测试技术
Linux下Redis的安装、配置及开机自启动
Linux下Redis的安装、配置及开机自启动 系统版本: CentOS 7 Redis版本: Redis-6.2.5
45713 7
Linux下Redis的安装、配置及开机自启动
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
212448 65
|
11月前
如何初始化PoolingHttpClientConnectionManager
【8月更文挑战第26天】如何初始化PoolingHttpClientConnectionManager
550 7
|
Java Apache
远程调用工具HttpClient工具类封装
java远程调用工具HttpClient工具类类封装
|
9月前
|
Java Linux Maven
IDEA如何用maven打包(界面和命令两种方式)
【10月更文挑战第14天】本文介绍了两种Maven项目打包方法:命令行与IDEA界面。首先确保已安装Maven并配置环境变量,通过`mvn -v`检查安装。命令行打包需进入项目目录,执行`mvn package`,之后在`target`目录查看结果。IDEA打包则需配置Maven路径,打开Maven Projects窗口,双击Lifecycle下的`package`阶段,同样在`target`目录查找生成文件,并在Build窗口查看日志以排查问题。
3447 1
|
11月前
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构