使用HTTP GET请求发送JSON数据体

5

我正在尝试将JSON请求参数放入http.get请求中。我甚至尝试遵循这个Flutter:为Http GET请求发送JSON正文,但是没有成功。无论我将什么放入params变量中,我都会从后端得到所有结果。我已经用postman测试了后端,一切都正常。

enter image description here

这是我的Flutter代码

 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;
    }
  }

将body放入http.get请求中无法像http.post请求那样工作。有任何想法我做错了什么吗?

1个回答

2
记住以下几点:
1. 根据HTTP RFC GET方法的规定,GET请求中的负载没有定义的语义。因此,在GET请求的正文中发送任何数据是一种不好的架构风格。
2. 如果您仍然想在GET请求中发送正文,请将内容类型标头设置为“application/json”。
3. 示例中并未在GET请求中使用正文。相反,它从给定的JSON对象中检索参数值并将它们放入URL中。然后通过GET调用此URL而不使用正文。
我的建议:
1. 如果URL参数数量相对较少且它们的值很短,以便生成的URL易于阅读,请使用GET和带参数的URL。
2. 如果URL参数变得难以阅读,请将参数放入正文中并使用POST。
3. 没有精确的标准。这是关于您的品味和个人喜好的问题。当选择GET或POST时,URL的可读性可能只是要考虑的标准之一。

1
感谢您的回复。我在APIHeader.json()中发送了"Content-Type": "application/json",但仍无法将正文添加到我的GET请求中,所以我想我会按照链接中的问题进行操作,但那也没有起作用...好吧,那我就改为使用POST请求。我不想在我的URL中使用参数,因为有很多参数...虽然对于这个查询不是很多,但在其他查询中有很多,所以我想将它们全部放在正文中。 - delmin
我只是想说,“GET请求消息中的有效载荷没有定义的语义”,并且在请求体中发送一个大的JSON来定义该请求并不意味着它是不良的架构风格。它只是确切地意味着“没有定义的语义”。这并不意味着在GET请求的正文中发送JSON是错误的。 - enorl76

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接