Visualizzazione dei risultati da 1 a 8 su 8

Discussione: HttpUrlConnection

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5

    HttpUrlConnection

    Ciao a tutti, sono nuova del forum e spero possiate darmi una mano!
    Sto provando a inviare una richiesta HTTP post ad un webscript di alfresco tramite la classe HttpUrlConnection, ma non riesco a leggere i dati inviati nel webscript.

    La funzione con cui effettuo il collegamento è la seguente:

    --------------------------------------------------------------------
    protected String connect (String url , File file, String nomeFile, String ticket){
    System.out.println(url);
    HttpURLConnection connection = null;
    DataOutputStream dos = null;
    BufferedReader rd = null;
    StringBuilder sb = null;
    URL serverAddress = null;

    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;

    //definisco un boundary
    String lineEnd = "\r\n";
    String twoHyphens = "-";
    String boundary = "--1234567";
    try {

    serverAddress = new URL(url);
    //set up out communications stuff
    connection = null; //Set up the initial connection
    connection = (HttpURLConnection)serverAddress.openConnection();


    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Connection", "Keep-Alive");
    //Il Content-Type della form
    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
    connection.connect();
    //Apro lo streaming verso la servlet
    dos = new DataOutputStream( connection.getOutputStream() );

    dos.writeBytes(boundary + lineEnd);
    //I dati
    dos.writeBytes("Content-Disposition: form-data; name=\"nome\"" + lineEnd);
    dos.writeBytes(lineEnd);
    dos.writeBytes(URLEncoder.encode(nomeFile));
    dos.writeBytes(lineEnd);
    dos.writeBytes( boundary + lineEnd);

    dos.writeBytes("Content-Disposition: form-data; name=\"step\"" + lineEnd);
    dos.writeBytes(lineEnd);
    dos.writeBytes(URLEncoder.encode("2"));
    dos.writeBytes(lineEnd);
    dos.writeBytes( boundary+ "--" + lineEnd);


    dos.flush();
    dos.close();

    //A questo punto devo rimanere in attesa della risposta della servlet, perchè altrimenti il file non sarà caricato
    try {

    rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    sb = new StringBuilder();
    String str;

    while (( str = rd.readLine()) != null) {

    System.out.println("Server response is: "+str);
    System.out.println("");
    sb.append(str + '\n');
    }

    rd.close();
    }catch (IOException ioex) {

    System.out.println("From (ServerResponse): "+ioex);

    }



    } catch (MalformedURLException e)
    {
    e.printStackTrace();
    } catch (ProtocolException e)
    {
    e.printStackTrace();
    } catch (IOException e)
    {
    e.printStackTrace();
    }finally
    { //close the connection, set all objects to null
    connection.disconnect();

    rd = null;
    connection = null;
    }

    return sb.toString();
    }

    ----------------------------------------------------------------------------------------

    E con httpsniffer posso vedere la richiesta inviata, eccola:

    ----------------------------------------------------------------------------------------

    POST /alfresco/service/ricerca/uploadDoc?nome=fdhfdghfdgh&descrizione=fxghdhfh&st ep=2&alf_ticket=TICKET_ce123af85720a5a3bd1fe3eaeaf 08aa2b8ac9825 HTTP/1.1
    Connection: Keep-Alive
    Content-Type: multipart/form-data;boundary=--1234567
    Cache-Control: no-cache
    Pragma: no-cache
    User-Agent: Java/1.6.0_12
    Host: localhost:8080
    Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
    Content-Length: 145

    --1234567
    Content-Disposition: form-data; name="nome"

    fdhfdghfdgh
    --1234567
    Content-Disposition: form-data; name="step"

    2
    --1234567--

    ----------------------------------------------------------------------------------------

    Ora, dall'oggetto WebScriptRequest disponibile nella classe alfresco invocata quando viene fatta una richiesta al webscript provo ad accedere al contenuto della richiesta http, ma risulta vuoto:


    Content cont = req.getContent();
    System.out.println("Content: " + cont.getContent());

    non stampa il content.

    Non riesco a venirne a capo, avete qualche consiglio?
    Grazie!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Se devi passare dei semplici (e brevi) parametri in POST, perché scomodarsi per usare il content type multipart/form-data???

    Usa il più semplice application/x-www-form-urlencoded che è quello "tradizionale" in cui il formato dei dati è lo stesso che si usa in GET, ovvero passi i parametri xyz=blabla&abc=bloblo. Solo che in POST li passi nel body (chiaramente nome e valore andrebbero encodati con URLEncoder.encode).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    Uso quello perchè in realtà dovrei inviare un file, non riuscendo nemmeno a leggere i dati procedo a piccoli passi
    Comunque sembra che il problema sia nel boundary...speriamo bene, sto facendo qualche prova!
    Grazie per la risposta

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Litty
    Uso quello perchè in realtà dovrei inviare un file
    Ok ... ovviamente non potevo sapere.

    Originariamente inviato da Litty
    non riuscendo nemmeno a leggere i dati procedo a piccoli passi
    Guardando meglio ciò che si vede della request, c'è una cosa che non va.

    codice:
    Content-Type: multipart/form-data;boundary=--1234567
                                               ^^
    Non ci vogliono i --. I due trattini vanno messi poi ovviamente nel body. Ma non in questo header!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    Originariamente inviato da andbin
    Ok ... ovviamente non potevo sapere.
    Ovvio, ho dimenticato di precisarlo...

    Guardando meglio ciò che si vede della request, c'è una cosa che non va.

    codice:
    Content-Type: multipart/form-data;boundary=--1234567
                                               ^^
    Non ci vogliono i --. I due trattini vanno messi poi ovviamente nel body. Ma non in questo header!
    Si, è questo il problema. Erano scappati i trattini lì

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    Ancora una domanda... qualcuno può farmi qualche esempio su come ricavare lato server il file inviato? Grazie!!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Litty
    qualcuno può farmi qualche esempio su come ricavare lato server il file inviato?
    La questione è solo la seguente: se generare lo stream di dati nel formato corretto (con i boundary, ecc...) per il content type multipart/form-data è tutto sommato abbastanza semplice e lineare, non lo è invece ricevere i dati, "parsarli", analizzare i boundary, estrarre i dati, ecc...

    Per questo motivo, quando si devono gestire lato server in ambiente Java degli "upload" di file, si ricorre tipicamente a delle librerie già fatte che compiono loro tutto il lavoro di analisi e estrazione dei dati.
    Una libreria ad esempio è la FileUpload.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    5
    E' un pò complicata la questione, già uso la libreria di apache dal form alla servlet che a sua volta deve fare la connessione al webscript di Alfresco. In tale webscript non ho la form, ma solo i parametri inviati, o meglio la classe webscriptrequest.

    Praticamente ho una portlet in liferay (un webscript alfresco) da cui uploadare il file; non potendo gestire la cosa con ajax, a causa delle restrizioni cross domain, uso un iframe e ho sostituito la chiamata al webscript con una chiamata a una mia servlet (e qui uso tranquillamente fileUploader) che a sua volta può, tramite la classe HttpUrlconnection connettersi ad alfresco. Il problema è, ora, come ricavare qui il file dalla request. Tra i parametri c'è il par "upload" ma contiene il solo nome del file e questo mi spiazza un pò :master:
    Ora sto provando una via alternativa, usando una servlet di alfresco per l'upload...speriamo vada meglio :-D

    Grazie per la risposta ancora! Scusa se nella spiegazione sono sommaria, sono d corsa!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.