调用Web API时,C#不受支持的授权types
我想从交stream#WPF桌面应用程序执行一个post到我的WebAPI。
不pipe我做什么,我都会得到
{ “错误”: “unsupported_grant_type”}
这是我所尝试过的(我试过了我能find的所有东西):
另外开发web api目前活跃testing: 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");
之后,失败了,我做了一些Googlesearch,并尝试:
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成功拨打电话。
更新提琴手结果
有人可以帮我做一个成功的电话上面的networkingapi …请让我知道,如果我可以帮助澄清。 谢谢!!
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。
这种问题也在这里讨论。
下面是一个工作示例,我用这个请求使用SSL在端口43305上运行本地Web API应用程序。 我也把项目放在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; } } } }
1)注意URL:“localhost:55828 / token”(不是“localhost:55828 / API / token”)
2)logging请求数据。 它不是JSON格式,它只是简单的数据没有双引号。 “userName=xxx@gmail.com&password=Test123$&grant_type=password”
3)记下内容types。 内容types:'application / x-www-form-urlencoded'(不是Content-Type:'application / json')
4)当你使用JavaScript来发表请求,你可以使用以下内容:
$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) {//...
查看邮差下面的截图:
如果你使用的是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; }