Así que estoy llamando a una API (Esta API se utiliza para enviar SMS) en mi proyecto de Java utilizando un GET.
Esta es la URL de la API:
http://xxxxx.smsapi.xx/xxxx/xxxx.aspx?user=username&password=password&msisdn=xxxxxx&sid=1111111&msg=test%20msg&fl=0
y cuando hago la llamada en mi broweser i obtener una respuesta buena como esta:
{"ErrorCode":"000",
"ErrorMessage":"Success",
"JobId":"id",
"MessageData":
[{"Number":"xxxxxxx",
"MessageParts":[{"MsgId":"id",
"PartId":1,
"Text":"test msg"}]
}]}
Pero cuando lo hace la llamada en mi proyecto me sale el mismo mensaje exacto, pero el campo de texto viene así:
"Text":"test%20msg"
y el texto sended a que el teléfono está sended con el "20%", y eso no es lo que quiero, la respuesta está viniendo mal.
este es mi código de Java en el momento:
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);
esto son las cabeceras enviadas en el navegador:
Content-Type: text/html; charset=utf-8
Y después de usar Wireshark para obtener los paquetes Me pareció que esta es la cabecera enviado desde Java
Accept: text/html\r\n
Ya he intentado añadir la codificación UTF-8 juego de caracteres pero no funcionó, y yo creo que UTF-8 está configurado por defecto, así que no estoy seguro si ese es el problema, yo creo que tiene algo que ver con cabeceras no estoy seguro.
¡Gracias!
Lo más probable es que codifica la petición URI dos veces. Inicio al confirmar que body
no contiene %20
ya, asegúrese de que este es el mensaje de texto sin formato.
A continuación, convertir manualmente UriComponentsBuilder
a String
con:
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();
y confirman que contiene URI &msg=test%20msg
y no &msg=test%2520msg
. Se dan cuenta de que la doble codificación cambiará %
a %25
.