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:
  1. Utilizzando user e password richiedo un token
  2. Tramite il token che mi viene restituito effettuo un'altra richiesta inviando un file
  3. 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;