PHPを使用してHTTPリクエストメッセージを処理する

HTTPリクエストタイプ

HTTPプロトコルは、OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECTなど、さまざまなタイプのリクエストを定義します。詳細は次のとおりです。

  • オプション:特定のリソースに対してサーバーでサポートされているHTTPリクエストメソッドを返します。「*」の要求をWebサーバーに送信して、サーバーの機能をテストすることもできます。

  • HEAD:GET要求と一致する応答をサーバーに要求しますが、応答本文は返されません。この方法では、応答コンテンツ全体を送信しなくても、応答ヘッダーに含まれていないメタ情報を取得できます。

  • GET:特定のリソースにリクエストを送信します。

  • POST:リクエストを処理するために特定のリソースにデータを送信します(フォームの送信やファイルのアップロードなど)。データはリクエスト本文に含まれています。POSTリクエストにより、新しいリソースが作成されたり、既存のリソースが変更されたりする場合があります。

  • PUT:最新のコンテンツを指定されたリソースの場所にアップロードします。

  • DELETE:指定されたリソースを削除するようサーバーに要求します

  • TRACE:サーバーが受信した要求をエコーし​​ます。主にテストまたは診断に使用されます。

  • 接続:HTTP / 1.1プロトコルは、接続をパイプモードに変更できるプロキシサーバー用に予約されています。

実際のアプリケーションで一般的に使用しているのはgetとpostであり、他のリクエストメソッドもgetとpostを介して間接的に実装できます。

GETリクエストとPOSTリクエストの違い

  • GETによって送信されたデータは、HTTP要求メッセージのURLに配置されます。URLを分離してデータを転送し、/ Response / get?key1 = value1&key2 = value2などのパラメータを&で接続します。POSTは、送信されたデータをHTTP要求メッセージの本文に入れます。

  • GETによって送信されるデータのサイズは制限されていますが、POSTメソッドによって送信されるデータは制限されていません。

  • GETは_GET ["key"]を使用する必要があり、POSTは、_POST ["key"]を使用するか、php:// inputストリームを読み取るか、HTTP_RAW_POST_DATA定数を読み取ることによって実装されます。

HTTPリクエストメッセージの構造

HTTPリクエストの構造を次の図に示します。 
ここに写真の説明を書いてください

  • リクエストラインには、HTTPリクエストタイプ(GET、POSTなど)、リクエストURL、Httpバージョン番号が含まれます。 
    「GET」メソッドを使用する場合、本文は空です。

  • HTTPリクエストヘッダーには、HTTPリクエスト操作パラメータが含まれています。ヘッダー属性は、送信されるデータのさまざまな特性を定義します。

  • HTTPリクエスト本文には、リクエストで運ばれるその他の情報が含まれています

HTTPリクエストヘッダー

HTTPリクエストヘッダーには次のものが含まれます。

  • キャッシュヘッダー

  • クライアントヘッダー

  • Cookie /ログインヘッダーフィールド

  • エンティティヘッダーフィールド

  • その他头域

  • トランスポートヘッダー

キャッシュヘッダー

変更された場合-以降

機能:ブラウザ側のキャッシュページの最終変更時刻をサーバーに送信すると、サーバーはこの時刻をサーバー上の実際のファイルの最終変更時刻と比較します。時間が同じ場合は、304を返し、クライアントはローカルキャッシュファイルを直接使用します。時間が一貫していない場合は、200と新しいファイルの内容が返されます。クライアントはそれを受信すると、古いファイルを破棄し、新しいファイルをキャッシュして、ブラウザに表示します。

例:If-Modified-Since:Thu、09 Feb 2012 09:07:57 GMT

If-None-Match

