web-dev-qa-db-fra.com

Comment faire une requête HTTP POST avec un corps encodé en URL dans le flutter?

J'essaie de faire une demande de publication dans le flutter avec le type de contenu que l'URL codé. Lorsque j'écris body : json.encode(data), il code en texte brut.

Si j'écris body: data j'obtiens l'erreur type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String' in type cast

C'est l'objet de données

var match = {
  "homeTeam": {"team": "Team A"},
  "awayTeam": {"team": "Team B"}
};

Et ma demande

var response = await post(Uri.parse(url),
    headers: {
      "Accept": "application/json",
      "Content-Type": "application/x-www-form-urlencoded"
    },
    body: match,
    encoding: Encoding.getByName("utf-8"));
20
Chinmay Naphade

Vous devez ajouter trois étapes supplémentaires: Vous devez d’abord convertir le mappage json en une chaîne (à l’aide de json.encode). Vous devez ensuite le coder en Uri si vous souhaitez l’envoyer au format application/x-www-form-urlencoded. Enfin, vous devez donner un nom au paramètre que vous publiez.

Par exemple (notez que ceci utilise le Dart: io HttpClient, mais c'est fondamentalement le même):

  Future<HttpClientResponse> foo() async {
    Map<String, dynamic> jsonMap = {
      'homeTeam': {'team': 'Team A'},
      'awayTeam': {'team': 'Team B'},
    };
    String jsonString = json.encode(jsonMap); // encode map to json
    String paramName = 'param'; // give the post param a name
    String formBody = paramName + '=' + Uri.encodeQueryComponent(jsonString);
    List<int> bodyBytes = utf8.encode(formBody); // utf8 encode
    HttpClientRequest request =
        await _httpClient.post(_Host, _port, '/a/b/c');
    // it's polite to send the body length to the server
    request.headers.set('Content-Length', bodyBytes.length.toString());
    // todo add other headers here
    request.add(bodyBytes);
    return await request.close();
  }

Ce qui précède s’applique à la version Dart: io (que vous pouvez bien entendu utiliser dans Flutter). Si vous souhaitez conserver le package: version http, vous devez modifier légèrement votre carte. body doit être une carte <String, String>. Vous devez décider de ce que vous voulez comme paramètres POST. Vous en voulez deux: homeTeam et awayTeam? ou un, par exemple, teamJson?

Ce code

  Map<String, String> body = {
    'name': 'doodle',
    'color': 'blue',
    'homeTeam': json.encode(
      {'team': 'Team A'},
    ),
    'awayTeam': json.encode(
      {'team': 'Team B'},
    ),
  };

  Response r = await post(
    url,
    body: body,
  );

produit ceci sur le fil

name = doodle & color = blue & homeTeam =% 7B% 22team% 22% 3A% 22Team + A% 22% 7D & Équipe =% 7B% 22Team% 22% 3A% 22Equipe + B% 22% 7D

alternativement, cela

  Map<String, String> body = {
    'name': 'doodle',
    'color': 'blue',
    'teamJson': json.encode({
      'homeTeam': {'team': 'Team A'},
      'awayTeam': {'team': 'Team B'},
    }),
  };

  Response r = await post(
    url,
    body: body,
  );

produit ceci sur le fil

nom = griffonnage & couleur = bleu & équipeJson =% 7B% 22homeTeam% 22% 3A% 7B% 22% équipe% 22% 3A% 22% 7%% 22% 3% % 22% 7D% 7D

le paquet: le client http s'occupe de: encoder Uri.encodeQueryComponent, encoder utf8 (notez que c'est la valeur par défaut, inutile de le spécifier) ​​et envoyer la longueur dans l'en-tête Content-Length. Vous devez toujours faire le codage JSON.

16
Richard Heap

Je voudrais vous recommander le paquet dio , dio est un puissant client Http pour Dart/Flutter, qui prend en charge les intercepteurs, les données de formulaire, les annulations de demandes, les téléchargements de fichiers, les délais, etc. .

dio est très facile à utiliser. Dans votre cas, vous pouvez:

Map<String, String> body = {
'name': 'doodle',
'color': 'blue',
'teamJson': {
  'homeTeam': {'team': 'Team A'},
  'awayTeam': {'team': 'Team B'},
  },
};

dio.post("/info",data:body, options: 
  new Options(contentType:ContentType.parse("application/x-www-form-urlencoded")))    

dio peut encoder les données automatiquement.

Plus de détails s'il vous plaît se référer à dio .

12
wendu

vous devez utiliser json.encode

exemple;

var match = {
  "homeTeam": {"team": "Team A"},
  "awayTeam": {"team": "Team B"}
};
var response = await post(Uri.parse(url),
    headers: {
      "Accept": "application/json",
      "Content-Type": "application/x-www-form-urlencoded"
    },
    body: json.encode(match),
    encoding: Encoding.getByName("utf-8"));
7
Nebi Sarıgül