Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   post a web (https://www.clubdelphi.com/foros/showthread.php?t=96213)

pgranados 15-05-2023 18:00:27

Cita:

Empezado por oscarac (Mensaje 551477)
hola gracias por responder

estuve viendo el tema que me recomendp Netfali

para eso estoy usando el TStream y "cargandolo" en el body

Código Delphi [-]
    RQFile.ClearBody;
    RQFile.AddParameter('archivo',localfile);
    RQFile.AddBody(_file, TRESTContentType.ctTEXT_PLAIN);

en restdeguger no encuentro una forma de subir el txt (es el unico archivo q quiero subir.. no hay xml)

uso addbody porque en el restrequest no hay un body.add

Vete a Tools y luego RestDebugger y en request puedes agregar el body manulamente, luego de agregar todos los params y el body envia el request y ya teniendo exito copia los componentes a tu form y modifica los parametros que siempre cambiaran

oscarac 15-05-2023 18:59:34

eso estoy intentando hacer
pero si te das cuenta
primero debo obtener un token de esta direccion

https://zona-api.aris.com.pe/v1/user/signin

una vez obtenido ese token (no encuentro forma de replicar eso en restdebugger)

necesito subir el archivo...

oscarac 16-05-2023 19:27:22

asi esta configurado en postman.. y funciona

ya estoy a punto de tirar la toalla :(



oscarac 16-05-2023 20:21:23

Cita:

Empezado por oscarac (Mensaje 551502)
asi esta configurado en postman.. y funciona

ya estoy a punto de tirar la toalla :(



https://i.postimg.cc/bvWJV9T1/postman.png

Neftali [Germán.Estévez] 17-05-2023 08:23:38

Cita:

Empezado por oscarac (Mensaje 551483)
una vez obtenido ese token (no encuentro forma de replicar eso en restdebugger)
necesito subir el archivo...


Dentro de los parámetros del RESTDebugger puedes definir uno como BODY. Prueba con ese.





De todas formas, si ves que con es RESTDebugger no lo consigues no pasa nada, ves directamente a los componentes.

¿Al intentar añadir el fichero tal y como hemos comentado antes (usando Stream) qué error te da?

oscarac 17-05-2023 16:15:04

buenos dias
tengo una respuesta del servidoer indicando que el archivo esta vacio
esa respuesta me da, cuando no envio el archivo, porque si lo recibe la respuesta seria otra

mi restdebugger no esta funcionando, aparece un mensaje de error

ahora.. en postman en el body, el parametro llamado "archivo" es de tipo file... hay tipo texto tambien, pero con ese no funciona, debe ser tipo file...... creo que por ahi va la cosa...

esto es lo que tengo

Código Delphi [-]
unit frmMain_f;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  IPPeerClient, Vcl.StdCtrls, REST.Client, Data.Bind.Components,
  Data.Bind.ObjectScope, system.JSON, REST.Authenticator.OAuth, REST.Types;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    RCCredenciales: TRESTClient;
    RQCredenciales: TRESTRequest;
    RRCredenciales: TRESTResponse;
    Label2: TLabel;
    Memo2: TMemo;
    RRFile: TRESTResponse;
    RQFile: TRESTRequest;
    RCFile: TRESTClient;
    oAUTHRQ: TOAuth2Authenticator;
    procedure Button1Click(Sender: TObject);
  private
    function MemoryStreamToString(M: TMemoryStream): string;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  jValue: TJSONValue;  // Respuesta del Request
  JSonValue: TJSonValue;
  Branch: string;
  _file: TMemoryStream;
  localfile: string;
  param: TRESTRequestParameter;
begin
  localfile := 'd:\desarrollo\concesiones\servicial\aris\envios\LURIN-09052023.txt';

  try
    // CLiente
    RCCredenciales.ResetToDefaults;
    RCCredenciales.BaseURL := 'https://zona-api.aris.com.pe/v1/user/signin';
    RCCredenciales.Accept := 'application/json, text/plain; q=0.9, text/html;q=0.8,';
    RCCredenciales.AddParameter('user', 'user');
    RCCredenciales.AddParameter('password', '******************');

    // Request
    RQCredenciales.Method := TRESTRequestMethod.rmPOST;
    RQCredenciales.Execute;

    // Ya se conectó a la web

    jValue := RRCredenciales.JSONValue;
    Branch := jValue.ToString;
    JSonValue := TJSonObject.ParseJSONValue(Branch);

    // Chapo El Token y lo coloco en el Auth2
    oAUTHRQ.AccessToken := JSonValue.GetValue<string>('data.data.tk');
    oAUTHRQ.TokenType := TOAuth2TokenType.ttBEARER;
    Memo1.Text := Branch;

    RCFile.ResetToDefaults;
    RCFile.Params.Clear;
    RCFile.BaseURL := 'https://zona-api.aris.com.pe/v1/concesionario/masivo';
    RCFile.Accept := 'text/plain';
    RCFile.Authenticator := oAUTHRQ;

    //RQFile.ClearBody;
    RQFile.Method := TRESTRequestMethod.rmPOST;

    _file := TMemoryStream.Create();
    _file.LoadFromFile(localfile);
    _file.Position := 0;


    param := RQFile.Params.AddItem;
    RQFile.Params[0].name := 'archivo';
    RQFile.Params[0].value := MemoryStreamToString(_file);
    RQFile.Params[0].kind := pkGETorPOST;
    RQFile.Params[0].ContentType := ctTEXT_PLAIN;
    RQFile.Params[0].Options := [poDoNotEncode];

    RQFile.Execute;
    jValue := RRFile.JSONValue;
    Memo2.Text := jValue.ToString;

  finally

  end;
end;

function TForm1.MemoryStreamToString(M: TMemoryStream): string;
begin
  SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char));
end;

end.

Neftali [Germán.Estévez] 17-05-2023 17:46:54

Tal vez me he perdido algo, pero sigo echando en falta que pruebes a cargar el fichero en el Body.
Con este código:

Código Delphi [-]
    
//RQFile.ClearBody;     
RQFile.Method := TRESTRequestMethod.rmPOST;      
_file := TMemoryStream.Create();     
_file.LoadFromFile(localfile);     
_file.Position := 0;       
param := RQFile.Params.AddItem;     
RQFile.Params[0].name := 'archivo';     
RQFile.Params[0].value := MemoryStreamToString(_file);

Creo que lo estás intentando cargar como parámetro.
Intenta cargarlo en el Body con esto:

Código Delphi [-]
var
  Contenido: TStringStream;
begin
  ...
  //RQFile.ClearBody;  
  RQFile.Method := TRESTRequestMethod.rmPOST;
  // Creamos el stream
  Contenido := TStringStream.Create;
  try
    // Cargamos el cntenido del fichero en el TStream
    Contenido.LoadFromFile('Fichero.xml');   // aquí tu fichero   
    // Añadirlo al Body
    RQFile.Body.Add(Contenido, TRESTContentType.ctTEXT_PLAIN);  
    //  => Prueba a cambiar el segundo porámetro por diferentes tipos según lo que estás enviando

    // ejecutar la peticion
    RQFile.Execute;
    jValue := RRFile.JSONValue;     
    Memo2.Text := jValue.ToString  
  finally
    contenido.Free;
...
  end;

Está claro que si en el PostMan te está funcionando en el Body, aquí debes usar la propiedad Body para enviarlo.
https://docwiki.embarcadero.com/Libr...STRequest.Body

oscarac 17-05-2023 19:05:34

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 551517)
Tal vez me he perdido algo, pero sigo echando en falta que pruebes a cargar el fichero en el Body.
Con este código:

