12678


AngularJSを使用していて、以下のコードでサーバサイドAPIのデリートを呼び出したのですが、デリートできずになぜかメソッドがOPTIONSになってしまいます。

[code]

    $scope.delete = function(video){
        //delete
        Video.delete({id: video.id});
      };
    
[/code]

GoogleのdevtoolのGeneralは以下のようになっています。

[code]

    Remote Address:[::1]:9000
    Request URL:http://localhost:9000/video/1
    Request Method:OPTIONS
    Status Code:404 Not Found
    
[/code]

またRequest Headersは以下のようになっています。

[code]

    Accept:*/*
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:ja,en-US;q=0.8,en;q=0.6
    Access-Control-Request-Headers:accept
    Access-Control-Request-Method:DELETE
    Connection:keep-alive
    Host:localhost:9000
    Origin:http://localhost:8000
    Referer:http://localhost:8000/
    
[/code]

Request HeadersではメソッドはDELETEなのに、GeneralではOPTIONSになっています。  
また、AngularJSを使わないでDELETEした場合は正常に削除されていたので、サーバーサイドには問題はないと考えています。

同様の問題がPOST時にも起きてそのときはconfigに以下のコードを追加し問題はなおりましたが、DELETEの場合どう直せばいいのかわかりません。もしわかればご教授いただけるとありがたいです。

`$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-
form-urlencoded;application/json;charset=utf-8';`


CC BY-SA 3.0
2015-07-25T03:15:49.450
12677
2015-07-25T05:19:58.980
7232
question
angularjs ajax
AngularJSでdeleteがOPTIONSになって失敗する。


ポート番号が 8000 と 9000 で異なっているので、 Cross-Origin Resource Sharing (以下CORS)
として扱われています。ブラウザは CORS を検出した場合、実際のメソッドを投げる前に、 OPTIONS
メソッドによる検査(プリフライト/preflight)を実行します。

参考: [HTTP access control (CORS) -
MDN](https://developer.mozilla.org/ja/docs/HTTP_access_control)

上記のページにプリフライトの詳細がありますが、この問題への対応方法は以下のようにいくつか考えられます。いずれにせよ、この質問のケースではクライアント側の
AngularJS の修正だけで済む方法は存在しません。

  1. サーバサイドAPIに OPTIONS メソッドを実装する
  2. サーバサイドAPIをHTMLと同じポート 8000 番で提供する

サーバ側の修正方法については、現時点では情報が少ないため、提案を差し控えます。

* * *

なお POST がその方法で修正可能だったのは、ブラウザの以下の動作によるものです。

> GET または POST 以外のメソッドを使用します。また application/x-www-form-
> urlencoded、multipart/form-data、または text/plain 以外の Content-Type とともに POST
> を行う場合、例えば application/xml または text/xml を用いて XML のペイロードをサーバーへ送るために POST
> を用いるような場合は、リクエストでプリフライトを行います。

([同前:プリフライトリクエスト](https://developer.mozilla.org/ja/docs/HTTP_access_control#Preflighted_requests)
より引用)


CC BY-SA 3.0
2015-07-25T05:19:58.980
12678
2015-07-25T05:19:58.980
208
12677
answer