【问题标题】:Send JSON body with HTTP get request使用 HTTP 获取请求发送 JSON 正文
【发布时间】:2020-10-04 04:23:30
【问题描述】:

我正在尝试将 JSON 正文查询参数放入 http.get 请求中。我什至试图关注这个Flutter: Send JSON body for Http GET request,但没有运气。无论我将什么放入 params 变量中,我都会从后端获得所有结果。我用邮递员测试了后端,一切正常

这是我在颤振中的代码

 Future<List<Country>> fetchCountries(String name) async {
    final token = Provider.of<Auth>(context, listen: false).token;
    final params = {"name": "Uk"};
    try {
      Uri uri = Uri.parse(APIPath.findCountry());
      final newUri = uri.replace(queryParameters: params);
      print(newUri); //prints http://localhost:8080/country/find?name=uk
      final response = await http.get(newUri,
          headers: [APIHeader.authorization(token), APIHeader.json()]
              .reduce(mergeMaps));
      final jsonResponse = json.decode(response.body);
      if (response.statusCode == 200) {
        Iterable list = jsonResponse['result'];
        print(list);
        return list.map((model) => Country.fromJson(model)).toList();
      } else {
        throw HttpException(jsonResponse["error"]);
      }
    } catch (error) {
      throw error;
    }
  }

将正文放入 http.get 请求不像 http.post 请求那样工作。知道我做错了什么吗?

【问题讨论】:

    标签: http flutter dart


    【解决方案1】:

    有几件事要记住。

    1. HTTP RFC for method GET 说:

    GET 请求消息中的负载没有定义的语义...

    这是一种糟糕的架构风格,在 GET 请求的正文中发送任何数据。

    1. 如果您想忽略它并仍想在 GET 请求中发送正文,则将内容类型标头设置为“application/json”是有意义的。

    2. 您提到的示例未在 GET 请求中使用正文。相反,它从给定的 JSON 对象中检索参数值并将它们放入 URL。然后通过没有正文的 GET 调用此 URL。

    我的建议:

    • 如果 URL 参数的数量相对较少且它们的值很短,以便生成的 URL 可读,请使用 GET 和带参数的 URL。
    • 如果带有参数的 URL 变得难以阅读,请将参数放入正文并使用 POST。
    • 没有精确的标准。这是您的品味和个人喜好的问题。 URL 的可读性可能只是选择 GET 或 POST 时要考虑的标准之一。

    【讨论】:

    • 感谢您的回复.. 我在这里发送"Content-Type": "application/json" APIHeader.json() 但我仍然无法将正文添加到我的获取请求中,所以我想我会按照链接中的问题进行操作但这并不奏效......好吧,我将重新修改它以发布请求。我不想在我的 url 中使用参数,因为有很多参数.. 不完全适用于这个查询,但在其他查询中,所以我想将它们全部保留在正文中
    • 我只想说,“GET 请求消息中的有效负载没有定义的语义”,发送一个在正文中定义请求的大型 JSON,并不意味着它的架构不好风格。它只是意味着“没有定义的语义”。这并不意味着在 GET 请求的正文中发送 JSON 是错误的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2019-08-15
    • 2019-09-15
    • 1970-01-01
    • 2020-02-12
    • 2013-10-07
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多