Как избежать экранирования строки в шаблоне postteObject - PullRequest
0 голосов
/ 21 сентября 2018

Наличие клиента должно отправлять обычную строку json в службу RESTful:

    ...
    final Gson gson = new GsonBuilder().create();
    final String payload = gson.toJson(data);

    final RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

    final HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    final HttpEntity<String> entity = new HttpEntity<>(payload, headers);

    restTemplate.postForObject("http://localhost:8080/data/bulk", entity, Void.class);
    ...

Созданный json GSON выглядит следующим образом:

{ "id" : { "poid" : "5b70cabhsdf66d99sdakfj37e45" } ... }

Служба REST теперь получает запрос:

@RequestMapping(value = "/data/bulk", method = RequestMethod.POST)
public ResponseEntity<Void> bulkInbound(@RequestBody final String bulkjson) {

Но строка в теле запроса, которая должна быть точно такой же, как и созданный JSON, выглядит так:

{ \"id\" : { \"poid\" : \"5b70cabhsdf66d99sdakfj37e45\" } ... }

Таким образом, строка в теле экранируется, что создает некоторые проблемы,Отправка той же строки json через POSTMAN ist работает как чудо, без экранирования.Как я могу сказать resttemplate в моем клиенте, чтобы он не экранировал мою строку?

1 Ответ

0 голосов
/ 24 сентября 2018

Итак, потратив много времени на исследования, я думаю, что это лучший способ использовать JSONObject для этого.Мое решение выглядит так:

...
final JSONObject jsonobject = new JSONObject(data);

final RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));

final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

final HttpEntity<String> entity = new HttpEntity<>(jsonobject.toString(), headers);

restTemplate.postForObject("http://localhost:8080/data/bulk", entity, Void.class);
...

Это работает для меня и решает мою проблему с выходом строки.

...