実際に送信されるデータの中身は一行下のecho $json;の部分だということがわかりましたが、ここで新しい疑問が出てきました。
echoとは「1 つ以上の文字列を出力する」という言語構造のはずですが、なぜこれがレスポンスを返したことになるのでしょうか?
オンライン通信で、PHPを使用する場合基本的にはアスキー文字列での通信となります。必ず、クライアントからのリクエストとレスポンスが対になります。このリクエストとレスポンスが対になる通信方式は、TCPのHTTPプロトコルで定義されています。
http://viral-community.com/other-it/http-1873/
http://www.atmarkit.co.jp/ait/articles/1703/29/news045.html
HTTP通信順序
- クライアントがリクエストをWebサーバーに送信(URLなど)
- サーバーにリクエストが届く
- サーバーはリクエストヘッダを解析して、指定のPHPやHTMLファイルをロード
- サーバーはレスポンスヘッダと、指定ファイルのアスキー文字列をコンテントボディーに繋げて返信
- クライアントはサーバーからレスポンスヘッダ、コンテントボディーを受け取る
サーバー間の通信には必ず、リクエストヘッダ、レスポンスヘッダというものが存在し、Content-Type: application/json
というのは、サーバーやクライアントにJSONとして認識してネ、というものです。
echo JSON文字列;
は、レスポンスとしてコンテントボディーに出力するもので、HTMLタグの出力と同じ動作をします。
なぜWebサーバーのコンテントボディーに入るのかは、PHPはWebアプリ用の言語なので、HTMLなどをPHPで出力することがメインだからです。
コマンドライン
一方、コマンドラインでecho
すると、ターミナルに直接表示されるわけですが、これはWeb用のPHP(libphp5.soやphp-cgi)と、コマンドライン用のPHP(php-cli)が別れているためです。
レスポンスヘッダ
コンテントボディーが存在しない場合について考えてみます。下記のようなPHPファイルを作成してWebサーバーのドキュメントルートに置きます。
php
1<?php
2header('Content-Type: application/json');
3?>
下記のコマンドでレスポンスヘッダを確認できます。ブラウザでアクセスすれば、開発者ツール(F12)でも確認ができます。
bash
1curl -I http://ドメイン/PHPファイル.php
レスポンスヘッダは下記のようになります。Content-Length: 0
でボディーが何もないと表示されました。また、コンテントタイプは指定通りapplication/json
となっています。
HTTP/1.1 200 OK
Date: Sun, 24 Dec 2017 17:56:46 GMT
Server: Apache
Content-Length: 0
Connection: close
Content-Type: application/json
それでは、Googleのサイトではどうなるか確認してみます。
bash
1curl -LI "https://www.google.com"
上記のレスポンスヘッダは下記になります。https://www.google.co.jp
にリダイレクトして、コンテンツはtext/html; charset=Shift_JIS
なので、HTMLだと言っています。その他にもCookieやらいろいろあります。
HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: https://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=sCpBWuDrGbSL8QfF4JuICg
Content-Length: 272
Date: Mon, 25 Dec 2017 16:43:28 GMT
Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
HTTP/1.1 200 OK
Date: Mon, 25 Dec 2017 16:43:28 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=Shift_JIS
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2017-12-25-16; expires=Wed, 24-Jan-2018 16:43:28 GMT; path=/; domain=.google.co.jp
Set-Cookie: NID=120=m6RnwiiVHa1XQRloByrLs4hTGMBM-T1hGhc534mlVVIWHl8v_Dv5Ab_6qTSxIfzihycwVPVJLahTIwPIUJlST3vLcyMm52tsuOLvCiFZMASMnIAPPOK7sO09wEYkzTCI; expires=Tue, 26-Jun-2018 16:43:28 GMT; path=/; domain=.google.co.jp; HttpOnly
Alt-Svc: hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding
新し言語をさわるときは、なぜそうなの?と突き詰めていくのも大事ですが、時には特に理由もないこともあります。 英語などの外国語を勉強する時に、文法についてなぜそのようなルールなのか? と考えないのと一緒です。 考え出すとラテン語など別の言語を勉強しだすことになり、本来の目的から逸脱してしまいます。
まずは、使い方をそういうものだと覚えて、そのうち慣れたら詳細を補充していけば良いと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。