13
votes

État incorrect: impossible de définir les champs de corps d'une requête avec le type de contenu "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"},
      );

When I execute this I am unable to recieve data and the error thrown is Bad state: Cannot set the body fields of a Request with content-type "application/json"

2 commentaires

try - body: json.encode({"grant_type":"password","username":"******","pa‌​ssword":"*****","sco‌​pe":"offline_access"‌​}),


Attention, vous avez également username/password votre username/password même s'il peut s'agir d'un utilisateur test, ce n'est pas une bonne pratique ...


3 Réponses :


34
votes

Vous devez envelopper le corps dans 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,
            );


1 commentaires

Merci! Au début, je n'ai pas vu la différence entre votre réponse et la question, mais maintenant je vois que la clé est d'envelopper le littéral de la carte dans un jsonEncode



1
votes

eu un problème similaire avec la bibliothèque http ... changé pour dio 2.1.0 et le problème avec les en-têtes a disparu.

jsonEncode (body) n'a pas fait l'affaire, car la documentation dit:

Envoie une requête HTTP POST avec les en-têtes et le corps donnés à l'URL donnée, qui peut être un [Uri] ou une [String].

[body] définit le corps de la requête. Il peut s'agir d'une [String], d'une [List] ou d'une [Map <String, String>]. S'il s'agit d'une chaîne, elle est encodée à l'aide de [encoding] et utilisée comme corps de la requête. Le type de contenu de la demande sera par défaut "text / plain".

Si [corps] est une liste, il est utilisé comme une liste d'octets pour le corps de la requête.

Si [corps] est une carte, il est encodé en tant que champs de formulaire en utilisant [encoding]. Le type de contenu de la requête sera défini sur "application/x-www-form-urlencoded" ; cela ne peut pas être annulé. [encoding] est par défaut [utf8].

Pour un contrôle plus précis de la requête, utilisez plutôt [send].

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


0 commentaires

0
votes
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;
        }
      }

0 commentaires