所以我在我的 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/