Código Delphi [-]
    
//RQFile.ClearBody;     
RQFile.Method := TRESTRequestMethod.rmPOST;      
_file := TMemoryStream.Create();     
_file.LoadFromFile(localfile);     
_file.Position := 0;       
param := RQFile.Params.AddItem;     
RQFile.Params[0].name := 'archivo';     
RQFile.Params[0].value := MemoryStreamToString(_file);

Creo que lo estás intentando cargar como parámetro.
Intenta cargarlo en el Body con esto:

Código Delphi [-]
var
  Contenido: TStringStream;
begin
  ...
  //RQFile.ClearBody;  
  RQFile.Method := TRESTRequestMethod.rmPOST;
  // Creamos el stream
  Contenido := TStringStream.Create;
  try
    // Cargamos el cntenido del fichero en el TStream
    Contenido.LoadFromFile('Fichero.xml');   // aquí tu fichero   
    // Añadirlo al Body
    RQFile.Body.Add(Contenido, TRESTContentType.ctTEXT_PLAIN);  
    //  => Prueba a cambiar el segundo porámetro por diferentes tipos según lo que estás enviando

    // ejecutar la peticion
    RQFile.Execute;
    jValue := RRFile.JSONValue;     
    Memo2.Text := jValue.ToString  
  finally
    contenido.Free;
