5

HTTP 要求ヘッダーが与えられた場合、ヘッダーを適切に解析するための提案や既存のコードを知っている人はいますか? 私はコアJavaのみでこれを行おうとしています。サードパーティのライブラリはありません

編集:

たとえば、この文字列からキー フィールドを見つけようとしています。

GET / HTTP/1.1User-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: /

メソッドとメソッドを解析したい

4

4 に答える 4

4

HTTP 仕様を読んで理解することから始めます。

要求行とヘッダーは CR LF シーケンス (10 進値 13 と 10 のバイト) で区切られているため、ストリームを読み取って各行を分離できます。ヘッダーは US-ASCIIでエンコードする必要があるため、単純にバイトを文字に変換して に追加できますStringBuilder(ただし、仕様を確認してください: ISO-8859-1 または別のエンコードが許可される場合があります)。

ヘッダーの終わりは、CR LF CR LF で示されます。

于 2012-08-16T14:54:12.917 に答える
2

連結された 1 行の文字列は HTTP ヘッダーではありません。

適切な HTTP 要求メッセージは次のようになります (常にではありません)。

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

ここを参照してください http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html

サーブレット、JavaEE コンテナーの助けを借りずに HTTP サーバーを実装する場合は、ソケットを使用する必要があります。

  1. 最初の行を読む [Request-Line = Method SP Request-URI SP HTTP-Version CRLF]
  2. 空白行が表示されるまで、リクエスト ヘッダーを 1 行ずつ読み取ります
  3. ヘッダー行ごとに [fieldName: fieldValue] を解析できます
  4. エンティティ本体を読み取ります。

これは、HTTP メッセージ コントラクトの唯一のケースではありません。

于 2012-08-16T14:59:40.187 に答える