2

このmootoolsリクエストがあります:

new Request({
    url: 'http://localhost:8080/list',
    method: 'get',
}).send();

そして、これを処理する小さなpythonサーバー:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import subprocess

class HttpHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/list':
            self.list()
        else:
            self._404()

    def list(self):
        self.response200()
        res = "some string"

        self.wfile.write(res)

    def _404(self):
        self.response404()
        self.wfile.write("404\n")

    def response200(self):
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Headers', 'X-Request, X-Requested-With')
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def response404(self):
        self.send_response(404)
        self.send_header('Content-type', 'application/json')
        self.end_headers()

def main():
    try:
        server = HTTPServer(('', 8080), HttpHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close()

if __name__ == '__main__':
    main()

このリクエストをしようとすると、次のエラーが発生します。

OPTIONS http://localhost:8080/ 501 (Unsupported method ('OPTIONS'))
XMLHttpRequest cannot load http://localhost:8080/. Origin null is not allowed by Access-Control-Allow-Origin.

何が起こっているのかわかりません。誰かが私を助けることができますか??

4

1 に答える 1

4

応答文字列が示すとおりです。OPTIONS http://localhost:8080/ 501 (Unsupported method ('OPTIONS'))

JavaScript が別のオリジンからリソースをリクエストしようとすると、最新のブラウザはまず、別のオリジンからそのリクエストを行ってもよいかどうかをターゲットである他のサーバーに尋ねます。これはまさにAccess-Control*ヘッダーが行うことです。ただし、このリクエストは通常​​の では発生しませGET。これは、とにかく実際にリクエストを実行するためです。代わりに、OPTIONS実際には実行せずに、クライアントに何を許可されているかを通知する唯一の理由で存在するメソッドを使用します。

do_OPTIONSしたがって、次のようなメソッドが必要です。

def do_OPTIONS(self):
    if self.path in ('*', '/list'):
        self.send_response(200)
        self.send_header('Allow', 'GET, OPTIONS')
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Headers', 'X-Request, X-Requested-With')
    else:
        self.send_response(404)
    self.send_header('Content-Length', '0')
    self.end_headers()
于 2012-04-14T22:07:40.940 に答える