使用httpclient发送带有Json主体的Get请求

4
早上我遇到了一个问题,我调用的 API 是 Get 方法,但是为了从中获取数据,我必须发送 json body。在 Postman 中测试时效果很好,但是在我的项目中使用 HttpClient 调用时无法实现。
以下是 post 的屏幕截图: enter image description here 此外,它还有一个 Bearer Token,我会在 Authorization 中传递。
现在,当我尝试在客户端实现它时,这是我的代码:
  var stringPayload = JsonConvert.SerializeObject(json);
        var client = new HttpClient();
        var request = new HttpRequestMessage
        {
            Method = HttpMethod.Get,
            RequestUri = new Uri("https://myapiendpoint/serviceability/"),
            Content = new StringContent(stringPayload, Encoding.UTF8, "application/json"),
        };
        var response = await client.SendAsync(request).ConfigureAwait(false);
        response.EnsureSuccessStatusCode();

        var responseBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

当我使用这段代码调用此方法时,我会得到以下结果:

System.Net.HttpStatusCode.MethodNotAllowed - Status code 405

我也尝试更改了这一行

 Method = HttpMethod.Get to Method = HttpMethod.Post

但仍然遇到相同的错误

我知道这是API端糟糕的实现,理想情况下应该使用POST请求,但更改不在我的掌控之中,因此需要找到解决方案。


哎呀,也许你可以尝试使用TCP来完成它。你也可以尝试使用WebClient。 - John
@John 我正在尝试在我的 Xamarin 项目中实现这个。 - Ronak Shethia
1
WebClient在我的Xamarin项目中可以使用。您也可以尝试WebClient.UploadData。另外,您确定application/json是正确的格式吗?它可能只是文本而不是json,这就是为什么服务器拒绝您的原因。 - John
HttpClient 不适用于带有请求体的 GET 请求。 - Nkosi
1个回答

7

我几乎搜索了所有的内容并尝试了使用GET方法的所有变体,最终在这种情况下起作用的解决方案是:

var client = new HttpClient();
            client.BaseAddress = new Uri("https://baseApi/");
            client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("Authorization", string.Format("Bearer {0}", token));
            var query = new Dictionary<string, string>
            {
                ["pickup_postcode"] = 400703,
                ["delivery_postcode"] = 421204,
                ["cod"] = "0",
                ["weight"] = 2,
            };

            var url = "methodurl";
            var response = await client.GetAsync(QueryHelpers.AddQueryString(url, query));
            var responseBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            return JsonConvert.DeserializeObject<MyModel>(responseBody);

从Microsoft.AspNetCore.WebUtilities包获取QueryHelpers


你可以标记此答案,这将帮助更多遇到相同问题的人 :)。 - nevermore

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