String urlString = "http://127.0.0.1:8443/paxa/callback?abc=abc";
private final String USER_AGENT = "Mozilla/5.0";
URL myUrl = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) myUrl.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode();
На консоли:
Exception in thread "main" java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1569)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
На локальном java сервере (с другого проекта IDE) этот запрос дважды:
parametres = /paxa/callback?abc=abc
parametres = /paxa/callback?abc=abc
Если отправить без параметров, т.е.
String urlString = "http://127.0.0.1:8443/paxa/callback";,
то всё ОК. И запрос на сервере не дублируется.
UPD: Оказалось, проблема в сервере. Клиент get-запрос в Google производит без ошибок. Класс реализует HttpHandler. Привожу код:
public void handle(HttpExchange t) throws IOException {
OutputStream os = t.getResponseBody();
String getQuery = t.getRequestURI().getQuery();
if (getQuery != null) {
Map<String, String> getParametres = parseQueryString(getQuery);
t.sendResponseHeaders(HttpURLConnection.HTTP_OK, 0L);
} else {
byte[] response = "Error GET!".getBytes();
t.sendResponseHeaders(HttpURLConnection.HTTP_OK, response.length);
}
}
myUrl.openConnection() возвращает реализацию интерфейса потокового URLConnection (Input/Output Stream). Для того, чтобы стрим не рвался стоит явно указывать Keep-Alive с таймаутом:
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Keep-Alive", "header");
con.setConnectTimeout(60000);
Если это не помогает, то проблема явно на сервере. Для отладки нужно вывести InputStream ответа от сервера в случае ошибки.
con.getErrorStream()
Проверил на локально развернутой jirа. Ошибки разрыва соединения не возникает (responseCode: 200).
String urlString = "http://localhost:8080/browse/CAT-1?filter=-3";
String USER_AGENT = "Mozilla/5.0";
URL myUrl = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) myUrl.openConnection();
InputStream errInputStream = con.getErrorStream();
try {
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", USER_AGENT);
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Keep-Alive", "header");
con.setConnectTimeout(60000);
int responseCode = con.getResponseCode();
System.out.println("responseCode: " + responseCode);
} catch (Exception e) {
StringWriter writer = new StringWriter();
IOUtils.copy(errInputStream, writer, "utf-8");
String theString = writer.toString();
System.out.println("Error: " + theString);
}
Доп пакет: org.apache.commons.io.IOUtils
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости