C# tipo de subvención no compatible al llamar a la api web


Estoy tratando de realizar una publicación en mi WebAPI desde una aplicación de escritorio WPF de c#.

No importa lo que haga, consigo

{"error":"unsupported_grant_type"}

Esto es lo que he intentado (y he intentado todo lo que pude encontrar):

También dev web api actualmente activa para pruebas: http://studiodev.biz /

Objeto de cliente http base:

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("*/*"));

Con los siguientes métodos de envío:

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");

Después de que eso fallara, hice algunas búsquedas en Google y intentado:

LoginModel data = new LoginModel(username, password);
string json = JsonConvert.SerializeObject(data);
await client.PostAsync("token", new JsonContent(json));

El mismo resultado, así que intenté:

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(); }));
});

Nota: Puedo realizar una llamada con éxito con Chrome.

Actualizar el resultado del violinista

introduzca la descripción de la imagen aquí

Podría alguien por favor ayudarme a hacer una llamada exitosa a la api web anterior... Por favor, hágamelo saber si puedo ayudar a aclarar. ¡Gracias!!

Author: OverMars, 2015-03-25

4 answers

La implementación predeterminada de OAuthAuthorizationServerHandler solo acepta la codificación de forma (es decir, application/x-www-form-urlencoded) y no la codificación JSON (application/JSON).

Su solicitud ContentType debe ser application/x-www-form-urlencoded y pasar los datos en el cuerpo como:

grant_type=password&username=Alice&password=password123

Es decir, no en formato JSON.

El ejemplo de chrome anterior funciona porque no está pasando datos como JSON. Solo necesita esto para obtener un token; para otros métodos de su API puede usar JSON.

Este tipo de problema también se discute aquí.

 118
Author: M. Ali Iftikhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:33

1) Tenga en cuenta la URL: "localhost: 55828 / token "(no"localhost:55828/API/token")

2) Tenga en cuenta los datos de la solicitud. No está en formato json, solo son datos simples sin comillas dobles. "[email protected]&password=Test123 password & grant_type=password"

3) Tenga en cuenta el tipo de contenido. Content-Type:' application/x-www-form-urlencoded '(no Content-Type:'application/json')

4) Cuando use javascript para hacer una solicitud post, puede usar lo siguiente:

$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) {//...

Ver capturas de pantalla a continuación de Cartero:

Solicitud de Cartero

Encabezado de Solicitud Postman

 12
Author: Chirag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-02 16:47:21

Aquí hay un ejemplo de trabajo que utilicé para hacer esta solicitud de mi aplicación Web API local que se ejecuta en el puerto 43305 utilizando SSL. Puse el proyecto en GitHub también. 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; }

    }

  }
}
 10
Author: Casey Gregoire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-30 19:27:45

Si está utilizando RestSharp, debe hacer la solicitud de la siguiente manera:

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;

        }
 4
Author: Juan Munhoes Junior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 01:21:51