2012-05-04 2 views
12

Только что начал заниматься Dart, и я решил написать простой сервер Http и клиент. Мой код сервера:CORS with Dart, как мне заставить его работать?

#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(); 
    } 
} 

Мой код клиента:

#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(); 
} 

Я получаю сообщение об ошибке:

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. 

Что я делаю неправильно?

+1

Вы видели эти 2 ссылки? 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

'*' не является допустимым значением ни для чего, кроме 'Access-Control-Allow-Origin'; и это даже не актуально для поля происхождения, если запрос предварительно запрограммирован (что происходит, если вы раскомментируете строку 'Access-Control-Request-Headers'), хотя это не имеет особого смысла, значение должно быть списком имена заголовков). – Tgr

+0

У меня есть CORS, работающий с свойством «Access-Control-Allow-Origin» так, как вы пытались. Исправьте другие значения, и он должен работать нормально. – enyo

ответ

4

вы можете упростить свою жизнь и запустить оба сценария сервера/клиента с одного и того же адреса порта: порт. В приложении http://www.dartlang.org/articles/io/#web-servers есть небольшой пример веб-сервера, который также служит для статических файлов. Добавьте обработчик '/ api' и убедитесь, что ваши файлы клиента находятся в одном каталоге. Пример сервера намного медленнее, чем встроенный сервер Dart Editor, который работает на порту 3030.

6

У этой проблемы была такая же проблема. Ниже приведен код сервера. Он просто распечатывает параметры запроса. Добавлены заголовки контроля доступа, чтобы устранить проблему.

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(); 
    }); 
    }); 

Надеюсь, это поможет.

Смежные вопросы