機能:-None-MatchとETagが連携する場合、動作原理はHTTP応答にETag情報を追加することです。ユーザーがリソースを再度リクエストすると、If-None-Match情報(ETag値)がHTTPリクエストに追加されます。サーバーは、リソースのETagが変更されていない(リソースが更新されていない)ことを確認すると、304ステータスを返し、クライアントにローカルキャッシュファイルを使用するように指示します。それ以外の場合は、200のステータスと新しいリソースおよびEtagが返されます。このようなメカニズムを使用すると、Webサイトのパフォーマンスが向上します。

例:If-None-Match:“ 03f2b33c0bfcc1:0”

プラグマ

機能:ページがキャッシュされないようにします。HTTP/ 1.1バージョンでは、Cache-Control:no-cacheとまったく同じ機能
があります。Pargmaの使用法は1つだけです。 例:Pragma:no-cache 
注:HTTP /の場合1.0バージョン、Pragmaのみが実装されています:no-cache、Cache-Controlは実装されていません

キャッシュ制御

役割:これは非常に重要なルールです。これは、キャッシュメカニズムとそれに続くResponse-Requestを指定するために使用されます。一般的に使用されるコマンドの意味は次のとおりです。

Cache-Control:パブリックは任意のキャッシュで
キャッシュできます Cache-Control:プライベートコンテンツはプライベートキャッシュにのみキャッシュされます 
Cache-Control:no-cacheすべてのコンテンツはキャッシュされません

クライアントヘッダー

受け入れる

機能:ブラウザが受け入れることができるメディアタイプ。例:Accept:text / htmlは、サーバーから返送されたタイプをtext / htmlとして受け入れることができることを意味します。これは、よくhtmlドキュメントと呼ばれます。サーバーが受け入れられない場合text / htmlタイプのデータを返す場合、サーバーは406エラーを返す必要があります(受け入れられません)。

ワイルドカード*は任意のタイプを表します

たとえば、Accept:  / は、ブラウザがすべてのタイプを処理できることを表します(通常、ブラウザはこれをサーバーに送信します)

Accept-Encoding

機能:ブラウザは、受信するエンコード方法を宣言します。通常、圧縮方法、圧縮をサポートするかどうか、サポートする圧縮方法(gzip、deflate)を指定します(注:これは単なる文字エンコードではありません)。

例:Accept-Encoding:gzip、deflate

受け入れる-言語

機能:ブラウザは、受信した言語を宣言します。言語と文字セットの違い:中国語は言語であり、中国語にはbig5、gb2312、gbkなどの複数の文字セットがあります。

例:Accept-Language:en-us

ユーザーエージェント

機能:HTTPサーバー、クライアントが使用するオペレーティングシステムとブラウザの名前とバージョンを通知します。

オンラインでフォーラムにログインすると、オペレーティングシステムの名前とバージョン、使用しているブラウザの名前とバージョンが記載されたウェルカムメッセージが表示されることがよくあります。これにより、多くの人がすばらしい気分になります。実際、サーバーアプリケーションは、User-Agent要求ヘッダーフィールドからこの情報を取得します。User-Agent要求ヘッダーフィールドを使用すると、クライアントはサーバーにオペレーティングシステム、ブラウザー、およびその他の属性を通知できます。

例如:ユーザーエージェント:Mozilla / 4.0(互換性; MSIE 8.0; Windows NT 5.1; Trident / 4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C ; InfoPath.2; .NET4.0E)

Accept-Charset

機能:ブラウザは受信した文字セットを宣言します。これは、gb2312、utf-8など、この記事の前半で紹介したさまざまな文字セットと文字エンコードです(通常、Charsetには対応する文字エンコードスキームが含まれています)。

Cookie /ログインヘッダーフィールド

クッキー

機能:Cookieの値をHTTPサーバーに送信する最も重要なヘッダー

エンティティヘッダーフィールド

コンテンツの長さ

役割:HTTPサーバーに送信されるデータの長さ。

例:Content-Length:18

コンテンツタイプ

役割:HTTPサーバーに送信されるデータのタイプ

例如:コンテンツタイプ:application / x-www-form-urlencoded

