我得到的返回响应为:
"{\"error\":\"unsupported_grant_type\",\"errordescription\":"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);
}
您的代码不会生成任何类似于有价值的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文档,在一个调用中设置正确的内容类型标头和JSON正文内容。
在我的案例中,问题是我的请求被错误地编码为"content-type" : "application/x-www-form-urlencoded"
。基于这个解决方案,我以不同的方式构建了我的request.httpBody
,它起到了作用。