11

そうです、私はヘッダーを介した基本認証を必要とするものに取り組んでおり、HTTP Post を介していくつかの変数を渡しています。これは端末アプリです。

これは私のコードがどのように見えるかです:

import 'package:http/http.dart' as http;
import 'dart:io';
void main() {
  var url = "http://httpbin.org/post";
  var client = new http.Client();
  var request = new http.Request('POST', Uri.parse(url));
  var body = {'content':'this is a test', 'email':'john@doe.com', 'number':'441276300056'};
  request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json; charset=utf-8';
  request.headers[HttpHeaders.AUTHORIZATION] = 'Basic 021215421fbe4b0d27f:e74b71bbce';
  request.body = body;
  var future = client.send(request).then((response) => response.stream.bytesToString().then((value) => print(value.toString()))).catchError((error) => print(error.toString()));
}

エコー サーバーとして httpbin を使用しているため、何を渡しているかがわかります。本文を渡さない場合、または本文として文字列を渡す場合、コードは正しく動作します。

明らかに、これは http.Request の body 属性が文字列のみを受け入れ、それにマップを渡そうとしているためです。

それを文字列に変換することができ、おそらくうまくいくでしょうが、コードは改善できると思います。構文の観点からでも、将来の処理方法からでもありませんが、 http.dart を使用することが正しいことであるかどうかはわかりません。

誰かが私を正しい方向に向けることができますか?

前もって感謝します。

4

1 に答える 1

19

JSON文字列です。マップを JSON にエンコードし、文字列として渡す必要があります。

Map を渡すbodyFields代わりに使用できます。 このようにあなたはに固定されています。body
content-type"application/x-www-form-urlencoded"

DartDoc にpostは次のように書かれています。

/// If [body] is a Map, it's encoded as form fields using [encoding]. The
/// content-type of the request will be set to
/// `"application/x-www-form-urlencoded"`; this cannot be overridden.

少し前にこの方法でJSONデータを送信できました

return new http.Client()
  .post(url, headers: {'Content-type': 'application/json'},
      body: JSON.encoder.convert({"distinct": "users","key": "account","query": {"active":true}}))
      .then((http.Response r) => r.body)
      .whenComplete(() => print('completed'));

編集

import 'package:http/http.dart' as http;
import 'dart:io';
void main() {
  var url = "http://httpbin.org/post";
  var client = new http.Client();
  var request = new http.Request('POST', Uri.parse(url));
  var body = {'content':'this is a test', 'email':'john@doe.com', 'number':'441276300056'};
//  request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json; charset=utf-8';
  request.headers[HttpHeaders.AUTHORIZATION] = 'Basic 021215421fbe4b0d27f:e74b71bbce';
  request.bodyFields = body;
  var future = client.send(request).then((response)
      => response.stream.bytesToString().then((value)
          => print(value.toString()))).catchError((error) => print(error.toString()));
}

生産する

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "content": "this is a test", 
    "email": "john@doe.com", 
    "number": "441276300056"
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Authorization": "Basic 021215421fbe4b0d27f:e74b71bbce", 
    "Connection": "close", 
    "Content-Length": "63", 
    "Content-Type": "application/x-www-form-urlencoded; charset=utf-8", 
    "Host": "httpbin.org", 
    "User-Agent": "Dart/1.5 (dart:io)", 
    "X-Request-Id": "b108713b-d746-49de-b9c2-61823a93f629"
  }, 
  "json": null, 
  "origin": "91.118.62.43", 
  "url": "http://httpbin.org/post"
}
于 2014-06-12T11:59:36.997 に答える