java - 无法做出正确的请求 Resttemplate

标签 java spring resttemplate

所以我在我的 Java 项目中使用 GET 调用 API(此 API 用于发送 SMS)。

这是 API 网址:

http://xxxxx.smsapi.xx/xxxx/xxxx.aspx?user=username&password=password&msisdn=xxxxxx&sid=1111111&msg=test%20msg&fl=0

当我在浏览器中调用电话时,我得到了这样的良好响应:

{"ErrorCode":"000",
"ErrorMessage":"Success",
"JobId":"id",
"MessageData":
[{"Number":"xxxxxxx",
"MessageParts":[{"MsgId":"id",
"PartId":1,
"Text":"test msg"}]
}]}

但是当我在我的项目中进行调用时,我得到了完全相同的消息,但是文本字段是这样的:

"Text":"test%20msg"

发送到手机的文本是用“%20”发送的,这不是我想要的,响应出错了。

这是我目前的 java 代码:

    UriComponentsBuilder builder = UriComponentsBuilder
         .fromUriString(env.getProperty("smsProviderUrl"))
         // Add query parameter     
         .queryParam("user", env.getProperty("smsUser"))
         .queryParam("password", env.getProperty("smsPassword"))
         .queryParam("msisdn", new Object[] {number})
         .queryParam("sid", sendedID)
         .queryParam("msg", body)                           
         .queryParam("fl", env.getProperty("smsFl"));

    RestTemplate template = this.restTemplate();

    List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();        

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();

    converter.setSupportedMediaTypes(Arrays.asList(MediaType.TEXT_HTML));   

    messageConverters.add(converter);  

    template.setMessageConverters(messageConverters);


    SmsResponseDTO response = template.getForObject(builder.toUriString(), SmsResponseDTO.class);

这是在浏览器上发送的 header :

Content-Type: text/html; charset=utf-8

在使用 wireshark 获取数据包后,我发现这是从 Java 发送的 header

Accept: text/html\r\n

我已经尝试添加 UTF-8 字符集,但没有成功,而且我认为默认设置为 utf-8,所以我不确定这是否是问题所在,我认为这与 im 标题有关没有把握。

谢谢!

最佳答案

您很可能对请求 URI 进行了两次编码。首先确认 body 不包含 %20,确保这是纯文本消息。

然后手动将 UriComponentsBuilder 转换为 String :

String uri = UriComponentsBuilder
     .fromUriString(env.getProperty("smsProviderUrl"))
     // Add query parameter     
     .queryParam("user", env.getProperty("smsUser"))
     .queryParam("password", env.getProperty("smsPassword"))
     .queryParam("msisdn", new Object[] {number})
     .queryParam("sid", sendedID)
     .queryParam("msg", body)                           
     .queryParam("fl", env.getProperty("smsFl"))
     .encode()
     .build()
     .toUriString();

并确认 URI 包含 &msg=test%20msg 而不是 &msg=test%2520msg。请注意双重编码会将 % 更改为 %25

关于java - 无法做出正确的请求 Resttemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54484364/

相关文章:

java - Spring AOP生成的代理类所在位置

java - 微服务:Rest Template versus Client Jar

java - Spring - RestTemplate 抛出 InvalidMediaTypeException

java - Java 中的 RestTemplate - RestTemplate 没有足够的变量值

java - 如何使用 Java 将 JButton 放置在 JFrame 中的所需位置?

java - Java继承中 "override abstract methods"可以用 "implement abstract methods"代替吗?

java - 请帮助我理解 JRuby 方法名称约定不一致的问题

java - 如何减少创建 c3p0 ComboPooledDataSource 和获取 Oracle 数据库连接的超时时间?

android - 无法从 Spring Webservice 中的 START_ARRAY token 反序列化对象实例

java - 安卓、Java : Stretch Bitmap or Path to arbitrary polygon