使用HTTP Get请求发送JSON正文

时间:2020-06-14 18:32:56

标签: http flutter dart

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

enter image description here

这是我的代码混乱

 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请求那样起作用。知道我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

有几件事要牢记。

1)HTTP RFC for method GET说:

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

在GET请求的正文中发送任何数据是一种糟糕的体系结构样式。

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

3)您引用的示例在GET请求中未使用body。相反,它从给定的JSON对象检索参数值,并将其放入URL。然后,该URL将通过GET调用而没有正文。

我的建议:

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