【问题标题】:Sending int and boolean at body of http post method in flutter在颤动的http post方法的主体中发送int和boolean
【发布时间】:2021-03-15 19:00:27
【问题描述】:

您好,我有一个 http 帖子

final http.Response response = await client.post(
      'http://someurl/',
        headers: {
          HttpHeaders.contentTypeHeader: "application/json",
          "Content-Type": "application/x-www-form-urlencoded",
          "Authorization": token
        },
        body: {
          "isItTake": false,
          "servisID": 1
        }
    );

但是当我尝试这个 post 方法时,我得到“未处理的异常:类型 'bool' 不是类型转换中类型 'String' 的子类型”。我可以将 API 更改为期望字符串,但我想知道是否有解决方法来发送 int 或 boolean。 请注意,当我向邮递员发送类似请求时,一切都很好。
编辑:
邮递员:
POST /someendpoint/ HTTP/1.1
主持人:somehost
授权:令牌 sometoken
内容类型:application/json
缓存控制:无缓存
邮递员令牌:20582fd0-c980-2d0d-fb2f-3bdd87d767f5 \

{ “isItTake”:假的, “服务标识”:1 }

【问题讨论】:

  • 在邮递员上使用一切都一样吗?标题,正文等..?如果是,那么它应该可以工作.. 复制/粘贴 postman curl 问题只是为了检查是否有任何不同..
  • @jignesh 我按照你的要求编辑了这个问题。我相信我所做的一切都像在邮递员中所做的那样。
  • 我在邮递员 curl 中看不到 "Content-Type": "application/x-www-form-urlencoded"。你可以在 Flutter 上尝试不使用它吗?
  • @jignesh 我试过了,没什么变化。
  • hmm.. 我目前看不到任何其他差异.. 似乎需要尝试使用一些端点来模仿这种行为。

标签: flutter


【解决方案1】:

尝试将请求正文值作为字符串发送,看看是否可行。我之前遇到过这个问题,类型与 http 请求的请求主体不匹配,我不太确定为什么它会引发这样的异常,即使 api 的文档清楚地指定了请求主体中每个值的类型.试试这个:

final http.Response response = await client.post(
      'http://someurl/',
        headers: {
          HttpHeaders.contentTypeHeader: "application/json",
          "Content-Type": "application/x-www-form-urlencoded",
          "Authorization": token
        },
        body: {
          "isItTake": 'false',
          "servisID": '1'
        }
    );

或者,如果您在某些 bool 和 int 变量中有您的值:

final http.Response response = await client.post(
      'http://someurl/',
        headers: {
          HttpHeaders.contentTypeHeader: "application/json",
          "Content-Type": "application/x-www-form-urlencoded",
          "Authorization": token
        },
        body: {
          "isItTake": isItTake.toString(),
          "servisID": servisID.toString()
        }
    );

【讨论】:

  • 正如我在问题中所说的那样,我可以做到这一点,但是否有解决方法。请阅读问题。
  • @Savrona 如果我弄错了,请原谅我,但是,在你的问题中,你说你不喜欢改变 api 来期待字符串。好吧,使用我提供的解决方案,您不必更改它。该 api 仍将期待 boolean 和 int。它只是在您的请求正文中,您将它们作为字符串发送。奇怪的是,这对我来说在一个项目中很有效。
【解决方案2】:

使用String encoded = json.encode(theMap);,然后发布encoded。如果您需要特定的字符编码(例如 utf-8),则使用 utf8.encode(encoded) 进一步对字符串进行编码并发布结果字节数组。 (utf-8 不需要第二步,因为我认为这是默认设置。)

这 3 个变体的作用值得考虑:

  • List<int> - 发送一个不透明的字节数组
  • String 使用字符编码将字符串编码为字节 - 并发送字节数组
  • Map<String, String> - 将字符串键/值对编码为 x-www-form-urlencoded 并发送。

如果您想发送更复杂的数据,则需要将其转换为上述之一(并且服务器需要知道如何对其进行解码)。这就是 content-type 标头有用的地方。最终,服务器接收一个字节数组并将其转换回,例如,一个字符串,或一些 json,或一组表单字段,或一个图像。它知道如何根据标头和任何指定的编码来执行此操作。

完整信用:Source

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多