Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Delphi para la web (https://www.clubdelphi.com/foros/forumdisplay.php?f=51)
-   -   Error al invocar API REST (https://www.clubdelphi.com/foros/showthread.php?t=95799)

andresenlared 26-08-2022 21:13:32

Error al invocar API REST
 
Saludos.

Estoy conociendo los componentes REST de delphi, y quiero implementar un desarrollo para enviar unos datos a un API REST.

Les comento que quiero hacer inicialmente.

Tengo que obtener un token de un API Rest. En postman cargo los parametros del header y el body, y funciona sin problema,

En delphi, entre a la herramienta RestDebugger y agrego los mismo parametros, indicando cuales para el header y cuales para el body, y no corrio.

En código fuente tengo lo siguiente.

Código Delphi [-]
  RESTClient := TRESTClient.Create(nil);
  RESTRequest := TRESTRequest.Create(nil);
  RESTResponse := TRESTResponse.Create(nil);
  RESTRequest.Client := RESTClient;
  RESTRequest.Response := RESTResponse;
  RESTRequest.Method := TRESTRequestMethod.rmPOST;

  RESTRequest.Params.AddItem('Authorization', 'Bearer ZWQxUExRa2lsOXVRMVVWT1MzbElEb2ZJVm1RYTpHd3AxYjFMZEE0SzVxbGZ4bHNWRVpkRDQ0ZWNh', pkHTTPHEADER, [poDoNotEncode]);
  RESTRequest.Params.AddItem('Content-Type', 'application-x-www-form-urlencoded', pkHTTPHEADER, [poDoNotEncode]);
  RESTRequest.Params.AddItem('grant_type', 'password', pkREQUESTBODY, [poDoNotEncode]);
  RESTRequest.Params.AddItem('username', 'userprestador', pkREQUESTBODY, [poDoNotEncode]);
  RESTRequest.Params.AddItem('password', 'gocUZVNAVN5kToPjPM2f', pkREQUESTBODY, [poDoNotEncode]);

  RESTClient.BaseURL := 'https://papi.colsanitas.com/token';

  RESTRequest.Execute;

  memo1.Lines.Text:= RestResponse.Content;

y se genera el error

{
"error_description": "Missing grant_type parameter value",
"error": "invalid_request"
}

No se si con otros componentes como en Indy se pueda hacer este tipo de parametrización.

Les agradezco su ayuda, ya que tengo muy encima este desarrollo.

Neftali [Germán.Estévez] 05-09-2022 13:08:51

Yo creo que los componentes están funcionando bien.
El problema es con el parámetro según el error. Revisa las opciones a la hora de configurar y enviar el parámetro grant_type.

andresenlared 18-09-2022 04:07:12

Muchas gracias por responder.

Respecto a lo que me indicas, se estan agregando los parametros en el mismo orden en que se hacen en postman, ya he probado varias formas, como creando un json y agregandolo al body como a continuacion.

Código Delphi [-]

  RESTRequest.Params.AddHeader('Authorization', 'Bearer ZWQxUExRa2lsOXVRMVVWT1MzbElEb2ZJVm1RYTpHd3AxYjFMZEE0SzVxbGZ4bHNWRVpkRDQ0ZWNh');
  RESTRequest.Params.AddHeader('Content-Type', 'application/x-www-form-urlencoded');

  RESTRequest.Params.AddBody('{"grant_type":"password"}',ctAPPLICATION_JSON);
  RESTRequest.Params.AddBody('{"username":"userprestador"}',ctAPPLICATION_JSON);
  RESTRequest.Params.AddBody('{"password":"gocUZVNAVN5kToPjPM2f"}',ctAPPLICATION_JSON);

  RESTClient.BaseURL := 'https://papi.colsanitas.com/token';

  RESTRequest.Execute;

otra forma

Código Delphi [-]
  vJSON := TJSONObject.Create;

  vJSON.AddPair('grant_type','password');
  vJSON.AddPair('username','userprestador');
  vJSON.AddPair('password','gocUZVNAVN5kToPjPM2f');

  RESTRequest.Params.AddHeader('Authorization', 'Bearer ZWQxUExRa2lsOXVRMVVWT1MzbElEb2ZJVm1RYTpHd3AxYjFMZEE0SzVxbGZ4bHNWRVpkRDQ0ZWNh');
  RESTRequest.Params.AddHeader('Content-Type', 'application/x-www-form-urlencoded');
  RESTRequest.Params.AddBody(vJSON);

  RESTClient.BaseURL := 'https://papi.colsanitas.com/token';

  RESTRequest.Execute;

El mensaje de error ahora es

{"error_description":"Client Authentication failed.","error":"invalid_client"}

Muchisimas gracias, y espero me puedas ayudar a identificar el problema.


La franja horaria es GMT +2. Ahora son las 23:36:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi