v107 在曾经有效的 Post 请求上获取 MethodNotAllowed 的状态代码

问题描述 投票:0回答:3

我正在尝试使用 RestSharp v107 获取身份验证令牌,但我不知道如何使其工作。我已经包含了以前的方法,在更新到 v107 之前该方法运行良好。有什么想法吗?

v107 返回 StatusCode = MethodNotAllowed 的代码:

private static async System.Threading.Tasks.Task<string> GetAuthTokenAsync()
    {
        GetCreds();
        var client = new RestClient(_authUrl);
        var request = new RestRequest();

        request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
        request.AddParameter("grant_type", "client_credentials");
        client.Authenticator = new HttpBasicAuthenticator(_authClientId, _authClientSecret);

        var response = await client.ExecutePostAsync(request);
        var deserializedResponse = JsonSerializer.Deserialize<Dictionary<string, string>>(response.Content);
        string authToken = deserializedResponse["access_token"];
        return authToken;
    }

在 v107 之前运行良好的旧代码:

private static string GetAuthToken()
    {
        GetCreds();
        var client = new RestClient(_authUrl);
        var request = new RestRequest() { Method = Method.POST };

        request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
        request.AddParameter("grant_type", "client_credentials");
        client.Authenticator = new HttpBasicAuthenticator(_authClientId, _authClientSecret);

        var response = client.Execute(request);
        var deserializer = new JsonDeserializer();
        var deserializedResponse = deserializer.Deserialize<Dictionary<string, string>>(response);
        string authToken = deserializedResponse["access_token"];
        return authToken;
    }
restsharp
3个回答
0
投票

看看如果在实例化时定义方法会发生什么:

var request = new RestRequest(_authUrl, Method.Post)
    .AddHeader("Content-Type", "application/x-www-form-urlencoded")
    .AddParameter("grant_type", "client_credentials");

(也可以在同一个语句中添加参数)

请告诉我它是否已解决,因为我也在 v107 上苦苦挣扎:D


0
投票

我建议在 RestSharp 存储库中打开一个问题,这样我可以帮助你。

我建议对您的代码进行一些更改。

  • 不要为每次调用都实例化 RestSharp。您有一个私有属性
    _authUrl
    ,因此您应该在构造函数中实例化
    RestClient
    并将其保存在私有字段中,例如
    _client
  • 不要手动添加内容类型标头。 RestSharp 根据请求类型和参数添加所有必要的内容标头。

您可以使用例如

HttpTracer
来跟踪请求,如文档中的 所述。然后您可以轻松查看请求是否因某种原因被破坏。

代码可能如下所示:

private async Task<string> GetAuthTokenAsync()
{
    GetCreds();
    var request = new RestRequest().AddParameter("grant_type", "client_credentials");
    var response = await client.PostAsync<Dictionary<string, string>>(request);
    return response["access_token"];
}

更新 该问题是由 RestSharp 设置的

Accept
标头中的一些错误值引起的,现已修复。


0
投票

对我来说,这是因为我根据文档示例添加了一个额外的标头,这肯定导致 Laravel 中从 Get 重定向到 Post。

//client.AddDefaultHeader("Content-Type", "application/json"); //bad in my case
client.AddDefaultHeader("Accept", "application/json"); //good in my case
© www.soinside.com 2019 - 2024. All rights reserved.