その他头域

リファラー

機能:リクエストのコンテキスト情報を提供するサーバーは、私がどのリンクから来たかをサーバーに通知します。たとえば、ホームページから友人にリンクすると、そのサーバーはHTTPリファラーから毎回私のホームページをクリックしたユーザーの数を数えることができます。日リンク上の彼のウェブサイトをご覧ください。

例如:リファラー:http://translate.google.cn/?hl = zh-cn&tab = wT

トランスポートヘッダー

接続

次に例を示します。接続:キープアライブWebページが開かれると、クライアントとサーバー間でHTTPデータを送信するために使用されるTCP接続は閉じられません。クライアントがサーバー上のWebページに再度アクセスすると、確立されたものを使用します。接続

次に例を示します。接続:閉じるとは、リクエストが完了した後、クライアントとサーバー間でHTTPデータを送信するために使用されるTCP接続が閉じられることを意味します。クライアントがリクエストを再度送信するときは、TCP接続を再確立する必要があります。

ホスト(このヘッダーはリクエストを送信するときに必要です)

機能:リクエストヘッダーフィールドは、主にリクエストされたリソースのインターネットホストとポート番号を指定するために使用されます。通常はHTTP URLから抽出されます。 
例:ブラウザに入力しますhttp//www.baidu.com、ブラウザが送信するリクエストメッセージには、次のようにホストリクエストヘッダードメインが含まれます。 
ホスト:http//www.baidu.com

ここではデフォルトのポート番号80が使用されます。ポート番号を指定すると、次のようになります。ホスト:指定されたポート番号

PHP処理リクエストヘッダー

PHPでは、すべてのHTTPリクエストヘッダーを取得する場合はgetallheadersメソッドを使用できますが、このメソッドはどの環境にも存在しません。たとえば、fastcgiを使用してPHPを実行する場合、そのようなメソッドはないため、引き続き他の方法を検討する必要があります。幸い、$ _ SERVERには必要なものがあります。HTTP_で始まるキー名は、HTTPリクエストヘッダーです。

$ headers = array(); 
foreach($ _SERVER as $ key => $ value){  
    if( 'HTTP_' == substr($ key、0、5)){  
        $ headers [str_replace( '_'、 '-'、substr($ key、5 ))] = $ value; 
        echo "$ key:$ value \ n"; 
    }  
} 1234567

RFCは、メッセージヘッダーの名前では大文字と小文字が区別されないと明確に述べていることに注意してください。

