ich nicht den Wert in diesem Verfahren Zurückgeben einer Karte < Listen <String> > anstatt einfach Karte < String sehen, String >Was den Punkt der URLConnection.getHeaderFields() Zurückgeben eines Map <String, List <String>>
ich erwartete Karte < Listen <String> > von Wert zu sein, wenn ein Web-Server mehr als einen Wert in einem bestimmten Header zurückgibt. Es ist zulässig, dass mehrere Werte als kommagetrennte Liste zurückgegeben werden. Das habe ich am häufigsten mit Cache-Control gesehen. Ich würde erwarten, dass jeder Wert ein Element in der Liste ist. Aber das ist nicht der Fall:
import java.net.*;
import java.io.*;
import java.util.*;
class URLConnectionDemo {
private static final String DEFAULT_URL = "http://stackoverflow.com";
public static void main(String[] args) {
URL url;
URLConnection urlConnection;
try {
url = new URL((args.length==0) ? DEFAULT_URL : args[0]);
urlConnection = url.openConnection();
Map<String, List<String>> headerMap = urlConnection.getHeaderFields();
System.out.printf("Header count = %d\n", headerMap.size());
for(String key:headerMap.keySet()){
System.out.printf("%s:\n", key);
List<String> valuesList = headerMap.get(key);
for(String value:valuesList){
System.out.printf(" %s\n", value);
}
}
} catch (IOException e) {
System.out.println(e);
}
}
}
Ausgang:
Header count = 19
null:
HTTP/1.1 200 OK
....many other headers....
Cache-Control:
public, max-age=7
Die Cache-Control-Werte werden nur als ein einziger String zurückgegeben.
Also, gibt es irgendwelche Umstände, wo der Header-Wert Liste <String> von Nutzen ist?
Lösung:
ich ein Servlet auf Tomcat bin mit duplizierten http-Response-Header, um zu versuchen & zu erzeugen.
Im Servlet-Code, wiederholte Aufrufe mit HttpServletResponse.addHeader() mit duplizierten Header-Namen funktioniert nicht. Alle Header-Werte werden in einem einzelnen kommagetrennten Wert konsolidiert.
Dies ist jedoch nicht zum Hinzufügen von Cookies zulässig. Wenn ich HttpServletResponse.addCookie() mehrmals verwende, erhalte ich mehrere verschiedene Set-Cookie-Header. Diese enden tatsächlich als verschiedene Strings in der Liste.
Wenn Sie fragen, warum die API auf diese Weise entworfen wurde, wird niemand in der Lage sein, eine definitive Antwort zu haben und die Frage auf der Grundlage von Meinungen zu formulieren. Weitere Informationen finden Sie unter [fragt nach "warum" in den Sprachspezifikationen, die immer noch als "primär auf Meinungen basieren", wenn sie offizielle Antworten haben können?] (Http://meta.stackoverflow.com/a/323382/1743880) und [Ist es subjektiv zu fragen, warum etwas in der Sprache nicht implementiert wurde?] (http://meta.stackoverflow.com/a/293819/1743880) – Tunaki
Technisch gesprochen, ist es zulässig, HTTP-Header-Schlüssel zu wiederholen. Semantisch entspricht es einer Kommakettung. – chrylis
@Tunaki In diesem Fall gibt es einen einfachen objektiven Grund. – EJP