dart – 如何在flutter中使用url编码的主体发出HTTP POST请求?
我正试图在内容类型为url编码的情况下发布帖子请求.当我写body:json.encode(data)时,它编码为纯文本.
如果我写body:data我得到错误类型’_InternalLinkedHashMap< String,dynamic>‘不是类型转换中类型’String’的子类型 这是数据对象 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: match,encoding: Encoding.getByName("utf-8")); 解决方法
您需要添加三个额外步骤:
首先,您需要将json映射转换为String(使用json.encode) 然后,如果要将其作为application / x-www-form-urlencoded发送,则需要对其进行Uri编码. 最后,您需要为要发布名称的参数指定. 例如(注意,这是使用dart:io HttpClient,但它基本相同): 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(); } 以上是针对dart:io版本(当然,你可以在Flutter中使用) 这段代码 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,); 在线上产生这个
或者,这个 Map<String,'teamJson': json.encode({ 'homeTeam': {'team': 'Team A'},}),); 在线上产生这个
包:http客户端负责:编码Uri.encodeQueryComponent,utf8编码(请注意,这是默认值,因此无需指定)并在Content-Length标头中发送长度.您仍然必须执行json编码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |