【问题标题】:HttpRequestMessage somehowe always results in a GET MethodHttpRequestMessage 总是会产生一个 GET 方法
【发布时间】:2021-01-13 13:47:43
【问题描述】:

目前我正在为 NopCommerce 构建一个发货插件。在这种特殊情况下,我必须使用目标客户端 Rest API 进行身份验证。为此,我创建了一个(测试)身份验证方法。

仅供参考:端点与 Postman 一起工作正常。例如,也更改为 PUT/Delete。也可以正常工作。只有 POST 方法被更改为 GET。总是!

此外,以下 StackOverflow 问题似乎是我目前遇到的问题,但不是解决方案。

httpClient.PostAsync() performs GET request anyway

方法:

public async Task<string> PostHttpReqMessageAsync()
    {
        DHLApiRequestModel model = new DHLApiRequestModel()
        {
            UserId = _dhlSettings.UserID,
            Key = _dhlSettings.Key,
            AccountNumber = new List<string>()
            {
                _dhlSettings.AccountNumber
            }
        };

        string requestMessage = JsonConvert.SerializeObject(model);
        HttpContent content = new StringContent(requestMessage, Encoding.UTF8, "application/json");
        HttpRequestMessage httpReqMessage = new HttpRequestMessage(HttpMethod.Post, "authenticate/api-key")
        {
            Method = HttpMethod.Post,
            Content = content
        };

        try
        {
            HttpResponseMessage httpResponseMessage = await _httpClient.SendAsync(httpReqMessage);
            if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.OK)
                return await httpResponseMessage.Content.ReadAsStringAsync();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }

        return null;
    }

调试时的结果:Method: GET, RequestUri: 'http://api-dp.nl/authenticate/api-key', Version: 1.1, Content: , Headers:

【问题讨论】:

  • “调试时”具体是什么意思?您确定远程端没有将您的 POST 重定向到 GET 吗?如果这是您的代码的问题,我会感到非常惊讶——它看起来很好(您重复 HttpMethod.Post 两次,但这只是气味,而不是实际问题)。您是否使用 Fiddler 来准确观察发送的内容?
  • 在结账时选择发货方式时,很难说 NopCommerce 使用的另一种方法调用了此方法。但是当我说调试时,我的意思是在本地主机中调试。远程端和重定向是什么意思?如何查看我是否被重定向到 Get 方法?先感谢您。还会去除异味
  • 我在问您如何检查代码发出的请求。服务器可能会返回一个303302,并使用它来要求客户端使用不同的方法重新请求(HttpClient 将自动执行)。正如我所说,使用 Fiddler 来准确观察正在发送的请求
  • 嗯。当我使用提琴手捕获流量时。我得到以下信息: HTTP: localhost:55390 /checkout/OpcSaveBilling/ localhost:55390/checkout/OpcSaveBilling 200 POST
  • 看起来它正在正确发送 POST,然后?

标签: c# api post httpclient nopcommerce


【解决方案1】:

感谢canton7 我有一个解决方案/修复。问题和解决方案都很奇怪,但现在似乎可以了。

PostHttpReqMessageAsync() 方法,实际的 HttpClient 由 Parent 方法 GetShippingOptionResponse() 触发,而后者又由 GetShippingOptions() NopCommerce 本机方法触发。

所以我代替:

return _dhlService.GetShippingOptionResponse(getShippingOptionRequest);

我做到了:

var options = _dhlService.GetShippingOptionResponse(getShippingOptionRequest);
return options;

现在好像可以用了?

实际问题?可能是 301。我在做 POST 方法,而 NopCommerce 正在做 GET 方法。我猜这导致我重定向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2023-02-07
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多