2016-04-22 5 views
1

Ich versuche, einen curl Befehl ausführen, die eine Webservice verbraucht ich laufe:Java - Runtime Mit curl Befehl ausführen, indem Proxy blockiert wird

String curl = "curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{\"field1\": \"value1\", \"field2\": \"value2\"}' 'http://localhost:8080/service'"; 
System.out.println(curl); 
try { 
    Runtime runtime = Runtime.getRuntime(); 
    Process process = runtime.exec(curl); 
    process.waitFor(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

Wenn ich die Log-Nachricht von der Sysout kopieren und fügen Sie es auf meinem Terminal ein, es läuft wie erwartet, aber wenn ich den Java-Code ausführe, scheint es, eine HTML-Seite vom Proxy zurückzugeben, der den Service nicht findet.

Muss ich noch etwas hinzufügen, damit Java läuft?

+0

Mögliche Duplikat [? Wie man verwendet cURL in Java] verwendet (http://stackoverflow.com/questions/2586975/how-to -use-curl-in-java) – pczeus

Antwort

1

Das Problem ist, dass Sie nicht die Ausgabe gelesen haben. Ich habe Ihren Code so geändert, dass er funktioniert. Ich bin nicht 100% sicher, weil ich es aus irgendeinem Grund nicht richtig testen kann.

EDIT - Es funktioniert, ich habe nur den falschen Befehl ausgeführt! Dies sollte für Sie arbeiten.

String curl = "curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{\"field1\": \"value1\", \"field2\": \"value2\"}' 'http://localhost:8080/service'"; 
System.out.println(curl); 
try { 
    Runtime runtime = Runtime.getRuntime(); 
    Process process = runtime.exec(curl); 
    process.waitFor(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); //BufferedReader to read the output 
    StringBuilder sb = new StringBuilder(); //What will hold the entire console output 
    String line = ""; //What will hold the text for a line of the output 
    while ((line = reader.readLine()) != null) { //While there is still text to be read, read it 
     sb.append(line + "\n"); //Append the line to the StringBuilder 
    } 
    System.out.println(sb); //Print out the full output 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

EDIT - Neuer Code ProcessBuilder statt Runtime

String curl = "curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{\"field1\": \"value1\", \"field2\": \"value2\"}' 'http://localhost:8080/service'"; 
ProcessBuilder builder = new ProcessBuilder("/bin/bash", "-c", curl); 
builder.redirectErrorStream(true); 
Process p = builder.start(); 
StringBuilder sb = new StringBuilder(); 
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
String line; 
int linenum = 0; 
while (true) { 
    linenum++; 
    line = r.readLine(); 
    if (line == null) { 
     break; 
    } 
    sb.append(line); 
} 
System.out.println(sb); 
+0

Nun dank dir endlich bekomme ich ein Feedback von der Locke, es scheint wegen des Proxy zu versagen, aber wenn ich den Befehl selbst in einem Terminal ausführen, funktioniert es, also Ich verstehe immer noch nicht ganz, was falsch ist. –

+0

Vielleicht benötigt das Java-Programm mehr Berechtigungen? Es ist möglich, dass das Problem sein könnte. Versuchen Sie es mit 'sudo' auszuführen? – Dankrushen

+0

Hmm, ich habe eine Idee, ob das vorherige nicht funktioniert. Versuchen Sie es mit 'String curl ="/bin/bash -c locken -X POST --header 'Content-Type: application/json' --header 'Akzeptieren: application/json' -d '{\ "field1 \": \ "Wert1 \", \ "Feld2 \": \ "Wert2 \"} '' http: // Localhost: 8080/Dienst '";'. Das führt den Befehl mit dem Terminal – Dankrushen