Android HTTP リクエスト ヘッダーとレスポンス ヘッダーについて学習する


このセクションの紹介:

前のセクションでは、Android に関係するネットワーク プログラミングについて学び、HTTP の基本概念も学びました。このセクションでは、 学習する必要があるのは、HTTP のリクエスト ヘッダーとレスポンス ヘッダーです。もちろん、このセクションをドキュメントとして扱い、必要なときに確認してください。 それでおしまい!


1. HTTP リクエスト ヘッダー:

以下の表に従って、関連するリクエスト ヘッダーの役割をご自身で感じてください。 PS: 最初の行はリクエスト行です: リクエストメソッド + リソース名 + HTTP プロトコルのバージョン番号 また、リクエストヘッダーはサーバーに対して 1 つだけです。 それは単なる情報であるか、それとも単純なものであるかについては、サーバーが決定します。

1.png


HTTP Request Headerリクエストヘッダ情報比較表:

受け入れる: テキスト/ plain 、 text/htmlブラウザが受け入れることができる文字エンコードセット。 Accept-Charset: iso-8859-5ブラウザがサポートできる、Web サーバーによって返されるコンテンツ圧縮エンコード タイプを指定します。 Accept-Encoding: compress、gzipAccept-Language: en,zhAccept-RangesAccept-Ranges: bytesAuthorization認可: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==キャッシュ制御Cache-Control: no-cacheConnectionConnection: closeCookieコンテンツタイプ: application/x-www-form-urlencodedリクエストが送信された日時Date: 火曜日, 15 Nov 2010 08:12:31 GMT特定のサーバー動作が要求されます予想: 100-Continueリクエストを行ったユーザーのメールアドレスFrom: user@email.comリクエストされたサーバーのドメイン名とポート番号ホスト: www.zcmhi.comリクエストの内容がエンティティと一致する場合のみ有効If-Match: "737060cd8c284d8af7ad3082f2 09582d " 指定された時間後にリクエストされた部分が変更された場合、リクエストは成功します。変更されていない場合は、304 コードが返されますIf-Modified-Since: Sat, 29 Oct 2010 19: 43:31 GMT コンテンツが変更されていない場合、パラメータはサーバーによって以前に送信された Etag と比較されます。 Etag は、変更されたかどうかを判断するためにサーバーによって応答されましたIf-None-Match: "737060cd8c284d8af7ad3082f209582d" エンティティが変更されていない場合、サーバーはクライアントから不足している部分を送信します。それ以外の場合は、エンティティ全体を送信します。パラメーターも ETAG-IF-RANGE: "737060CD8C284D8AF7AD3082F209582D" です If-UNMODIFIED-SINCEMax-ForwardsPragmaProxy-Authorization範囲RefererTEアップグレードUser-エージェント警告

2.HTTP 応答の応答ヘッダー:

前のセクションの図も示します。 PS: 最初の行は次のとおりです: プロトコルのバージョン番号、ステータス コード 302 は、ここでは利用できないことを意味しますが、別の場所では利用可能であり、場所ページからリダイレクトされます

2.png

HTTP 応答ヘッダー 応答ヘッダー情報の比較表:

Header説明
Acceptクライアントが受信できるコンテンツタイプを指定する
Accept-Charset
Accept-Encoding
Accept-Language
Yes Web エンティティを要求する 1 つ以上のサブ範囲フィールド
HTTP認可認可証明書
リクエストとその後のレスポンスを指定するキャッシュメカニズムを指定します
は、永続的な接続が必要かどうかを示します。 (HTTP 1.1 はデフォルトで永続接続を使用します)
HTTP リクエストが送信されると、リクエストされたドメイン名に保存されているすべての Cookie 値が Web サーバーに送信されます。:Cookie: $ Vering = 1; スキン = 新しい
Date
Expect
From
ホスト
If-Match
If-Modified-Since
If-None-Match
If-Range
はエンティティが変更されなかった場合にのみ正常にリクエストされます 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 その他警告
Web サーバーによってサポートされている返されたコンテンツ圧縮エンコーディング タイプ。 Content-LanguageContent-LengthContent-Location-Requestリソース代替代替アドレスリソースリターンボディ全体 この部分のバイト位置コンテンツの MIME タイプを返します元のサーバーメッセージが送信された時刻リクエスト変数のエンティティタグの現在値応答の有効期限と時間リクエストされたリソースの最終変更時刻
Header説明Example
Accept-Ranges サーバーが指定された範囲のリクエストをサポートするかどうか、およびセグメントの種類を示しますリクエストAccept-Range: バイト
Age オリジンサーバーからプロキシキャッシュ形成までの推定時間 (秒単位、非負) Age: 12
Allow ペアAは有効です特定のネットワーク リソースのリクエスト動作を許可しない場合は、405 が返されます。Allow: GET, HEAD no-cache
Content-EncodingContent-Encoding: gzip
応答本文の言語Content-Lang uage : en,zh
応答本文の長さコンテンツレングス:348
Content-Location:/index.htmcontent-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 GMTETag
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. コード検証応答ヘッダーの役割:

さて、たくさんの概念を読んだ後、それを行わずにどうすればよいでしょうか?そうですね、簡単なコードを書いていくつかのことを確認しましょう。 理解を深めるために、一般的に使用される応答ヘッダーの機能を見てみましょう。そうでない場合、サーバーは最も単純なサーブレットを使用して実装します。 Java Web フレンドは、コードをコピーし、web.xml を構成し、対応するクラス名に

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 のコンテンツを確認できます:

3.png

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 を通じて返されるデータ型を設定します4.png

サーバーが返すデータが text/html である場合もあります。画像/jpeg、またはビデオ/avi の場合があります。 ブラウザでは、対応するデータ型に応じてさまざまな方法でデータを表示できます。さて、ここで PDF を読み取るための

5.png

実装コード

を取得します:

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);
	};
}

6.png実行結果:

ブラウザに入力してください: http://localhost:8080/HttpTest/ServletThree

わかりました、確かに、ちなみに、私はこの PDF をウェブルートのファイル ディレクトリに置きました。そうしないと null ポインタが報告されます~:

もちろん、音楽やビデオを再生してみることもできます。変更するだけです Content-type は単なるパラメータです

以下は HTTP Content-type の比較表です:

HTTP Content-type 比較表

7.png

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);
	};
}

実行結果:

  • 1 ページが 2 秒ごとに更新されると、表示が確認できます。数値は増加しています。 、そして doGet メソッドも常に呼び出されます。 説明ページが本当に新しくなりました!
  • 2. ページに入ってから 5 秒後に Baidu にジャンプします~

5) ブラウザーに content-dispostion 応答ヘッダーを通じてファイルをダウンロードさせます

これは非常に簡単で、設定するだけです。 ③の Content-type 行を削除し、次を追加します: resp.setHeader("content-disposition", "attachment;filename=Android.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 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);
	}
}

実行結果:

8.png


このセクションの概要:

このセクションでは、HTTP の要求ヘッダーと応答ヘッダーについて紹介し、ブラウザーを調整するための応答ヘッダーの使用例もいくつか書きます。 この章を終えると、誰もが Http プロトコルについてより深く理解できるようになると思います。次のセクションでは、Android が提供する Http について学びます。 リクエストメソッド: HttpURLConnection!さて、このセクションはこれで終わりです、ありがとう~ ちなみに、このセクションのデモをダウンロードしてください: HttpTest.zip をダウンロード