"{\" error \ ": \" unsupported_grant_type \ ", \" error_description \ ": \" Тип предоставления - NULL \ "}" - PullRequest
0 голосов
/ 20 декабря 2018

Я получаю ответный ответ:

"{\" error \ ": \" unsupported_grant_type \ ", \" error_description \ ": \" Тип разрешения равен 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 Builder сама по себе.Я уверен, что я делаю что-то не так здесь:

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 голосов
/ 20 декабря 2018

Ваш код не производит ничего похожего на стоящий объект 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 * 1036)* Установите правильный заголовок типа содержимого и содержимое тела JSON за один вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...