6 Stimmen

Bester Weg zum Parsen von HTTP-Headern aus dem HTTP-Request-String ohne Drittanbieter-Libs (Core Java)

Hat jemand angesichts eines HTTP-Anfrage-Headers Vorschläge oder kennt er vorhandenen Code, um den Header richtig zu analysieren? Ich versuche, dies nur mit Core Java zu tun, keine Drittanbieter-Bibliotheken

Bearbeiten:

Ich versuche zum Beispiel, Schlüsselfelder aus diesem String zu finden:

GET / HTTP/1.1Benutzer-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15Host: localhost:9000Accept: /

Sie möchten die Methode und die Methode auswerten

5voto

Renato Punkte 11611

Ich habe eine Bibliothek geschrieben, RawHTTP dessen einziger Zweck es ist, HTTP-Nachrichten (Anfragen und Antworten) zu parsen.

Wenn Sie keine Bibliothek verwenden wollen, können Sie den Quelltext in Ihre eigene Codebasis kopieren, indem Sie so vorgehen: https://github.com/renatoathaydes/rawhttp/blob/a6588b116a4008e5b5840d4eb66374c0357b726d/rawhttp-core/src/main/java/com/athaydes/rawhttp/core/RawHttp.java#L52

Dadurch werden die Zeilen der HTTP-Nachricht bis zum Ende der Metadatenabschnitte (Startzeile + Header) aufgeteilt.

Wenn Sie die Liste der Metadatenzeilen zur Hand haben, können Sie dann die Funktion parseHeaders Methode, die die Kopfzeilen für Sie erstellt. Sie können das leicht anpassen, um einfach eine Map<String, List<String>> um zu vermeiden, dass auch die Header-Klassen importiert werden müssen.

Davon abgesehen... RawHTTP hat keine Abhängigkeiten, so würde ich nur es stattdessen verwenden :) aber bis zu Ihnen.

4voto

parsifal Punkte 49

Beginnen Sie mit dem Lesen und Verstehen der HTTP-Spezifikation .

Die Anforderungszeile und die Kopfzeilen sind durch CR-LF-Sequenzen (Bytes mit dem Dezimalwert 13 und 10) getrennt, so dass Sie den Datenstrom lesen und die einzelnen Zeilen auseinanderhalten können. I glauben dass die Kopfzeilen in US-ASCII kodiert sein müssen. Sie können also einfach Bytes in Zeichen umwandeln und an eine StringBuilder (aber überprüfen Sie die Spezifikation: sie kann ISO-8859-1 oder eine andere Kodierung erlauben).

Das Ende der Kopfzeilen wird durch CR LF CR LF gekennzeichnet.

4voto

Jin Kwon Punkte 18020

Ihre verkettete einzeilige Zeichenfolge ist kein HTTP-Header.

Eine korrekte HTTP-Anforderungsnachricht sollte wie folgt aussehen (nicht immer)

GET / HTTP/1.1 CRLF
Host: localhost:9000 CRLF
User-Agent: curl/7.19.7 blar blar CRLF
Accept: */* CRLF
Content-Length: ?? CRLF
...: ... CRLF
CRLF
octets

Siehe hier http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

Wenn Sie einen HTTP-Server ohne die Hilfe von Sevlets oder JavaEE-Containern implementieren wollen, sollten Sie Sockets verwenden.

  1. Lesen Sie die erste Zeile [Request-Line = Methode SP Request-URI SP HTTP-Version CRLF]
  2. Lesen Sie die Kopfzeile der Anfrage Zeile für Zeile, bis Sie die leere Zeile haben
  3. Für jede Kopfzeile können Sie [fieldName: fieldValue] parsen
  4. Lesen Sie den Entitätskörper.

Dies ist NICHT der einzige Fall für HTTP-Nachrichtenverträge.

0voto

amadib Punkte 858

Ich verwende die Guava-Bibliothek, um Vorbedingungen für meine Methoden einzufügen. Sie können sie zu Gunsten von Null-Prüfungen entfernen.

  /**
   * @return a string consisting of the HTTP headers, concatenating the keys and values delimited by
   * CFLR (empty line) capable of serialization to the database.
   */
  public static final String httpHeadersToString(final HttpResponse httpResponse) {
    Preconditions.checkNotNull(httpResponse);
    Preconditions.checkNotNull(httpResponse.getAllHeaders());

    final Header[] allHeaders = httpResponse.getAllHeaders();
    StringBuffer sb = new StringBuffer();
    int index = 0;
    while(index < allHeaders.length) {
      Header header = allHeaders[index];

      sb.append(header.getName())
         .append(System.getProperty("line.separator"))
         .append(header.getValue());

      if (++index < allHeaders.length) {
        sb.append(System.getProperty("line.separator"));
      }
    }
    return sb.toString();
  }

  /**
   * @return reconstruct HTTP headers from a string, delimited by CFLR (empty line).
   */
  public final HttpHeaders stringToHttpHeaders(final String headerContents) {
    HttpHeaders httpHeaders = new HttpHeaders();
    final String[] tempHeaderArray = headerContents.split(System.getProperty("line.separator"));
    int i = 0;
    while (i + 1 <= tempHeaderArray.length) {
      httpHeaders.add(tempHeaderArray[i++], tempHeaderArray[i++]);
    }
    return httpHeaders;
  }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X