1

CORSは私の脳を少し揚げ始めています。1つの方法を除けば、今ではすべてが順調です。フロントエンドにバックボーン、バックエンドにnode.js/restifyを備えたアプリを構築しています。このserver.coffeeように見えます:

server.get '/todos', todos.find_all
server.get '/todos/:id', todos.find_by_id
server.del '/todos/:id', todos.delete

ただし、バックボーンのモデルが呼び出されるdestroyと、このかなり厄介なエラーが発生します。

MLHttpRequest cannot load http://localhost:8080/todos/. Method DELETE is not allowed by Access-Control-Allow-Methods.

私はこれについて少し読み、restifyを使用して次のことを行いました:

unknownMethodHandler = (request, response) ->
    if(request.method.toLowerCase() == 'options')
        allowHeaders = ['Accept', 'Accept-Version', 'Content-Type', 'Api-Version']

        if(response.methods.indexOf('OPTIONS') == -1) then response.methods.push('OPTIONS')

        response.header 'Access-Control-Allow-Credentials', true
        response.header 'Access-Control-Allow-Headers', allowHeaders.join(', ')
        response.header 'Access-Control-Allow-Methods', ['GET', 'DELETE', 'TEST!']
        response.header 'Access-Control-Allow-Origin', request.headers.origin

        response.send 204
    else
        response.send new restify.MethodNotAllowedError()

server.on 'MethodNotAllowed', unknownMethodHandler

しかし、それでも、私はこれを応答ヘッダーとして取得します。

HTTP/1.1 204 No Content
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version
Access-Control-Allow-Methods: GET, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: X-Api-Version, X-Request-Id, X-Response-Time
Connection: Keep-Alive
Date: Mon, 04 Feb 2013 12:24:25 GMT
Server: restify
X-Request-Id: fbd4e15a-a22e-48b6-bf5c-a46b94926748
X-Response-Time: 0

私は自分が間違っていることを理解できません!

4

4 に答える 4

1

応答が必要な場合は、204 ではなく「200」応答コードを使用する必要があります。これは No Content 応答であるためです。詳細については、W3C 仕様を参照してください。

9.7 削除

DELETE メソッドは、起点サーバーが Request-URI によって識別されるリソースを削除することを要求します。このメソッドは、オリジンサーバーでの人間の介入 (またはその他の手段) によってオーバーライドされる場合があります。オリジンサーバーから返されたステータスコードがアクションが正常に完了したことを示している場合でも、クライアントは操作が実行されたことを保証できません。ただし、応答が与えられた時点で、リソースを削除するか、アクセスできない場所に移動するつもりでない限り、サーバーは成功を示すべきではありません。

成功応答は、応答にステータスを説明するエンティティが含まれている場合は 200 (OK)、アクションがまだ実行されていない場合は 202 (承認済み)、アクションが実行されているが応答に含まれていない場合は 204 (コンテンツなし) である必要があります。エンティティ。

リクエストがキャッシュを通過し、Request-URI が現在キャッシュされている 1 つ以上のエンティティを識別する場合、それらのエントリは古いものとして扱われるべきです (SHOULD)。このメソッドへの応答はキャッシュできません。

于 2013-02-04T14:13:15.623 に答える
0

Access-Control-Allow-Origin: *応答ヘッダーにが表示されています。これは .../restify/lib/router.js の preflight() メソッドから来ています。コメントには、「ユーザーは独自の .opts ハンドラーを定義する必要があります」と記載されています。

于 2013-07-11T11:45:03.297 に答える