Я реализую 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.
Любая помощь будет принята с благодарностью.