使用 HTTP get 请求发送 JSON 正文

del*_*min 5 http dart flutter

我正在尝试将 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;
    }
  }
Run Code Online (Sandbox Code Playgroud)

将 body 放入 http.get 请求中对 http.post 请求不起作用。知道我做错了什么吗?

men*_*urg 3

有几件事需要记住。

  1. GET 方法的 HTTP RFC说:

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

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

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

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

我的建议:

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