كيفية الرد على طلب خيارات HTTP على خادم JSON-RPC
سؤال
يقوم عميل JSON-RPC الخاص بي (المتصفح باستخدام Dojo JSON-RPC) بطلب JSON-RPC (dojo.callremote) إلى خادم JSON-RPC الخاص بي myserver.com/12345 (Python 2.5 ، SimpleJsonRpcServer).
يحصل الخادم بعد ذلك على طلب HTTP مع رأس "Options / HTTP / 1.1" ، والذي لا يمكنه التعامل معه افتراضيًا ، لذلك كتبت معالجًا مخصصًا لهذا الطلب.
يقول رأس الطلب من المتصفح:
OPTIONS / HTTP/1.1
Host: myserver:12345
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.8) Gecko/20100214 Linux Mint/8 (Helena) Firefox/3.5.8 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,de;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Origin: http://myserver.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
والاستجابة التي أرسلها تبدو هكذا:
HTTP/1.0 200 OK
Server: BaseHTTP/0.3 Python/2.5
Date: Mon, 05 Apr 2010 18:58:34 GMT
Access-Control-Allow-Method: POST
Access-Control-Allow-Headers: POST
Allow: POST
Content-Type: application/json-rpc
Content-length: 0
لكن في المتصفح أحصل على الخطأ التالي:
خطأ: غير قادر على التحميل http://myserver.com:12345 الحالة: 0
لقد تحقق من أن خدمة JSON يمكن الوصول إليها من الشبكة.
والسؤال الآن هو ، ماذا يتوقع المستعرض (على سبيل المثال ، Firefox) أن يقول الرد من ردا؟ أو ربما تكمن المشكلة في مكان آخر؟
المحلول
انظر مواصفات cors.
(راجع للشغل ؛ يوجد سجل رأس لـ HTTP ، انظر http://www.iana.org/assignments/message-headers/prov-headers.html و http://www.iana.org/assignments/message-headers/perm-headers.html, ، والتي كانت ستوجهك إلى المواصفات الصحيحة).
نصائح أخرى
أضف رمزًا وحاول ، إنه يعمل بشكل جيد بالنسبة لي:
class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
...
...
def do_OPTIONS(self):
self.send_response(200, "ok")
self.send_header('Access-Control-Allow-Origin', self.headers.dict['origin'])
self.send_header('Access-Control-Allow-Methods', 'POST, OPTIONS')
تحقق من الرمز الخاص بي. إنه يعمل مع كود JavaScript العميل الذي يعمل في متصفح Chrome.
class MyHandler(BaseHTTPRequestHandler):
def do_OPTIONS(self):
self.send_response(200, "ok")
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header("Access-Control-Allow-Headers", "X-Requested-With")
def do_GET(self):
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write("<html><body>Hello world!</body></html>")
self.connection.shutdown(1)