我得到以下答复:
“ {\” 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);
}
答案 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正文内容。