“ {\” error \“:\” unsupported_grant_type \“,\” error_description \“:\”补助金类型为NULL \“}”

时间:2018-12-20 15:55:05

标签: c# .net json serialization json.net

我得到以下答复:

  

“ {\” error \“:\” unsupported_grant_type \“,\” error_description \“:\” Grant   类型为NULL \“}”

我尝试了几种不同的方法来构建它想要的JSON字符串,但是我没有任何运气。我看到了一些使人们可以使用它的示例,但他们必须对其进行了更改。

这是我的代码:

public string PostPayment([FromBody]Payment_DTO payment)
{
    //Request token
    var client = new RestClient(_EndPoint);
    var request = new RestRequest(Method.POST);
    string json = BuildTokenRequest();
    string svcCredentials = 
    Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(_UserName + ":" + 
    _Password));

    request.AddHeader("cache-control", "no-cache");
    request.AddHeader("Authorization", "Basic " + svcCredentials);
    request.AddHeader("content-type", "application/x-www-form- 
    urlencoded");
    request.AddParameter("application/json", json, 
    ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);

    return response.Content.ToString();
}

我认为问题出在我的json构建器函数中。我确定我在这里做错了事:

public string BuildTokenRequest()
{
    //string request = "grant_type=" + _Password + "&client_id=" + _UserName + "&client_secret=" + _Password + "$username=" + _UserName + "&password=" + _Password;
    string request = "client_id="+ _UserName + "secret=" + _Password + "grant_type=client_credentials";

    return JsonConvert.SerializeObject(request);
}

1 个答案:

答案 0 :(得分:4)

您的代码不会产生类似于有价值的JSON对象的任何东西,它只会将一个简单的字符串序列化为JSON。当您这样做时,您真正从另一端得到的仅仅是……一个简单的字符串-因为这已经是有效的JSON。序列化程序无法知道您打算将它们作为单独的字段,而只能看到一段很长的文本。它没有办法赋予它任何额外的含义。

例如:

string _UserName = "123";
string _Password = "abc";
string request = "client_id=" + _UserName + "secret=" + _Password + "grant_type=client_credentials";
Console.WriteLine(JsonConvert.SerializeObject(request));

将仅输出

"client_id=123secret=abcgrant_type=client_credentials"

演示:https://dotnetfiddle.net/DTDDjI

现在,正如我所说的,从技术上讲,它是有效的JSON,但它不太可能成为远程服务器所期望的-再次,它将不知道需要解析该字符串并从中提取值。我无法指定您的远程API(因为您没有告诉我们您要调用的端点或将我们链接到任何文档),但我想象会期望一个对象的值位于单独的字段中。为了从C#中获得这种东西,您需要以一个C#对象开始:

例如:

string _UserName = "123";
string _Password = "abc";
var request = new { client_id = _UserName, secret = _Password, grant_type = "client_credentials" };
Console.WriteLine(JsonConvert.SerializeObject(request));

将输出

{"client_id":"123","secret":"abc","grant_type":"client_credentials"}

演示:https://dotnetfiddle.net/wCpMhV

请注意,使用包含离散字段的匿名对象传递给JSON序列化程序,然后使用包含离散字段的对象作为结果。

正如我所说,我无法检查这是否正是远程服务器期望的布局,但是您应该能够查看文档以查看是否正确。如果不是这样,您现在希望了解如何正确生成一个符合规范的有用的JSON对象。


另一点。这行代码:

request.AddHeader("content-type", "application/x-www-form-urlencoded");

是不必要的。您可以删除它,因为

a)它为包含JSON和

的请求设置了错误的内容类型

b)下面的行(根据RestSharp docs,在一次调用中同时设置了正确的内容类型标头和JSON正文内容。