2014-10-19 1 views
0

Я этот код сервера, используя PostGreSQL паба доступных hereвозвращение класса от сервера к клиенту в DART языками

class Vendor { 
    String name; 
    String email; 
} 

void gVendors(HttpRequest req){ 
    HttpResponse res = req.response; 
    addCorsHeaders(res); 
    print('${req.method}: ${req.uri.path}'); 

    req.listen((List<int> buffer) { 

    connect(db).then((conn) { 
    conn.query('select * from VNDRS') 
    .map((row) => new Vendor() 
          ..name = row.vname 
          ..email = row.email) 
    .toList() 
     .then((List<Vendor> vendors) { 
      for (var c in vendors) { 
       print(c is Vendor); // this is correct 
       print(c.name);   // this is correct 
       print(c.email);  // this is correct 
      } 
     }) 
     .then((_){ 
      res.write(Vendor);  // ?? 
      res.close(); 
      }); 
    }); 
    }, onError: printError); 
} 

, когда я проверил в клиенте, и распечатан

print(request.responseText); 

выход был слово «Поставщик»

Могу ли я отправить класс от поставщика на клиент, или есть другой способ отправить вывод моего sql здесь клиенту.

благодаря

ответ

0

Я был в состоянии получить то, что я хочу, используя следующий код, но все же интересно знать/узнать, как получить его в качестве класса

void gVendors(HttpRequest req){ 

HttpResponse res = req.response; 
addCorsHeaders(res); 
print('${req.method}: ${req.uri.path}'); 

Future future() => new Future.value(true); 
var db = 'postgres://postgres:[email protected]:5432/postgres'; 

req.listen((List<int> buffer) { 
    //var _theData = JSON.decode(new String.fromCharCodes(buffer)); 

var vndrs = <Map>[]; 
    connect(db).then((conn) { 
     conn.query('select * from VNDRS') 
     .toList().then((rows) {   
     future() 
      .then((_){ 
        for (var row in rows) 
         vndrs.add({ 
          'name':row.vndrnum, 
          'num':row.vname, 
         'email':row.email 
         }); 
        }) 
      .then((_)=>res.write(JSON.encode(vndrs))) 
      .then((_)=>res.close()); 
     }); 
    }); 
    }, onError: printError); 
} 
1

На самом деле, то, что вам нужно отправить клиенту список объектов поставщика, который был построен из результата базы данных, а не класс поставщика.

Кроме того, вы не можете написать объект непосредственно в ответ, вам необходимо его сериализовать. Например, вы можете использовать JSON кодек, из dart:convert библиотеки для сериализации объектов в формате JSON:

import 'dart:io'; 
import 'dart:conver'; 

class Vendor { 

    String name; 
    String email; 

    Vendor([this.name, this.email]); 

    Vendor.fromJson(Map json) { 
    name = json["name"]; 
    email = json["email"]; 
    } 

    Map toJson() => {"name": name, "email": email}; 
} 

void gVendors(HttpRequest req){ 
    HttpResponse res = req.response; 
    addCorsHeaders(res); 
    print('${req.method}: ${req.uri.path}'); 

    req.listen((List<int> buffer) { 

    connect(db).then((conn) { 
    conn.query('select * from VNDRS') 
    .map((row) => new Vendor(row.vname, row.email)); 
    .toList() 
    .then((List<Vendor> vendors) { 
     for (var c in vendors) { 
      print(c is Vendor); // this is correct 
      print(c.name);   // this is correct 
      print(c.email);  // this is correct 
     } 

     res.write(JSON.encode(vendors.map((v) => v.toJson()).toList())); 
     res.headers.set("content-type", "application/json"); 
     res.close(); 
    }); 
    }, onError: printError); 
} 

В этом примере класс Поставщик имеет методы, которые транслируют из и в формате JSON. В стороне клиента, вы можете также использовать эти методы для анализа ответа:

var vendors = JSON.decode(request.response).map((o) => new Vendor.fromJson(o)); 

Если вы не хотите, чтобы написать эти методы для каждого класса сериализуемого, вы можете посмотреть на библиотеку, которая делает эту работу за вас , например redstone_mapper.

+0

Я получил эту ошибку в стороне сервера «Uncaught Error: HttpException: HTTP-заголовки не изменяются », и если я удалил« res.headers.contentType = новый ContentType («приложение», «JSON»); затем я получаю следующий вывод, напечатанный в консоли браузера, без оператора печати, чтобы вызвать его из клиентского кода .. [{"name": "Vendor 1", "email": "[email protected]"}, {"name": "Vendor 2", "email": "[email protected]"}] [{VNDRNUM: null, VNAME: null, EMAIL: null}, {VNDRNUM: null, VNAME: null, EMAIL: null}] –

+0

В .map ((row) => new Vendor(). Он дает ошибку класса, не имеет конструктора по умолчанию. –

+0

Извините, я обновил код, чтобы добавить заголовок 'content-type' с методом 'response.headers.set()' Кроме того, я добавил конструктор по умолчанию для Vendor, поэтому вы можете использовать его для анализа результата базы данных. Надеюсь, что это поможет. – luizmineo

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