【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“

这篇具有很好参考价值的文章主要介绍了【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

由于项目需要,需要在代码中使用POST请求去调用另一个服务的接口,即不通过前端,A 项目直接在方法中发起HTTP请求调用 B 项目的接口,当请求体中的参数有中文时,参数接收后中文会变为“?”。

具体原因是参数的编码格式不对,默认为类型为 Content-Type: text/plain; charset=ISO-8859-1,我们修改为 UTF-8 编码即可。

问题再现

A 服务中发起 HTTP 请求的接口:

@PostMapping("/testA")
public JSONObject testA(@RequestBody User user){
  // 创建 CloseableHttpClient 对象
  CloseableHttpClient httpClient = HttpClientBuilder.create().build();
  // 构造请求体内容
  try {
    // 创建 HttpGet 请求
    HttpPost httpPost = new HttpPost("http://localhost:8081/testB");

    // 设置请求头,并指定接受的 Content-Type
    httpPost.setHeader("Content-Type", "application/json");
    StringEntity entity = new StringEntity(JSONObject.toJSONString(user));

    // 设置请求体
    httpPost.setEntity(entity);

    // 发送请求并获取响应
    HttpResponse   response = httpClient.execute(httpPost);

    // 从响应中获取实体内容,并返回
    return (JSONObject) JSON.toJSON(EntityUtils.toString(response.getEntity()));
  } catch (IOException e) {
    e.printStackTrace();
  }finally {
    try {
      httpClient.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  return null;
}

B 服务中的接口:

@PostMapping("/testB")
public JSONObject testB(@RequestBody User user){
  System.out.println(user);
  return (JSONObject) JSON.toJSON(user);
}

问题分析

  1. 当我们使用ApiFox进行调试时,请求的参数值传入中文,可以看到在 A 服务的接口中我们顺利的获得传来的数据,此时中文还没有乱码。

    【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“,SpringBoot,spring boot,后端,java

  2. 当我们使用 httpPost.setHeader("Content-Type", "application/json") 方式设置请求头,指定接收 Content-Type 时,org.apache.http.entity 会默认对其进行 ISO-8859-1 编码,之后 HttpPost 会携带我们的参数向本地的 8081 端口发送 POST 请求。

    【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“,SpringBoot,spring boot,后端,java

  3. B 服务的接口接收参数,可以看到中文变为了“?”。

    【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“,SpringBoot,spring boot,后端,java

解决方法

此时我们已经定位到了中文乱码问题是由于 A 服务对中文参数使用了错误的编码格式,从而导致 B 服务接收到的中文变为了 “?”,那么我们只需要在 A 服务中指定对参数的编码为 UTF-8 编码即可解决问题。同样的,我们可能还需要对 B 服务返回的数据指定 UTF-8 编码。修改代码如下:

  1. 在将请求体内容设置到 HttpEntity 时通过第二个参数 StandardCharsets.UTF_8 将其指定为 UTF-8 编码,再对 HttpPost 对象设置请求体。同理对从响应中获取的数据进行 UTF-8 编码。

    【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“,SpringBoot,spring boot,后端,java

  2. 可以看到 B 服务中可以顺利接收中文参数了。

    【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“,SpringBoot,spring boot,后端,java文章来源地址https://www.toymoban.com/news/detail-682638.html

到了这里,关于【已解决】在 SpringBoot 中使用 CloseableHttpClient 调用接口时,接收参数中的中文变为“?“的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 整合Thymeleaf教程及使用 springboot配合thymeleaf,调用接口不跳转页面只显示文本

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。它与 JSP,Velocity,FreeMaker 等模板引擎类似,也可以轻易地与 Spring MVC 等 Web 框架集成。与其它模板引擎相比,Thymeleaf 最大的特点是,即使不启动 Web 应用,也可以直接在浏览器中打开并正确显示模板页面 。 目录 一、整合

    2024年02月08日
    浏览(75)
  • SpringBoot接口如何正确地接收时间参数

    唠嗑部分 在做Java开发时,肯定会碰到传递时间参数的情况吧,比如用户的出生日期、活动的开始,结束日期等等,这些参数往往是由前端传递过来的,那么在SpringBoot项目中,该如何正确的接收日期参数呢,这便是我们今日所说的内容 首先我们来回顾一下常用的几种传参方式

    2024年02月15日
    浏览(47)
  • 解决使用mitmprox抓包可以访问网页,但是使用python request 调用该网站接口报错问题

    可能有几种原因导致这种情况。以下是一些常见的问题和可能的解决方法: 证书验证问题: 当你使用mitmproxy抓包时,它通常会生成自签名的SSL证书,以便进行中间人攻击检查。但在Python中使用requests库时,默认情况下,它会验证SSL证书的有效性。你需要禁用SSL验证,以便使用

    2024年02月08日
    浏览(39)
  • SpringBoot 调用外部接口

    一个系统肯定少不了要和外部系统进行通信,所以就必须得访问外部接口。 本次演示的是使用的是 高德天气api接口 使用插件方式,比如自带的HttpClient,或者OkHttp,甚至是原生的HttpURLConnection 等等,这里以HttpClient为例。 1、封装工具类 简单封装的get请求 2、测试方法 3、结果

    2024年02月09日
    浏览(45)
  • 【SpringBoot18】SpringBoot 调用外部接口的三种方式

    SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(

    2023年04月11日
    浏览(77)
  • springboot @Async 异步调用接口处理数据

    @Async 异步背景 新增的数据需要分发给下游业务系统,由于下游业务系统状态未知,所以需要异步发送数据给下游业务系统。 系统生效按钮---controller新增--异步调用servcie---数据集成 在springboot框架中实现步骤 首先在启动类上加上 @EnableAsync 注解开启项目的异步调用功能,其次

    2024年02月16日
    浏览(43)
  • 最详细的SpringBoot实现接口校验签名调用

    代码地址:GitHub - passerbyYSQ/DemoRepository: 各种开发小demo 概念 开放接口 验签 接口验签调用流程 1. 约定签名算法 2. 颁发非对称密钥对 3. 生成请求参数签名 4. 请求携带签名调用 代码设计 1. 签名配置类 2. 签名管理类 3. 自定义验签注解 4. AOP实现验签逻辑 5. 解决请求体只能读取一

    2024年02月09日
    浏览(36)
  • SpringBoot案例 调用第三方接口传输数据

    最近再写调用三方接口传输数据的项目,这篇博客记录项目完成的过程,方便后续再碰到类似的项目可以快速上手 项目结构: 这里主要介绍HttpClient发送POST请求工具类和定时器的使用,mvc三层架构编码不做探究 pom.xml application-dev.yml Constast utils scheduled 该定时任务每10秒执行一

    2024年02月12日
    浏览(60)
  • Open AI:springboot 调用open ai 接口

    Spring Boot可以通过HTTP客户端调用Open AI的API接口,具体步骤如下: 目录 1.在Open AI官方网站上注册账号并获取API密钥 2.创建一个Spring Boot项目,并添加相关的依赖,例如 3.创建一个Java类作为Open AI的HTTP客户端,例如 4.在Spring Boot的配置文件中添加Open AI的API密钥 5.在Spring Boot的控制

    2024年02月10日
    浏览(38)
  • Springboot调用http(https)接口小妙招,新手小白版

    有的新手彦祖在搬砖过程中会遇到调用别人接口来获取数据的需求,这其中涉及调用一些相关类及方法的调用,最近干活又要用这个了,把以前的代码搬出来套用下,死活报错协议加密证书啥的问题,真想感叹卑微打工仔挣点钱养家糊口不容易。无所谓,我师傅会出手,过来

    2024年02月13日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包