加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dart – 如何在flutter中使用url编码的主体发出HTTP POST请求?

发布时间:2020-12-14 14:55:33 所属栏目:百科 来源:网络整理
导读:我正试图在内容类型为url编码的情况下发布帖子请求.当我写body:json.encode(data)时,它编码为纯文本. 如果我写body:data我得到错误类型’_InternalLinkedHashMap String,dynamic‘不是类型转换中类型’String’的子类型 这是数据对象 var match = { "homeT
我正试图在内容类型为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中使用)
如果您想坚持使用该软件包:http版本,那么您需要稍微调整一下Map. body必须是Map< String,String>.您需要确定您想要的POST参数.你想要两个:homeTeam和awayTeam吗?或者一个,比如,teamJson?

这段代码

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

在线上产生这个

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

或者,这个

Map<String,'teamJson': json.encode({
      'homeTeam': {'team': 'Team A'},}),);

在线上产生这个

name=doodle&color=blue&teamJson=%7B%22homeTeam%22%3A%7B%22team%22%3A%22Team+A%22%7D%2C%22awayTeam%22%3A%7B%22team%22%3A%22Team+B%22%7D%7D

包:http客户端负责:编码Uri.encodeQueryComponent,utf8编码(请注意,这是默认值,因此无需指定)并在Content-Length标头中发送长度.您仍然必须执行json编码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读