В C# не поддерживается тип гранта для вызова веб-API
Я пытаюсь выполнить сообщение для моего WebAPI из настольного приложения c# WPF.
независимо от того, что я делаю, я получаю
{"error": "unsupported_grant_type"}
это то, что я пробовал (и я пробовал все, что мог найти):
также веб-разработчиков API в настоящее время активный для тестирования: http://studiodev.biz/
базовый объект http-клиента:
var client = new HttpClient()
client.BaseAddress = new Uri("http://studiodev.biz/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
С помощью следующих отправить методы:
var response = await client.PostAsJsonAsync("token", "{'grant_type'='password'&'username'='username'&'password'='password'");
var response = await client.PostAsJsonAsync("token", "grant_type=password&username=username&password=password");
после этого не удалось, я сделал некоторые googling и попытался:
LoginModel data = new LoginModel(username, password);
string json = JsonConvert.SerializeObject(data);
await client.PostAsync("token", new JsonContent(json));
тот же результат, поэтому я попробовал:
req.Content = new StringContent(json, Encoding.UTF8, "application/x-www-form-urlencoded");
await client.SendAsync(req).ContinueWith(respTask =>
{
Application.Current.Dispatcher.Invoke(new Action(() => { label.Content = respTask.Result.ToString(); }));
});
Примечание: я могу сделать успешный вызов с Chrome.
Обновить Результат Скрипача

может кто-нибудь, пожалуйста, помогите мне сделать успешный вызов выше веб-api...
Пожалуйста, дайте мне знать, если я могу помочь прояснить.
Спасибо!!
4 ответов:
реализация по умолчанию
OAuthAuthorizationServerHandlerпринимает только кодировку формы (т. е.application/x-www-form-urlencoded), а не кодировка JSON (application/JSON).ваш запрос
ContentTypeдолжно бытьapplication/x-www-form-urlencodedи передать данные в организме, как:grant_type=password&username=Alice&password=password123т. е. не в формате JSON.
пример chrome выше работает, потому что он не передает данные как JSON. Это нужно только для получения токена; для других методов вашего API вы можете использовать JSON.
этот вид проблема также обсуждается здесь.
1) Обратите внимание на URL: "localhost: 55828 / token "(не "localhost:55828/API/token")
2) Обратите внимание на запрос данных. Его не в формате JSON, его просто данные без двойных кавычек. "[email protected]&password=Test123$ & grant_type=password"
3) Обратите внимание на тип контента. Тип контента: приложение/х-www-формы-urlencoded' (не содержимое-тип: 'приложение/JSON')
4) Когда вы используете javascript для создания запроса post, вы можете использовать следующее:
$http.post("localhost:55828/token", "userName=" + encodeURIComponent(email) + "&password=" + encodeURIComponent(password) + "&grant_type=password", {headers: { 'Content-Type': 'application/x-www-form-urlencoded' }} ).success(function (data) {//...смотрите скриншоты ниже от почтальона:
вот рабочий пример, который я использовал, чтобы сделать этот запрос моего локального приложения Web API, работающего на порту 43305 с использованием SSL. Я поставил проект на GitHub. https://github.com/casmer/WebAPI-getauthtoken
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using System.Net.Http; using System.Web; namespace GetAccessTokenSample { class Program { private static string baseUrl = "https://localhost:44305"; static void Main(string[] args) { Console.WriteLine("Enter Username: "); string username= Console.ReadLine(); Console.WriteLine("Enter Password: "); string password = Console.ReadLine(); LoginTokenResult accessToken = GetLoginToken(username,password); if (accessToken.AccessToken != null) { Console.WriteLine(accessToken); } else { Console.WriteLine("Error Occurred:{0}, {1}", accessToken.Error, accessToken.ErrorDescription); } } private static LoginTokenResult GetLoginToken(string username, string password) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(baseUrl); //TokenRequestViewModel tokenRequest = new TokenRequestViewModel() { //password=userInfo.Password, username=userInfo.UserName}; HttpResponseMessage response = client.PostAsync("Token", new StringContent(string.Format("grant_type=password&username={0}&password={1}", HttpUtility.UrlEncode(username), HttpUtility.UrlEncode(password)), Encoding.UTF8, "application/x-www-form-urlencoded")).Result; string resultJSON = response.Content.ReadAsStringAsync().Result; LoginTokenResult result = JsonConvert.DeserializeObject<LoginTokenResult>(resultJSON); return result; } public class LoginTokenResult { public override string ToString() { return AccessToken; } [JsonProperty(PropertyName = "access_token")] public string AccessToken { get; set; } [JsonProperty(PropertyName = "error")] public string Error { get; set; } [JsonProperty(PropertyName = "error_description")] public string ErrorDescription { get; set; } } } }
Если вы используете RestSharp, вам нужно сделать запрос такой:
public static U PostLogin<U>(string url, Authentication obj) where U : new() { RestClient client = new RestClient(); client.BaseUrl = new Uri(host + url); var request = new RestRequest(Method.POST); string encodedBody = string.Format("grant_type=password&username={0}&password={1}", obj.username,obj.password); request.AddParameter("application/x-www-form-urlencoded", encodedBody, ParameterType.RequestBody); request.AddParameter("Content-Type", "application/x-www-form-urlencoded", ParameterType.HttpHeader); var response = client.Execute<U>(request); return response.Data; }


Comments