PDA

Ver la Versión Completa : Error al invocar API REST


andresenlared
26-08-2022, 21:13:32
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.


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.



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


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.