Android HTTP リクエスト ヘッダーとレスポンス ヘッダーについて学習する
このセクションの紹介:
前のセクションでは、Android に関係するネットワーク プログラミングについて学び、HTTP の基本概念も学びました。このセクションでは、 学習する必要があるのは、HTTP のリクエスト ヘッダーとレスポンス ヘッダーです。もちろん、このセクションをドキュメントとして扱い、必要なときに確認してください。 それでおしまい!
1. HTTP リクエスト ヘッダー:
以下の表に従って、関連するリクエスト ヘッダーの役割をご自身で感じてください。 PS: 最初の行はリクエスト行です: リクエストメソッド + リソース名 + HTTP プロトコルのバージョン番号 また、リクエストヘッダーはサーバーに対して 1 つだけです。 それは単なる情報であるか、それとも単純なものであるかについては、サーバーが決定します。
HTTP Request Headerリクエストヘッダ情報比較表:
Header | 説明 | 例 | ||
---|---|---|---|---|
Accept | クライアントが受信できるコンテンツタイプを指定する | 受け入れる: テキスト/ plain 、 text/html|||
Accept-Charset | ブラウザが受け入れることができる文字エンコードセット。Accept-Charset: iso-8859-5 | |||
Accept-Encoding | ブラウザがサポートできる、Web サーバーによって返されるコンテンツ圧縮エンコード タイプを指定します。Accept-Encoding: compress、gzip | |||
Accept-Language | Accept-Language: en,zh||||
Yes Web エンティティを要求する 1 つ以上のサブ範囲フィールド | Accept-Ranges: bytes||||
HTTP認可認可証明書 | 認可: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==||||
リクエストとその後のレスポンスを指定するキャッシュメカニズムを指定します | Cache-Control: no-cache||||
は、永続的な接続が必要かどうかを示します。 (HTTP 1.1 はデフォルトで永続接続を使用します) | Connection: close||||
HTTP リクエストが送信されると、リクエストされたドメイン名に保存されているすべての Cookie 値が Web サーバーに送信されます。:Cookie: $ Vering = 1; スキン = 新しい | コンテンツタイプ: application/x-www-form-urlencoded||||
Date | リクエストが送信された日時Date: 火曜日, 15 Nov 2010 08:12:31 GMT | |||
Expect | 特定のサーバー動作が要求されます予想: 100-Continue | |||
From | リクエストを行ったユーザーのメールアドレスFrom: user@email.com | |||
ホスト | リクエストされたサーバーのドメイン名とポート番号ホスト: www.zcmhi.com | |||
If-Match | リクエストの内容がエンティティと一致する場合のみ有効If-Match: "737060cd8c284d8af7ad3082f2 09582d " | |||
If-Modified-Since | 指定された時間後にリクエストされた部分が変更された場合、リクエストは成功します。変更されていない場合は、304 コードが返されますIf-Modified-Since: Sat, 29 Oct 2010 19: 43:31 GMT | |||
If-None-Match | コンテンツが変更されていない場合、パラメータはサーバーによって以前に送信された Etag と比較されます。 Etag は、変更されたかどうかを判断するためにサーバーによって応答されましたIf-None-Match: "737060cd8c284d8af7ad3082f209582d" | |||
If-Range | エンティティが変更されていない場合、サーバーはクライアントから不足している部分を送信します。それ以外の場合は、エンティティ全体を送信します。パラメーターも ETAG-IF-RANGE: "737060CD8C284D8AF7AD3082F209582D" です||||
はエンティティが変更されなかった場合にのみ正常にリクエストされます | If-UNMODIFIED-SINCE: SAT, 2 2010 年 10 月 9 日 19 :43:31 GMT | |||
プロキシとゲートウェイを介して情報が送信される時間を制限します | Max-Forwards: 10 | |||
は実装固有の内容を含めるために使用されますコマンド | Pragma: no-cache | |||
プロキシの認可証明書に接続 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== | |||
一部のみリクエストエンティティ、範囲を指定します | Range: bytes=500-999 | |||
前のWebページのアドレスに、現在リクエストされているWebページ、つまりソースが続きます | Referer: http:// blog.csdn.net/ coder_pig | |||
クライアントが受け入れ可能な転送エンコーディングであり、テールとヘッダー情報を受け入れるようにサーバーに通知します | TE: trailers,deflate;q=0.5 | |||
サーバーに指定します変換するサーバーのトランスポートプロトコル(サポートされている場合) | アップグレード: HTTP/2.0、SHTTP/1.3、IRC/6.9、RTA/x11 | |||
ユーザー エージェントのコンテンツには、リクエスト ユーザー情報 | ユーザー エージェント: Mozilla/5.0 (Linux; 1.1) | |||
メッセージ エンティティに関する警告情報 | 警告: 199 その他警告 |
Header | 説明 | Example | ||
---|---|---|---|---|
Accept-Ranges | サーバーが指定された範囲のリクエストをサポートするかどうか、およびセグメントの種類を示しますリクエスト | Accept-Range: バイト | ||
Age | オリジンサーバーからプロキシキャッシュ形成までの推定時間 (秒単位、非負) | Age: 12 | ||
Allow | ペアAは有効です特定のネットワーク リソースのリクエスト動作を許可しない場合は、405 が返されます。 | Allow: GET, HEAD no-cache | ||
Content-Encoding | Web サーバーによってサポートされている返されたコンテンツ圧縮エンコーディング タイプ。Content-Encoding: gzip | |||
応答本文の言語 | Content-Lang uage : en,zh | |||
応答本文の長さ | コンテンツレングス:348 | |||
Content-Location:/index.htm | content-md5 | |||
Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== | Content-Range | |||
Content-Range: バイト 21010-47021/47022 | Content-Type | |||
Content-Type: text/html; charset=utf-8 | Date | |||
Date:火曜日, 15 Nov 2010 08:12:31 GMT | ETag | |||
ETag: "737060cd8c284d8af7ad3082f209582d" | 有効期限 | |||
有効期限: Thu, 01 Dec 2010 16:00:00 GMT | Last-Modified | |||
Last-Modified: 火曜日, 15 Nov 2010 12:45 :26 GMT | 場所 | リクエストを完了するか新しいリソースを識別するために、受信者をリクエストされていない URL の場所にリダイレクトするために使用されます | 場所: http://blog.csdn.net/coder_pig | |
Pragma | が含まれます実装固有のディレクティブ。応答チェーン上の任意の受信者に適用できます。プロキシ | プロキシ - 認証: 基本 | ||
3. コード検証応答ヘッダーの役割:
FirstServletcom.jay.server.FirstServletFirstServlet/FirstServlet などのサーブレット クラス名を追加するだけで済みます。 1) Location を介してページのリダイレクトを実装します実装コード: package com.jay.http.test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletOne extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //告诉浏览器响应码,以及重定向页面 resp.setStatus(302); resp.setHeader("Location", "http://www.baidu.com"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } } 実行結果: にアクセスすると、http://localhost:8080/HttpTest/ServletOne が見つかります。ページは次の場所にジャンプします。百度、 次に、FireFox の開発者ツールを使用します: 送信した HTTP のコンテンツを確認できます: 2) Content-Encoding を通じてデータの圧縮形式をブラウザに伝えます実装コード: package com.jay.http.test; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletTwo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String data = "Fresh air and sunshine can have an amazing effect on our feelings. " + "Sometimes when we are feeling down, all that we need to do is simply to go " + "outside and breathe. Movement and exercise is also a fantastic way to feel better. " + "Positive emotions can be generated by motion. So if we start to feel down," + " take some deep breathes, go outside, feel the fresh air, " + "let the sun hit our face, go for a hike, a walk, a bike ride, " + "a swim, a run, whatever. We will feel better if we do this."; System.out.println("原始数据长度:" + data.getBytes().length); // 对数据进行压缩: ByteArrayOutputStream bout = new ByteArrayOutputStream(); GZIPOutputStream gout = new GZIPOutputStream(bout); gout.write(data.getBytes()); gout.close(); // 得到压缩后的数据 byte gdata[] = bout.toByteArray(); resp.setHeader("Content-Encoding", "gzip"); resp.setHeader("Content-Length", gdata.length + ""); resp.getOutputStream().write(gdata); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); }; } 実行結果たとえば、Xiaozhu はもともと、一連の静かな夜の詩を書きました。 、 後で、圧縮されたサイズが元のサイズよりもさらに大きいことがわかりました =-=... 3) content-type を通じて返されるデータ型を設定します サーバーが返すデータが text/html である場合もあります。画像/jpeg、またはビデオ/avi の場合があります。 ブラウザでは、対応するデータ型に応じてさまざまな方法でデータを表示できます。さて、ここで PDF を読み取るための 実装コードを取得します: package com.jay.http.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletThree extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("content-type", "application/pdf"); InputStream in = this.getServletContext().getResourceAsStream("/file/android编码规范.pdf"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = resp.getOutputStream(); while((len = in.read(buffer)) > 0) { out.write(buffer,0,len); } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,IOException { doGet(req, resp); }; } 実行結果: ブラウザに入力してください: http://localhost:8080/HttpTest/ServletThree わかりました、確かに、ちなみに、私はこの PDF をウェブルートのファイル ディレクトリに置きました。そうしないと null ポインタが報告されます~:もちろん、音楽やビデオを再生してみることもできます。変更するだけです Content-type は単なるパラメータです以下は HTTP Content-type の比較表です: 4) リフレッシュ応答ヘッダーを通じて、数秒後にブラウザに別のページにジャンプさせますまあ、一般的には、数秒ごとにページをリフレッシュしたり、数秒後に特定のページをロードしたりするなどのニーズがあるかもしれません 別のページにジャンプし、更新することでニーズを満たすことができます~ 実装コード: package com.jay.http.test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletFour extends HttpServlet { public int second = 0; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.浏览器每隔2秒定时刷新页面 // resp.setHeader("refresh", "2"); // resp.getWriter().write(++second + ""); // System.out.println("doGet方法被调用~"); //2.进入页面5s后,然页跳到百度~ resp.setHeader("refresh", "5;url='http://www.baidu.com'"); resp.getWriter().write("HE HE DA~"); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,IOException { doGet(req, resp); }; } 実行結果:
5) ブラウザーに content-dispostion 応答ヘッダーを通じてファイルをダウンロードさせます
実装コード: package com.jay.http.test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletFive extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("content-disposition", "attachment;filename=Android.pdf"); InputStream in = this.getServletContext().getResourceAsStream("/file/android编码规范.pdf"); byte buffer[] = new byte[1024]; int len = 0; OutputStream out = resp.getOutputStream(); while((len = in.read(buffer)) > 0) { out.write(buffer,0,len); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } 実行結果: このセクションの概要:
|