web-dev-qa-db-ja.com

悪い状態:コンテンツタイプが「application / json」のリクエストの本文フィールドを設定できません

Map<String,String> headers = {'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='};

var response = await post(Urls.getToken,
        headers: headers,
        body: {"grant_type":"password","username":"******","password":"*****","scope":"offline_access"},
      );

これを実行すると、データを受信できず、スローされるエラーは

悪い状態:コンテンツタイプが「application/json」のリクエストの本文フィールドを設定できません

4
Fayaz

基本的には、ファヤズが以前に言ったことだけです。

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

Map<String,String> headers = {'Content-Type':'application/json','authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='};
final msg = jsonEncode({"grant_type":"password","username":"******","password":"*****","scope":"offline_access"});

var response = await post(Urls.getToken,
               headers: headers,
               body: msg,
            );
6
Monza

httpライブラリで同様の問題がありました... dio 2.1.0用に変更され、ヘッダーの問題はなくなりました。

jsonEncoede(body)は、ドキュメントに次のように記載されているため、トリックを実行しませんでした。

指定されたヘッダーと本文を含むHTTP POSTリクエストを指定されたURL([Uri]または[String])に送信します。

[body]はリクエストの本文を設定します。 [文字列]、[リスト]、または[マップ]にすることができます。文字列の場合は、[encoding]を使用してエンコードされ、リクエストの本文として使用されます。リクエストのコンテンツタイプはデフォルトで「text/plain」になります。

[body]がリストの場合、リクエストの本文のバイトリストとして使用されます。

[body]がマップの場合、[encoding]を使用してフォームフィールドとしてエンコードされます。リクエストのコンテンツタイプは"application/x-www-form-urlencoded"に設定されます。これを上書きすることはできません。 [encoding]のデフォルトは[utf8]です。

リクエストをよりきめ細かく制御するには、代わりに[send]を使用してください。

Future<Response> post(url, {Map<String, String> headers, body, Encoding encoding});
1
Matt