web-dev-qa-db-ja.com

Http POST Dart:ioのjson content-typeを使用したリクエスト

HTTPを実行する方法POSTコンソールのDartアプリケーションを使用する(Dart:ioを使用する、またはpackage:httpライブラリを使用する場合があります。私はそのようなことをします:

import 'package:http/http.Dart' as http;
import 'Dart:io';

  http.post(
    url,
    headers: {HttpHeaders.CONTENT_TYPE: "application/json"},
    body: {"foo": "bar"})
      .then((response) {
        print("Response status: ${response.statusCode}");
        print("Response body: ${response.body}");
      }).catchError((err) {
        print(err);
      });

しかし、次のエラーが発生します:

Bad state: Cannot set the body fields of a Request with content-type "application/json".
21
Roman

http.Dartから:

/// [body] sets the body of the request. It can be a [String], a [List<int>] or
/// a [Map<String, String>]. If it's a String, it's encoded using [encoding] and
/// used as the body of the request. The content-type of the request will
/// default to "text/plain".

それで、JSON本体を自分で生成してください( JSON.encode from Dart:convert を使用)。

24
Quentin

これは完全な例です。リクエストの本文をJSONに変換するには、json.encode(...)を使用する必要があります。

import 'package:http/http.Dart' as http;
import 'Dart:convert';
import 'Dart:io';


var url = "https://someurl/here";
var body = json.encode({"foo": "bar"});

Map headers = {
  'Content-type' : 'application/json', 
  'Accept': 'application/json',
};

final response =
    http.post(url, body: body, headers: headers);
final responseJson = json.decode(response.body);
print(responseJson);

一般に、リクエストにはFutureを使用して、次のようなことを試すことをお勧めします

import 'package:http/http.Dart' as http;
import 'Dart:convert';
import 'Dart:io';

Future<http.Response> requestMethod() async {
    var url = "https://someurl/here";
    var body = json.encode({"foo": "bar"});

    Map<String,String> headers = {
      'Content-type' : 'application/json', 
      'Accept': 'application/json',
    };

    final response =
        await http.post(url, body: body, headers: headers);
    final responseJson = json.decode(response.body);
    print(responseJson);
    return response;
}

構文の唯一の違いは、asyncおよびawaitキーワードです。

27
draysams