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"));
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.
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 .
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"));