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

时间:2019-02-24 07:29:30

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

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

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

5 个答案:

答案 0 :(得分:8)

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()
);

为什么是jsonEncode

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

但是因为您将 content-type 设置为 json,所以您必须传递一个 JSON 作为正文。

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

因此,要解决此问题,您必须使用 Map<String, String>json 更改或编码为 jsonEncode(JSON 字符串)。

答案 1 :(得分:0)

基本上就是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,
            );

答案 2 :(得分:0)

http库也有类似问题...已更改为dio 2.1.0,并且标头的问题已消失。

jsonEncoede(body)并没有解决问题,因为文档说:

  

将具有给定标头和正文的HTTP POST请求发送到给定      URL,可以是[Uri]或[String]。

     

[body]设置请求的主体。它可以是[String],[List]      或[地图]。如果是字符串,则使用      [encoding]并用作请求的主体。的内容类型      请求将默认为“文本/纯文本”。

     

如果[body]是列表,则用作[body]主体的字节列表。      请求。

     

如果[body]是Map,则使用[encoding]将其编码为表单字段。的      请求的内容类型将设置为      "application/x-www-form-urlencoded";这不能被覆盖。     [encoding]默认为[utf8]。

     

要对请求进行更细粒度的控制,请改用[send]。

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

答案 3 :(得分:0)

Map<String,String> header = {'Content-Type':'application/json-patch+json','accept':'application/json'};
    final msg = jsonEncode({"username":"$emailorPhoneN","password":"$passwrod"});

    try {
      var response = await http.post(UrlConstants.loginUrl, headers: header, body: msg,
      ).timeout(Duration(seconds: httpDuration));
      var convert = json.decode(response.body);
      print('**********Data from server $convert');

      if (convert == null) {
        return null;
      } else {
        String token = convert['token'];

        if (token != null) {
          SignUpModel signUpModel = SignUpModel.fromJson(convert);
          return signUpModel;
        } else {
          //*** GET Error message from the API provider.....
          SignUpModel signUpModel = SignUpModel.fromJson(convert);
          return signUpModel;
        }
      }

答案 4 :(得分:0)

异常是由错误地设置 bodyFields 引起的。 请参阅:bodyFields

bodyFields 用于表单编码数据,而不是JSON。 有关如何 POST JSON 的示例,请参阅:Write HTTP servers

因此,您尝试将 Map 作为主体传递。在这种情况下,它会假设您实际上是在执行 application/x-www-form-urlencoded。您需要做的是将 Map 编码为字符串,然后执行您正在执行的操作。

示例

  Future<http.Response> patchAPICall(
      String url, Map param, String token) async {
    var responseJson;
    try {
      final response = await http.patch(Uri.parse(url),
          body: jsonEncode(param),
          headers: {
            "Authorization": token,
            "Content-Type": "application/json"
          }).timeout(const Duration(seconds: 60),
          onTimeout: () => throw TimeoutException(
              'The connection has timed out, Please try again!'));
      responseJson = response;
    } on SocketException {
      throw FetchDataException("You are not connected to internet");
    } on TimeoutException {
      print('Time out');
      throw TimeoutException("The connection has timed out, Please try again");
    }
    return responseJson;
  }