単純な JSON-RPC サーバーを実装しようとしています。クライアント部分は jquery.jsonrpc によって処理されます。これは問題なく動作しているようで、JSON-RPC メッセージを投稿メッセージのペイロードとして送信します。
私のJSON-RPC「サーバー」は現在、データをエコーしたいだけなので、FireBug http応答で結果を確認できます。
コードは次のとおりです。
<?php
class jsonrpc {
var $requestData;
function jsonrpc() {
if (isset($_SERVER["REQUEST_URI"]) && isset($_SERVER["REQUEST_METHOD"])) {
if (isset($_SERVER["CONTENT_LENGTH"]) && $_SERVER["CONTENT_LENGTH"] > 0) {
$this->requestData = "";
$httpContent = fopen("php://input", "r");
echo "httpcontent=".$httpContent;
while ($data = fread($httpContent, 1024)) {
$this->requestData .= $data;
}
fclose($httpContent);
}
}
echo "jsonrpc::jsonrpc()\n";
}
}
?>
[応答] タブには次のように表示されます。
POST http://api.localhost/index.php?tm=1317246797964 200 OK 6ms
<br />
<b>Warning</b>: fopen("php://input", "r") - No error in <b>C:\Develop\ZeroSumGames\api\htdocs\rpc.php</b> on line <b>9</b><br />
httpcontent=<br />
<b>Warning</b>: fread(): supplied argument is not a valid File-Handle resource in <b>C:\Develop\ZeroSumGames\api\htdocs\rpc.php</b> on line <b>11</b><br />
<br />
<b>Warning</b>: fclose(): supplied argument is not a valid File-Handle resource in <b>C:\Develop\ZeroSumGames\api\htdocs\rpc.php</b> on line <b>14</b><br />
jsonrpc::jsonrpc()
Object { error="Internal server error", version="2.0"}
FireBug リクエスト ヘッダー タブで次のように表示されるため、そこにデータがあることがわかります。
Host api.localhost
User-Agent Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept application/json, text/javascript, */*
Accept-Language en-gb,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Content-Type application/json; charset=UTF-8
X-Requested-With XMLHttpRequest
Referer http://api.localhost/index.html
Content-Length 72
また、投稿タブでこれを見ることができます:
{"jsonrpc":"2.0","method":"example.method.name","id":1,"params":[1,2,3]}
私のサーバーは file_get_contents (4.2.2) には古すぎますが、ネット上で見つけた代替関数は、内部的に上記で書いたものと同じように (多かれ少なかれ) 動作し、php://input
.
だから私の質問は、なぜphp://inputを開いて読むことができないのですか?