Buongiorno a tutta la comunità.
La mia necessità è quella di inviare un file che dovrebbe essere elaborato e quindi scaricare il risultato di questa elaborazione. Tutto questo è previsto e funzionante infatti la procedura è già utilizzata tramite codice java.
Io però devo farlo in Delphi e per questo utilizzo il componente IdHTTP insieme a IdSSL.
Mi è stato passato il codice Java e ho provato a tradurlo in Delphi, la sequenza operativa dovrebbe essere la seguente:
- Utilizzando user e password richiedo un token
- Tramite il token che mi viene restituito effettuo un'altra richiesta inviando un file
- La risposta dovrebbe contenere un altro file che viene generato tramite una elaborazione eseguita in remoto
Ora il punto 1 (la richiesta del token) funziona e anche il punto 2 sembrerebbe funzionare, ma il punto 3 non mi restituisce nulla: forse sbaglio ad inviare il file? Forse non arriva nulla? Sicuramente sbaglio qualcosa e vorrei sottoporvi la porzione di codice Java che funziona ed il codice Delphi che ho scritto.
La funzione Login, che richiede il token credo che funzioni, quella che non va è la procedura InviaRiceviFile.
Vi sarò grato se potrete (e vorrete) darmi qualche suggerimento, qualche spunto, qualunque cosa mi aiuti a superare questo blocco.
Grazie a tutti.
Codice Java:
codice:
public class testAuthFunction{
private static final String functionUri = <indirizzo del portale che riceve ed invia i file>;
private static final String tokenUri = <indirizzo del portale che riceve credenziali e genera il token>;
private static final String tokenToAskForAToken = <b64 di username:password>;
private static final String bdapFilePath = "F:\\BDAP_C_2020.zip"; //file di input
private static final String bdapZipFilePath = "F:\\tmp\\XBRL_BDAP_C_2020.zip"; //file di output
public static void main( String[] args ) throws Exception {
try{
//prova di chiamata
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost uploadFile = new HttpPost(functionUri);
uploadFile.addHeader("Authorization", authExplicit());
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// Attacco il file al post
File f = new File(bdapFilePath);
builder.addBinaryBody(
"file",
new FileInputStream(f),
ContentType.APPLICATION_OCTET_STREAM,
f.getName()
);
HttpEntity multipart = builder.build();
uploadFile.setEntity(multipart);
//spedisco la richiesta
CloseableHttpResponse response = httpClient.execute(uploadFile);
HttpEntity responseEntity = response.getEntity();
File zip = new File(bdapZipFilePath);
OutputStream responseOutputStream = new FileOutputStream(zip);
responseEntity.writeTo(responseOutputStream);
responseOutputStream.close();
//fine prova di chiamata
}catch (IOException ieo){
ieo.printStackTrace();
}
}
static String authExplicit() throws IOException {
String token = null;
try{
//prova di chiamata
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost askToken = new HttpPost(tokenUri);
//aggiungiamo tutti gli header di Ivan
askToken.addHeader("Authorization", "Basic " + tokenToAskForAToken);
askToken.addHeader("Content-Type", "application/x-www-form-urlencoded");
//askToken.addHeader("Content-Length", "29");
HttpEntity body = new StringEntity("grant_type=client_credentials");
askToken.setEntity(body);
//spedisco la richiesta
CloseableHttpResponse response = httpClient.execute(askToken);
HttpEntity responseEntity = response.getEntity();
//stampo la risposta
System.out.println("HEADER");
for (Header mioheader : response.getAllHeaders()) {
System.out.println(mioheader.toString());
}
System.out.println("CONTENT");
token = IOUtils.toString(responseEntity.getContent(),"UTF-8");
System.out.println(token);
//tiro fuori cosi il token, dovrei prendermi il campo access token
token = token.substring(17, token.indexOf("\",\"expires_in\""));
System.out.println(token);
}catch (IOException ieo){
ieo.printStackTrace();
}
return "bearer " + token ;
}
}
Codice Delphi:
codice:
function Login: string;
const
tokenUri = <https del portale che riceve credenziali e genera il token>;
tokenToAskForAToken = 'dGVzdEJkYXA6b3dtR0N3aU15cmhWb0VScG55azNEOHIyOHhGNGc3cG4=';
var
Params: TStringList;
Token: string;
begin
Result := '';
IdHttp1.Request.CustomHeaders.AddValue('Authorization', 'Basic ' + tokenToAskForAToken);
IdHttp1.Request.CustomHeaders.AddValue('Content-Type', 'application/x-www-form-urlencoded');
Params := TStringList.Create;
try
try
Params.Add('grant_type=client_credentials');
Token := IdHTTP1.Post(tokenUri, Params);
Memo1.Lines.Add(Token);
Result := 'bearer ' + Token
except
on E:Exception do
Memo2.Lines.Add(E.Classname + ': ' + E.Message);
end;
finally
Params.Free;
end;
end;
procedure InviaRiceviFile;
const
functionUri = <https del portale che riceve ed invia i file>;
bdapFilePath = 'c:\temp\BDAP_P_2022.zip'; //file di input
bdapZipFilePath = 'c:\temp\XBRL_BDAP_P_2022.txt'; //file di output
var
Params: TIdMultiPartFormDataStream;
Response: TMemoryStream;
begin
idhttp2.Request.BasicAuthentication := True;
IdHttp2.Request.CustomHeaders.Values['Authorization'] := Login;
Params := TIdMultiPartFormDataStream.Create;
Response := TMemoryStream.Create;
try
try
Params.AddFormField('file', bdapFilePath, 'application/octet-stream');
IdHttp2.Post(functionUri, Params, Response);
Response.SaveToFile(bdapZipFilePath);
except
on E:Exception do
Memo2.Lines.Add(E.Classname + ': ' + E.Message);
end;
finally
Params.Free;
Response.Free;
end;