ただし、すべてのHTTPリクエストヘッダーがHTTP_で始まるキーの形式で$ _SERVERに存在するわけではありません。たとえば、Authorization、Content-Length、Content-Typeはこのようなものではないため、すべてのHTTPリクエストヘッダーを取得するには、さらに追加する必要があります。次のコード:

        //获取AUTHORIZATIONヘッダー
        if(isset($ _ SERVER ['PHP_AUTH_DIGEST'])){$ header ['AUTHORIZATION'] = $ _SERVER ['PHP_AUTH_DIGEST']; $ value = $ _SERVER ['PHP_AUTH_DIGEST']; echo "AUTHORIZATION:$ value \ n"; 
        } elseif(isset($ _ SERVER ['PHP_AUTH_USER'])&& isset($ _ SERVER ['PHP_AUTH_PW'])){$ header ['AUTHORIZATION'] = base64_encode($ _ SERVER ['PHP_AUTH_USER']。 ':'。$ _SERVER ['PHP_AUTH_PW']); $ value = base64_encode($ _ SERVER ['PHP_AUTH_USER']。 ':'。$ _SERVER ['PHP_AUTH_PW']); echo "AUTHORIZATION:$ value \ n"; 
        } //获取CONTENT-LENGTHヘッダー
        if(isset($ _ SERVER ['CONTENT_LENGTH'])){$ header ['CONTENT-LENGTH' 
        } //获取CONTENT-TYPEヘッダー
        if(isset($ _ SERVER ['CONTENT_TYPE'])){$ header ['CONTENT-TYPE'] = $ _SERVER ['CONTENT_TYPE']; $ value = $ _SERVER ['CONTENT_TYPE']; echo "CONTENT-TYPE:$ value \ n"; 
        } 12345678910111213141516171819202122

PHPはGETリクエストパラメータを処理します

    <?php 
    public function request_get(){ 
        echo $ _GET ["name"]; エコー '<br/>'; echo $ _GET ["age"]; エコー '<br/>'; 
    }?> 12345678

リクエストの例:http:// host_name / path?name = Peter&age = 37

PHP出力:
Peter 
37123

PHPはPOSTリクエスト本文を処理します

PHPには、HTTPPOSTリクエストの本文を処理する3つの方法があります

  • _POST ["key"]定義済み変数を使用する

  • HTTP_RAW_POST_DATA定数を使用する

  • php:// inputストリームを読む

_POST [“ key”]

_POST ["key"]は、キー値によってキーに対応するコンテンツを取得できますが、Content-Typeによって送信されたデータのみを処理できます:application / x-www-form-urlencoded

    <?php 
    public function request_post(){         
        echo $ _POST ["name"]; エコー '<br/>'; echo $ _POST ["age"]; エコー '<br/>'; 
    }?> 12345678
请求示例POSThttp  
:// host_name / path HTTP / 1.1Host:host_name 
Content-Length:18Content-Type:application / x-www-form-urlencodedname = Peter 
age = 3712345678
PHP出力:
Peter 
37123

HTTP_RAW_POST_DATA

定数HTTP_RAW_POST_DATAは、enctype =” multipart / form-data”フォームデータには使用できません。つまり、バイナリストリームデータを送信するときにフォームは使用できません。

HTTP_RAW_POST_DATAと_POSTは基本的に同じですが、投稿データがPHPなどでない場合は、SOAP / xmlなどのGLOBALS ['HTTP_RAW_POST_DATA']を使用して受信できます。

したがって、PHPがHTTP_RAW_POST_DATAを使用して投稿データを処理する場合は、リクエストを送信するときに、リクエストメッセージにContent-Typeヘッダーを追加する必要があります。テキストの場合は、Content-Type = text / xmlを追加します。

さらに、PHP5.6は定数HTTP_RAW_POST_DATAを廃止したため、php:// inputを使用して、5.6以降のバージョンのPOSTデータを処理することをお勧めします。

    <?php 
    public function request_post(){ 
        echo urldecode($ GLOBALS ['HTTP_RAW_POST_DATA']); 
    }?> 12345
请求示例POSThttp  
:// host_name / path HTTP / 1.1Host:host_name 
Content-Length:18Content-Type:text / xmlname = Peter 
age = 3712345678
PHP出力:name = Peterage = 37123

php:// input

php:// inputは、リクエストの生データにアクセスできる読み取り専用ストリームですが、enctype =” multipart / form-data”フォームデータ($ HTTP_RAW_POST_DATAと同じ)では使用できません。

PHPがphp:// inputを使用して投稿データを処理する場合、リクエストメッセージにContent-Typeヘッダーを追加する必要はありません。

    <?php 
    public function request_post(){ 
        echo file_get_contents( 'php:// input'); 
    }?> 12345
请求示例POSThttp  
:// host_name / path HTTP / 1.1Host:host_name 
Content-Length:18name = Peter 
age = 371234567
PHP出力:name = Peterage = 37123

ブログガーデン で公開されているXiaotanによって詳述されたHTTPプロトコルに関する一連の記事を、公式のPHPドキュメントと組み合わせて検討する ことで、HTTPプロトコルに関するこのテキストを要約しました。今後は方向性を示すために前任者の知恵が必要です、ありがとうございます!

おすすめ

転載: blog.csdn.net/keke795/article/details/112975979