...
  end;

Está claro que si en el PostMan te está funcionando en el Body, aquí debes usar la propiedad Body para enviarlo.
https://docwiki.embarcadero.com/Libr...STRequest.Body

E la version Xe7 no tengo el body.add

oscarac 17-05-2023 21:04:14

al final cambié a Indy.... y funcionó

les dejo el codigo por si alguien lo necesita

Código Delphi [-]
unit frmMain_f;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  IdMultipartFormData, IdSSLOpenSSL, IdSSLOpenSSLHeaders, Vcl.StdCtrls,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, system.json;

type
  TForm1 = class(TForm)
    IndCredenciales: TIdHTTP;
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    IndCredencialesSSL: TIdSSLIOHandlerSocketOpenSSL;
    Memo2: TMemo;
    IndFile: TIdHTTP;
    IndFileSSL: TIdSSLIOHandlerSocketOpenSSL;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  //lHTTP: TIdHTTP;
  datosPost: TIdMultiPartFormDataStream;
  URL: string;
  response, tk, localfile: string;
  respuesta: TJSONValue;
  RequestBody: TStream;

begin
 localfile := 'd:\desarrollo\concesiones\servicial\aris\envios\LURIN-09052023.txt';
  try

    //Conexion Endpoint Primario
    URL := 'https://zona-api.aris.com.pe/v1/user/signin';


    datosPost := TIdMultiPartFormDataStream.Create;
    datosPost.AddFormField('user', 'user');
    datosPost.AddFormField('password', '***********');
    response := IndCredenciales.Post(URL, datosPost);
    Memo1.Text := response;
    respuesta := TJSonObject.ParseJSONValue(response);
    tk := respuesta.GetValue<string>('data.data.tk');
    Label1.Caption := tk;
    datosPost.Free;
    // Ya estoy conectado

    // Conexion EndPoint Archivo
    // enviar archivo
    URL := 'https://zona-api.aris.com.pe/v1/concesionario/masivo';
    IndFile.Request.CustomHeaders.FoldLines := False;
    indFile.Request.CustomHeaders.Add('Authorization:Bearer ' + tk);
    datosPost := TIdMultiPartFormDataStream.Create;
    datosPost.AddFile('archivo', localfile, 'multipart/form-data');
    Response := IndFile.Post(URL, datosPost);
    Memo2.Text := response;
    datosPost.Free;

  finally
  end;
end;


end.

Neftali [Germán.Estévez] 18-05-2023 08:25:36

Cita:

Empezado por oscarac (Mensaje 551518)
E la version Xe7 no tengo el body.add

:eek::eek:
Raro que no tenga nada similar para enviar algo en el cuerpo de la petición.

Cita:

Empezado por oscarac (Mensaje 551520)
al final cambié a Indy.... y funcionó
les dejo el codigo por si alguien lo necesita


Gracias.
^\||/^\||/^\||/

oscarac 16-12-2023 05:25:03

Cita:

Empezado por oscarac (Mensaje 551520)
al final cambié a Indy.... y funcionó

les dejo el codigo por si alguien lo necesita

Código Delphi [-]
unit frmMain_f;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  IdMultipartFormData, IdSSLOpenSSL, IdSSLOpenSSLHeaders, Vcl.StdCtrls,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, system.json;

type
  TForm1 = class(TForm)
    IndCredenciales: TIdHTTP;
    Button1: TButton;
    Memo1: TMemo;
    Label1: TLabel;
    IndCredencialesSSL: TIdSSLIOHandlerSocketOpenSSL;
    Memo2: TMemo;
    IndFile: TIdHTTP;
    IndFileSSL: TIdSSLIOHandlerSocketOpenSSL;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  //lHTTP: TIdHTTP;
  datosPost: TIdMultiPartFormDataStream;
  URL: string;
  response, tk, localfile: string;
  respuesta: TJSONValue;
  RequestBody: TStream;

