错误状态:无法设置内容类型为“application/json”的请求的正文字段

Fay*_*yaz 48 http dart flutter

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"},
      );

Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,我无法接收数据并且抛出的错误是

错误状态:无法设置内容类型为“application/json”的请求的正文字段

小智 107

您需要将身体包裹在jsonEncode.

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,
            );
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!起初我没有看到你的答案和问题之间的区别,但现在我发现关键是将地图文字包装在 jsonEncode 中 (3认同)

Roh*_*had 11

使用jsonEncode包裹你的身体object

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

var headers = {
    'Content-Type':'application/json',
    'authorization':'Basic c3R1ZHlkb3RlOnN0dWR5ZG90ZTEyMw=='
};

final body = {
    'username':'foo',
    'password':'pass123'
}

var response = await post(
    Urls.getToken,
    headers: headers,
    body: jsonEncode(body), // use jsonEncode()
);
Run Code Online (Sandbox Code Playgroud)

为什么jsonEncode

body : 它可以是 [String]、[List] 或 [Map<String, String>]。它使用 encoding 进行编码并用作请求的正文。请求的内容类型将默认为“text/plain”。

但是因为你设置content-typejson你必须传递一个 JSON 作为正文。

但是您Map<String, String>作为主体传递,这显然会引发错误。

所以要解决这个问题,你必须改变或编码您Map<String, String>json通过使用(JSON字符串)jsonEncode