Получение необработанных заголовков ответов HTTP
есть ли способ получить необработанный HTTP-заголовок ответа?
на getHeaderField()
метод не работает для меня, потому что сервер плюет несколько "Set-Cookie", и некоторые из них теряются.
4 ответов
на
getHeaderField()
метод не работает для меня
вы спрашиваете об этом в контексте java.net.URLConnection
, не так ли? Нет, получение необработанных заголовков HTTP-ответов невозможно с помощью URLconnection
. Вам нужно будет вернуться на низкий уровень гнездо Программирование. Вот это SSCCE, просто скопируйте'paste-эн-эн чувак он.
package com.stackoverflow.q2307291;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class Test {
public static void main(String[] args) throws IOException {
String hostname = "stackoverflow.com";
int port = 80;
Socket socket = null;
PrintWriter writer = null;
BufferedReader reader = null;
try {
socket = new Socket(hostname, port);
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.println("GET / HTTP/1.1");
writer.println("Host: " + hostname);
writer.println("Accept: */*");
writer.println("User-Agent: Java"); // Be honest.
writer.println(""); // Important, else the server will expect that there's more into the request.
writer.flush();
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
for (String line; (line = reader.readLine()) != null;) {
if (line.isEmpty()) break; // Stop when headers are completed. We're not interested in all the HTML.
System.out.println(line);
}
} finally {
if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
if (writer != null) { writer.close(); }
if (socket != null) try { socket.close(); } catch (IOException logOrIgnore) {}
}
}
}
чтобы избежать перегрузки всеми, кто пытается этот фрагмент, вот как будет выглядеть вывод например:
HTTP/1.1 200 OK Cache-Control: private Content-Type: text/html; charset=utf-8 Expires: Sun, 21 Feb 2010 20:39:08 GMT Server: Microsoft-IIS/7.5 Date: Sun, 21 Feb 2010 20:39:07 GMT Connection: close Content-Length: 208969
чтобы узнать больше о отправке HTTP-запросов низкоуровневым способом, прочитайте спецификация HTTP.
тем не менее, вы, вероятно, хотите использовать getHeaderFields()
метод вместо этого, чтобы получить заголовок с несколькими значениями. The getHeaderField()
namely возвращает только последнее значение, согласно связанному документу API.
List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
не совсем "сырой", но лаконично:
for (Map.Entry<String, List<String>> k : myHttpURLConnection.getHeaderFields().entrySet()) {
System.out.println(k.toString());
}
Если вы беспокоитесь, что некоторые из заголовков теряются, используйте:
for (Map.Entry<String, List<String>> k : myHttpURLConnection.getHeaderFields().entrySet()) {
for (String v : k.getValue()){
System.out.println(k.getKey() + ":" + v);
}
}
PS: лучше поздно, чем никогда. :)
простой способ-использовать getHeaderFields()
метод URLConnection
. Вот какой-то код, который делает что-то эквивалентное.
static String[] getHeaders(HttpURLConnection con, String header) {
List<String> values = new ArrayList<String>();
int idx = (con.getHeaderFieldKey(0) == null) ? 1 : 0;
while (true) {
String key = con.getHeaderFieldKey(idx);
if (key == null)
break;
if (header.equalsIgnoreCase(key))
values.add(con.getHeaderField(idx));
++idx;
}
return values.toArray(new String[values.size()]);
}
опоздал на вечеринку, но вот самое простое решение. Просто реализовать CookieStore. (или используйте реализацию по умолчанию и позвольте ей позаботиться о добавлении cookies к вашим последующим вызовам.)
http://docs.oracle.com/javase/7/docs/api/java/net/CookieStore.html
установите cookie store в качестве менеджера файлов cookie по умолчанию
CookieManager cookieManager = new CookieManager(new MyCookieStore(), CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(cookieManager);
и каждый новый файл cookie появится в add () в вашем CookieStore. У меня была такая же проблема с params перезаписывается с тем же именем "Set-Cookie" в одном запросе, и теперь я получаю как cookie, так и sessionId.