私は自分自身でC++とBoostライブラリで開発したHTTPサーバーをテストしています。具体的には、JSONがPUTによって受信されるエンドポイントをテストしています。なぜAJAXによるPOSTの送信は、HTTPサーバーによってOPTIONSとして解釈され、CURLによる送信は事実上PUTですか?
response_jsonを送信するJSONを持つファイルであるcurl -H "Content-Type: application/json" -H "Content-Length: 34" -H "Connection: close" -X PUT --data "@response_json" http://localhost:8080/answer
:私は、次のコマンドを使用してカールを使用してRESTfulなWebサービスをテストするには
。これは正常に動作し、サーバーはPUTとして要求を受け取り、何をすべきかを行います。
しかし、私はこれでAJAXからWebサービスをテストする場合:
function sendPut2() {
var http = new XMLHttpRequest();
var url = 'http://localhost:8080/answer';
var data = JSON.stringify({"question": "a", "answer": "b"});
http.open("PUT", url, true);
http.setRequestHeader("Content-type", "application/json");
http.setRequestHeader("Content-Length", data.length);
http.setRequestHeader("Connection", "close");
http.onreadystatechange = function() {
if(http.readyState == 4 && http.status == 200) {
alert(http.responseText);
}
}
http.send(data);
}
サーバはOPTIONSとしてそれを受け取り、動作しませんが。さらに、Firebugコンソールでは、「NetworkError:404 Not Found - http://localhost:8080/answer」と表示されます。
私はFirefoxとChromeで試しました。私のJavaScriptコードで何が間違っていますか?
これは、JavaScriptからの要求とFirebugのです:ブラウザはセキュリティ上の理由から、同一生成元ポリシーを持っている
同じ原点に当たっていることを確認し、同じ原点に2つのオプションがないかどうかを確認してください。 1.サーバーはaccess-control-allow-originsヘッダーで応答する必要があります。 2.一時的にchrome corsプラグインをインストールする – everlasto
Chrome CORSプラグインはOPTIONSの問題を本当に解決しません。場合によっては '--disable-web-security'コマンドラインオプションを使ってchromeをテストするほうが良いでしょう。 –