Spring RestTemplate JSON Ответ усечен - PullRequest
0 голосов
/ 24 января 2020

Я реализую REST-клиент, который необходим для выполнения вызовов для извлечения записей из виртуализированного хранилища данных с использованием Spring Boot 2.2.2.RELEASE, что означает, что в основе Spring Framework лежит 5.2.2.RELEASE.

My Проблема связана с обработкой ответов, поступающих с сервера. Когда я использую инфраструктуру Spring для обработки запроса и ответа, тело JSON удаляется.

Вот фрагмент последнего кода, который я пробовал:

ClientHttpRequestFactory factory = new BufferingClientHttpRequestFactory(new        HttpComponentsClientHttpRequestFactory(httpClient))
RestTemplate rt = restTemplateBuilder
                  .basicAuthentication(username, password)
                  .build()
rt.setRequestFactory(factory)
String uriString = targetString
final String response = rt.getForObject(uriString,String.class)
 println("Response: ${response}")

Это должен возвращать полезную нагрузку JSON в виде строки (только для целей тестирования), которая выглядит примерно так (важные данные были отредактированы):

  "Salesforce_Truck_TripsResponse": {
    "Salesforce_Truck_TripsResult": {
      "row": [
        {
          "TICKET_NUMBER": "06805",
          "SCALE_TICKET_NUMBER": null,
          "PRODUCTION_DATE": "2019-10-01T00:00:00.000Z",
          "TRUCK_UNIT_NUMBER": "60028",
          "TICKET_PRODUCT": "EMULSION",
          "TICKET_TYPE": "O",
          "INTERNAL_FLAG": "Y",
          "TRUCK_CONFIGURATION": "B3X",
          "FLUID_VOLUME": 6.0000000000,
          "BATTERY_LOCATION": "hidden",
          "BATTERY_NAME": "hidden",
          "TO_FROM_LOCATION": "hidden",
          "TO_FROM_NAME": "hidden",
          "EXT_LOC_NAME": null,
          "EXT_LOC": null,
          "FIELD_NAME": "hidden",
          "VENDOR_NAME": "Some Vendor"
        },
        {.....more of the same (many, many, more) },....
      ]
    }
  }
}

Вместо этого я получаю следующее:

Response: {"Salesforce_Truck_TripsResponse":{"Salesforce_Truck_TripsResult":[]}}

Когда я использую следующий код:

String username = username
String password = password
String authString = "${username}:${password}"
byte[] authEnvBytes = Base64.encoder.encode(authString.getBytes())
String authStringEnc = new String(authEnvBytes)

URL url = new URL(targetString)
HttpURLConnection conn = (HttpURLConnection)url.openConnection()
conn.setRequestProperty("Authorization","Basic ${authStringEnc}")
conn.setRequestMethod("GET")
conn.setRequestProperty("Accept","application/json")

if(conn.getResponseCode() != 200){
    throw new RuntimeException("Failed!: HTTP error code: ${conn.getResponseCode()}")
}

String responseBody = StreamUtils.copyToString(conn.getInputStream(), Charset.defaultCharset())
println responseBody

Я получаю то, что ожидал.

Я пытался использовать разные опции ClientHttpRequestFactory, чтобы определить, является ли это проблемой буферизации, нет удачи.

Я пытался использовать все MessageConverter в библиотеке Spring, тоже не повезло.

Я реализовал Interceptor на RestTemplate для вывода информации о запросах и ответах согласно: https://objectpartners.com/2018/03/01/log-your-resttemplate-request-and-response-without-destroying-the-body/ сообщение в блоге.

Мои заголовки ответов выглядят следующим образом:


HTTP/1.1 200 OK
Date: Fri, 24 Jan 2020 20:48:59 GMT
Pragma: no-cache
Cache-Control: no-cache, no-store, must-revalidate
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self' data:; script-src 'self' data: 'unsafe-inline' 'unsafe-eval'; style-src 'self' data: 'unsafe-inline'; connect-src *
Strict-Transport-Security: max-age=31536000; includeSubDomains
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked

Я нахожусь в точке, где я просто собираюсь добавить свой рабочий код внутрь один из вызывающих методов и использовать его, но Я хотел посмотреть, не упускаю ли я какую-то простую проблему конфигурации в Spring Framework.

Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...