begin
 localfile := 'd:\desarrollo\concesiones\servicial\aris\envios\LURIN-09052023.txt';
  try

    //Conexion Endpoint Primario
    URL := 'https://zona-api.aris.com.pe/v1/user/signin';


    datosPost := TIdMultiPartFormDataStream.Create;
    datosPost.AddFormField('user', 'user');
    datosPost.AddFormField('password', '***********');
    response := IndCredenciales.Post(URL, datosPost);
    Memo1.Text := response;
    respuesta := TJSonObject.ParseJSONValue(response);
    tk := respuesta.GetValue<string>('data.data.tk');
    Label1.Caption := tk;
    datosPost.Free;
    // Ya estoy conectado

    // Conexion EndPoint Archivo
    // enviar archivo
    URL := 'https://zona-api.aris.com.pe/v1/concesionario/masivo';
    IndFile.Request.CustomHeaders.FoldLines := False;
    indFile.Request.CustomHeaders.Add('Authorization:Bearer ' + tk);
    datosPost := TIdMultiPartFormDataStream.Create;
    datosPost.AddFile('archivo', localfile, 'multipart/form-data');
    Response := IndFile.Post(URL, datosPost);
    Memo2.Text := response;
    datosPost.Free;

  finally
  end;
end;


end.

buenas noches....este tema lo hice porque un cliente queria que se suba informacion a su repositorio en la web y me dá curiosidad saber como es que lo hace... (no hablo del subir la información porque eso ya se solucionó), es decir... como prepara su hosting en la dirección https://zona-api.aris.com.pe/v1/concesionario/masivo para procesar la informacion que recibe...

alguien me entendió?

Casimiro Notevi 16-12-2023 12:01:49

Cita:

Empezado por oscarac (Mensaje 553616)
alguien me entendió?

Creo que no :confused:

oscarac 17-12-2023 01:21:30

Cita:

Empezado por Casimiro Notevi (Mensaje 553619)
Creo que no :confused:

jajajaj casimiro...
la idea que tengo es....
subir data a una base de datos en la web, pero hacerlo a traves de un webservice que este validado con un token, para que solo las personas autorizadas puedan subir esa información

Casimiro Notevi 17-12-2023 14:15:10

Es que es una pregunta muy general, dices que "cómo preparar su hosting para procesar la información que recibe".
Depende, ¿qué información? ¿ficheros? ¿datos en base de datos? ...

Neftali [Germán.Estévez] 18-12-2023 15:41:59

No se si te refieres a la parte del WebsService.
Por ejemplo, aquí tienes un WebService explicado paso a paso en PHP:
https://neftali.clubdelphi.com/25-ge...ervice-en-php/

En este caso recibe unos parámetros y con ellos hace una consulta (y devuelve los resultados), pero en lugar de eso puedes recibir un fichero en el cuerpo de la petición y con eso insertarlo en la Base de Datos.

¿Te refieres a eso?

oscarac 19-12-2023 04:43:04

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 553632)
No se si te refieres a la parte del WebsService.
Por ejemplo, aquí tienes un WebService explicado paso a paso en PHP:
https://neftali.clubdelphi.com/25-ge...ervice-en-php/

En este caso recibe unos parámetros y con ellos hace una consulta (y devuelve los resultados), pero en lugar de eso puedes recibir un fichero en el cuerpo de la petición y con eso insertarlo en la Base de Datos.

¿Te refieres a eso?

claro, algo como esto, pero en lugar de leer datos, quiero escribir datos

Neftali [Germán.Estévez] 19-12-2023 10:13:40

Cita:

Empezado por oscarac (Mensaje 553642)
claro, algo como esto, pero en lugar de leer datos, quiero escribir datos


Pues es un código similar al que tienes ahí, pero en lugar de lanzar un SELECT y retornar datos, puedes "montar" y lanzar un INSERT o un UPDATE.


La franja horaria es GMT +2. Ahora son las 04:57:42.

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