2013-03-28 12 views
5

Ho comando ricciolo:convertire arricciatura mettere in java URLConnection chiamata

curl -i -u guest:guest -H "content-type:application/json" 
-XPUT \ http://localhost:15672/api/traces/%2f/my-trace \ 
-d'{"format":"text","pattern":"#"}' 

E io voglio creare richiesta HTTP in Java API che farà la stessa cosa. Questo comando di arricciatura può essere trovato in questo README. Viene utilizzato per avviare la registrazione di RabbitMQ. La risposta non è importante.

Per ora ho creato qualcosa di simile (ho cancellato le linee meno importanti, vale a dire con la cattura di eccezioni, ecc), ma purtroppo non funziona:

url = new URL("http://localhost:15672/api/traces/%2f/my-trace"); 
uc = url.openConnection(); 

uc.setRequestProperty("Content-Type", "application/json"); 
uc.setRequestProperty("format","json"); 
uc.setRequestProperty("pattern","#") 
String userpass = "guest:guest"; 
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes()); 
uc.setRequestProperty ("Authorization", basicAuth); 

ENTIRE CODE

+0

Non si ottiene qualche errore? Cosa intendi esattamente per "non funziona"? – mthmulders

+0

Questo dovrebbe creare un file di registro che può essere visto nella pagina di gestione di RabbitMQ, ma non è stato creato. – user2219448

risposta

8

Questa è la soluzione definitiva:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.Proxy; 
import java.net.InetSocketAddress; 
import java.io.OutputStreamWriter; 

public class Curl { 

    public static void main(String[] args) { 

    try { 

    String url = "http://127.0.0.1:15672/api/traces/%2f/trololo"; 

    URL obj = new URL(url); 
    HttpURLConnection conn = (HttpURLConnection) obj.openConnection(); 

    conn.setRequestProperty("Content-Type", "application/json"); 
    conn.setDoOutput(true); 

    conn.setRequestMethod("PUT"); 

    String userpass = "user" + ":" + "pass"; 
    String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes("UTF-8")); 
    conn.setRequestProperty ("Authorization", basicAuth); 

    String data = "{\"format\":\"json\",\"pattern\":\"#\"}"; 
    OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); 
    out.write(data); 
    out.close(); 

    new InputStreamReader(conn.getInputStream()); 

    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

    } 

} 
1

due problemi che posso vedere:

  • non stai settando il metodo di richiesta, nel tuo esempio ricciolo si tratta di "put"
  • i dati "-d" dovrebbero essere la richiesta corpo, non i parametri di richiesta (es. dovresti scrivere quella stringa alla richiesta OutputStream)

Inoltre, quando fai userpass.getBytes() stai ricevendo i byte usando la codifica di caratteri di piattaforma predefinita. questo può o non può essere la codifica che desideri. meglio usare una codifica esplicita dei caratteri (presumibilmente quella che il server si aspetta).

+0

Ho provato a fare queste cose, ma ancora non funziona. Ecco il nuovo codice: http://pastebin.com/Ziqx3Z68 – user2219448

+1

@ user2219448 - in genere è più semplice aggiornare la tua risposta o creare una nuova domanda. Detto questo, dovresti probabilmente impostare il metodo _after_ hai impostato doOutput. inoltre, dovresti _non_ essere url che codifica il contenuto del corpo. un modo semplice per eseguire il debug di questo tipo è utilizzare un proxy http come il proxy charles per esaminare le richieste sul filo e vedere come l'output differisce dall'output dell'arricciatura. – jtahlborn

+0

Grazie per il tuo aiuto, anche il debug con il proxy di charles è stato utile. Saluti. (non posso dare +1, non abbastanza reputazione ..) – user2219448

Problemi correlati