Pregunta

Mi cliente JSON-RPC (navegador usando Dojo JSON-RPC) hace una solicitud JSON-RPC (dojo.callremote) a mi servidor JSON-RPC en myserver.com/12345 (Python 2.5, SimpleJsonRPCServer).

Luego, el servidor recibe una solicitud HTTP con el encabezado "Opciones / HTTP / 1.1", que no puede manejar de forma predeterminada, por lo que escribí un controlador personalizado para esta solicitud.

El encabezado de solicitud del navegador dice:

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

Y la respuesta que estoy enviando se ve así:

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

Pero en el navegador recibo el siguiente error:

Error: no se puede cargar http://myserver.com:12345 Estado: 0

Verifiqué que el servicio JSON es accesible desde la red.

Ahora la pregunta es, ¿qué espera el navegador (digamos, Firefox) que diga los oyentes de la respuesta? ¿O tal vez el problema se encuentra en otro lugar?

¿Fue útil?

Solución

Ver el Especificación CORS.

(Por cierto; hay un registro de encabezado para HTTP, ver http://www.iana.org/assignments/message-headers/prov-teaders.html y http://www.iana.org/assignments/message-headers/perm-headers.html, que te habría señalado a la especificación correcta).

Otros consejos

Agregue código e intente, funciona bien para mí:

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')

Revise mi código. Funciona para el código JavaScript del cliente que se ejecuta en 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) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top