Как ответить на запрос на параметры HTTP на сервере JSON-RPC

StackOverflow https://stackoverflow.com/questions/2580461

  •  24-09-2019
  •  | 
  •  

Вопрос

Мой клиент JSON-RPC (браузер с использованием DOJO JSON-RPC) делает запрос JSON-RPC (DOJO.CallRemote) на мой сервер JSON-RPC на myserver.com/12345. (Python 2.5, simplejsonrpcserver).

Затем сервер получает HTTP-запрос с заголовком «Параметры / 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-Service достижится от сети.

Сейчас вопрос в том, что делает браузер (скажет, Firefox) ожидает, что удивидит ответ? Или, может быть, проблема лежит в другом месте?

Это было полезно?

Решение

Увидеть Спецификация CORS..

(Кстати; есть реестр заголовка для HTTP, см. http://www.iana.org/assignments/message-headers/prov-eders.html. а также http://www.iana.org/assignments/message-headers/perm-eders.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')

Проверьте мой код. Он работает для Client JavaScript Code, работающих в Chrome Browser.

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) 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top