2014-09-12 2 views
1

Я пытался отправить данные на локальный сервер с помощью HttpClient. Тем не менее, данные никогда не добавляется к запросу, я использую этот код:dart - написать тело HttpClientReques не удается?

 new HttpClient().put('127.0.0.1', 4040, '/employees/1').then((request) { 
     request.cookies.add(new Cookie('DARTSESSID',sessionId)..path = '/'); 
     request.headers.add(HttpHeaders.ACCEPT_ENCODING, ""); 
     request.headers.add(HttpHeaders.CONTENT_TYPE, "text/json"); 
     request.write('{"id": 1, "name": "luis"}'); 

     print(request.contentLength); 
     return request.close(); 
     }).then(expectAsync((HttpClientResponse response) { 
     expect(response.statusCode, 200); 
     UTF8.decodeStream(response).then(expectAsync((body) { 
      expect(body, equals('"employee: 1"')); 
     })); 
     })); 

но всегда печатает, что request.contentLenght является -1. Я видел эти ссылки, прежде чем без везения:

https://code.google.com/p/dart/issues/detail?id=13293

dart - HttpClientRequest failing on adding data

https://code.google.com/p/dart/issues/detail?id=10026

ответ

2

ContentLength из -1 не означает, что нет никаких данных, то это означает, что длина контента неизвестна, и который используется режим потокового контента - для HTTP 1.1, это будет означать, как правило, ChunkedContentEncoding.

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

import 'dart:convert'; 
import 'dart:io'; 

void main() { 
    HttpServer.bind('127.0.0.1', 4040).then((server) { 
    server.listen((request) { 
     UTF8.decodeStream(request).then((body) { 
     print(body); 
     request.response.close(); 
     }); 
    }); 
    new HttpClient().put('127.0.0.1', 4040, '/employees/1').then((request) { 
     request.cookies.add(new Cookie('DARTSESSID', "1")..path = '/'); 
     request.headers.add(HttpHeaders.ACCEPT_ENCODING, ""); 
     request.headers.add(HttpHeaders.CONTENT_TYPE, "text/json"); 
     request.write('{"id": 1, "name": "luis"}'); 

     print(request.contentLength); 
     return request.close(); 
    }).then((HttpClientResponse response) { 
     UTF8.decodeStream(response).then((body) { 
     print(body); 
     }); 
    }); 
    }); 
} 

Когда я запускаю код, я получаю

-1 
{"id": 1, "name": "luis"} 

как ожидается. Возможно, проблема, с которой вы сталкиваетесь, находится на сервере?

+0

проблема была вызвана тем, что я также просил ContentLength на сервере. Похоже, что значение contentLength не было настроено перед отправкой данных на сервер. Чтобы решить проблему, я расшифровал поток и проверил, пусто ли тело, вместо проверки длины содержимого. Благодарю. –

2

Запись на запрос является асинхронной операцией. Просто потому, что contentLength говорит, что он по-прежнему равен -1, не означает, что данные не добавляются в запрос перед отправкой на сервер.

Также: длина контента не должна обновляться при добавлении новых данных. Это значение, которое отправляется на сервер. -1 означает, что вы еще не знаете размер. Я не уверен, если библиотека автоматически обновит его, если он знает размер, но ему это не нужно.

+0

Да, но все же я не могу получить данные на сервере. Он всегда отправляет пустой запрос. Что еще я могу сделать, чтобы записать данные в тело запроса? –

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