Частичное содержимое транслируется из URL-соединения Java - PullRequest
0 голосов
/ 22 февраля 2019

У меня возникают проблемы с постоянным получением всего тела запросов, * https://trainingapply.grants.gov/apply/opportunities/schemas/applicant/PKG00037270/Project.xsd из моего Java-приложения.Иногда я получаю все тело.В других случаях я получаю первые 4072 символа, и тело заканчивается.Я пробовал следующие подходы:

//core java
try {
  URLConnection urlConnection = new URL(schemaUrl).openConnection();
  StringBuilder schema = new StringBuilder();
  String line;

  try (BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"))) {
    while ((line = br.readLine()) != null) {
      schema.append(line);
    }
  }

  return schema.toString();
} catch (IOException e) {
  //[error handling]
}
//Apache commons
return IOUtils.toString(new URL(schemaUrl), "UTF-8");

И использование библиотеки Apache HttpComponents с тем же результатом.Как ни странно, Postman, мой браузер и curl возвращают согласованное и полное тело, так что это должно быть специфично для Java.Я использую java 1.8.0_181.

Интересно, что при свертывании этого URL существует граница сетевого пакета прямо на 4072 байта в контент, который выглядит следующим образом:

<= Recv data, 4072 bytes (0xfe8)
0000: <?xml version="1.0" encoding="UTF-8"?>
...
...
0fb4:                <xsd:complexType>
0fd6:                   
<= Recv data, 2688 bytes (0xa80)
0000:  <xsd:sequence>
0011: ..             <xsd:element name="SubApplicationGroupID" type="x

ItМне ясно, что эти другие клиенты обрабатывают этот запрос правильно, в то время как встроенные Java-примитивы не всегда извлекаются до конца длины содержимого, объявленной в заголовках.Вот заголовки для вашей справки:

=> Send header, 149 bytes (0x95)
0000: GET /apply/opportunities/schemas/applicant/PKG00037270/Project.x
0040: sd HTTP/1.1
004d: Host: trainingapply.grants.gov
006d: User-Agent: curl/7.54.0
0086: Accept: */*
0093: 
<= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
<= Recv header, 24 bytes (0x18)
0000: Connection: Keep-Alive
<= Recv header, 37 bytes (0x25)
0000: Date: Thu, 21 Feb 2019 20:50:04 GMT
<= Recv header, 18 bytes (0x12)
0000: Pragma: no-cache
<= Recv header, 22 bytes (0x16)
0000: Content-Length: 6760
<= Recv header, 39 bytes (0x27)
0000: Content-Type: text/xml; charset=UTF-8
<= Recv header, 40 bytes (0x28)
0000: Expires: Thu, 01 Jan 1970 00:00:00 GMT
<= Recv header, 33 bytes (0x21)
0000: X-XSS-Protection: 1; mode=block
<= Recv header, 21 bytes (0x15)
0000: X-ORACLE-DMS-RID: 0
<= Recv header, 33 bytes (0x21)
0000: X-Content-Type-Options: nosniff
<= Recv header, 114 bytes (0x72)
0000: Set-Cookie: JSESSIONID=M6AR0orf2aDdcnmBu-LHOBRL4pjuVTRhx_n-uj-2a
0040: p7OSBVfCuVG!1960121785; path=/; secure; HttpOnly
<= Recv header, 66 bytes (0x42)
0000: X-ORACLE-DMS-ECID: 7241b3bd-75bf-48a0-85e6-57059f2a08da-007a0021
<= Recv header, 35 bytes (0x23)
0000: X-Powered-By: Servlet/3.1 JSP/2.3
<= Recv header, 29 bytes (0x1d)
0000: X-Frame-Options: SAMEORIGIN
<= Recv header, 45 bytes (0x2d)
0000: Strict-Transport-Security: max-age=31536000
<= Recv header, 2 bytes (0x2)
0000: 

Есть идеи, что здесь происходит?

1 Ответ

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

Оказывается, мое приложение выполняло много вызовов этой общей службе в быстрой последовательности, а иногда и по одному и тому же URL несколько раз.В этом случае кажется, что сервер закрывал соединение, и поэтому ответ был усечен.Я поместил кеширование вокруг извлечения этих URL-адресов, и проблема, похоже, ушла, поэтому ничего общего с библиотеками или тем, как я их использовал, но сетевое соединение закрывалось без какой-либо обратной связи или предупреждения.

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