2012-05-04 12 views
12

Acabo de empezar a jugar con Dart y decidí escribir un servidor Http simple y un cliente. Mi código de servidor:CORS con Dart, ¿cómo hago para que funcione?

#import("dart:io"); 

final HOST = "127.0.0.1"; 
final PORT = 8080; 
final LOG_REQUESTS = true; 

void main() { 
    HttpServer server = new HttpServer(); 
    server.addRequestHandler((HttpRequest request) => true, requestReceivedHandler); 
    server.listen(HOST, PORT); 
    print("Server is running on ${PORT}."); 
} 

void requestReceivedHandler(HttpRequest request, HttpResponse response) { 
    var pathname = request.uri; 
    var apiresponse=""; 
    if (LOG_REQUESTS) { 
    print("Request: ${request.method} ${pathname}"); 
    } 
    if(pathname == '/api'){ 
    response.headers.set(HttpHeaders.CONTENT_TYPE, "text/plain; charset=UTF-8"); 
    response.headers.add("Access-Control-Allow-Methods", "POST, OPTIONS, GET"); 
    response.headers.add("Access-Control-Allow-Origin", "*"); 
    response.headers.add('Access-Control-Allow-Headers', '*'); 
    print('welcome to the good life'); 
    response.outputStream.writeString("API Call"); 
    response.outputStream.close(); 
    } 
} 

mi código de cliente:

#import('dart:html'); 
#import('dart:json'); 

class dartjson { 

    dartjson() { 
    } 

    void run() { 
    write("Hello World!"); 
    } 




    void fetchFeed(){ 
    XMLHttpRequest xhr = new XMLHttpRequest(); 
    var url = "http://127.0.0.1:8080/api"; 
    xhr.open("GET", url, true); 
    xhr.setRequestHeader('Content-Type', 'text/plain'); 
    //xhr.setRequestHeader('Access-Control-Request-Headers', 'http://127.0.0.1:3030'); 
    xhr.send(); 
    print(xhr.responseText); 
    document.query('#status').innerHTML = xhr.responseText; 

    } 



void main() { 
    new dartjson().fetchFeed(); 
} 

sigo obteniendo el error:

XMLHttpRequest cannot load http://127.0.0.1:8080/api. Origin 
http://127.0.0.1:3030 is not allowed by Access-Control-Allow-Origin. 

Lo que estoy haciendo mal?

+1

¿has visto esos 2 enlaces? http://blog.sethladd.com/2012/03/jsonp-with-dart.html https://groups.google.com/a/dartlang.org/group/misc/browse_thread/thread/e93a2b0e205bd5d1/605a7ef152f96e7b?lnk = gst & q = CORS # 605a7ef152f96e7b – Gero

+0

'*' no es un valor válido para nada excepto 'Access-Control-Allow-Origin'; y ni siquiera es válido para el campo de origen si la solicitud está preflighted (que es el caso si quita el comentario de la línea 'Access-Control-Request-Headers', aunque no tiene mucho sentido, el valor debe ser una lista de nombres de encabezado). – Tgr

+0

Tengo CORS trabajando con la propiedad 'Access-Control-Allow-Origin' tal como lo intentó. Corrija los otros valores y debería funcionar bien. – enyo

Respuesta

4

puede simplificar su vida y ejecutar scripts de servidor/cliente desde el mismo host: dirección de puerto. Hay un pequeño ejemplo de servidor web en http://www.dartlang.org/articles/io/#web-servers que también sirve archivos estáticos. Agregue su controlador '/ api' y asegúrese de que sus archivos de cliente estén en el mismo directorio. El servidor de ejemplo es mucho más lento que el servidor incorporado de Dart Editor que se ejecuta en el puerto 3030.

6

Estaba enfrentando el mismo problema. A continuación está mi código de servidor. Simplemente imprime los parámetros de consulta. Se agregaron encabezados de control de acceso para solucionar el problema.

HttpServer.bind('127.0.0.1', 8080).then((server){ 
    server.listen((HttpRequest request){  
     request.uri.queryParameters.forEach((param,val){ 
     print(param + '-' + val); 
     }); 

     request.response.headers.add("Access-Control-Allow-Origin", "*"); 
     request.response.headers.add("Access-Control-Allow-Methods", "POST,GET,DELETE,PUT,OPTIONS"); 

     request.response.statusCode = HttpStatus.OK; 
     request.response.write("Success!"); 
     request.response.close(); 
    }); 
    }); 

Espero que esto ayude.

Cuestiones relacionadas