Не могу сделать правильный запрос Rest Template - PullRequest
0 голосов
/ 01 февраля 2019

Так что я вызываю API (этот API используется для отправки SMS) в моем проекте Java с использованием GET.

Это URL 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);

это заголовки, отправленные в браузере:

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

И после использования wireshark для получения пакетов я обнаружил, что это заголовок, отправленный с Java

Accept: text/html\r\n

Я уже пытался добавить кодировку UTF-8, но она не работала, и я думаю, что utf-8 установлен по умолчанию, поэтому я не уверен, что это проблема, я думаю, что это как-то связано с заголовками imТочно сказать не могу.

Спасибо!

1 Ответ

0 голосов
/ 01 февраля 2019

Скорее всего, вы кодируете 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.

...