2013-03-28 15 views
5

mam curl polecenie:nawrócony curl zadzwonić do java URLConnection rozmowy

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

I chcę utworzyć żądanie HTTP w Java API, który zrobi to samo. To polecenie curl można znaleźć w tym README. Służy do rozpoczęcia nagrywania logu RabbitMQ. Odpowiedź nie jest ważna.

Na razie stworzyłem coś takiego (mam usunięte mniej ważne linie tj połowu wyjątek), ale niestety to nie działa:

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

Czy masz żadnego błędu? Co dokładnie masz na myśli mówiąc "to nie działa"? – mthmulders

+0

Powinno to stworzyć plik dziennika, który można zobaczyć na stronie zarządzania RabbitMQ, ale nie został utworzony. – user2219448

Odpowiedz

8

Jest to ostateczne rozwiązanie:

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

dwa problemy, które widzę:

  • nie są ustalone metody żądania, w curl przykład jest „put”
  • dane "-d" powinny być żądaniami body, a nie parametrami żądania (tj. powinieneś pisać ten ciąg do żądania OutputStream)

także, gdy robisz userpass.getBytes(), otrzymujesz bajty przy użyciu domyślnego kodowania znaków platformy. może to być kodowanie, którego pragniesz. lepiej używać jawnego kodowania znaków (prawdopodobnie tego, którego spodziewa się serwer).

+0

Próbowałem zrobić to, ale nadal nie działa. Oto nowy kod: http://pastebin.com/Ziqx3Z68 – user2219448

+1

@ user2219448 - zazwyczaj najłatwiej jest zaktualizować odpowiedź lub utworzyć nowe pytanie. powiedziawszy, prawdopodobnie powinieneś ustawić metodę _after_, która ustawiłeś doOutput. Ponadto, _nie_ powinno być url kodującym zawartość treści. łatwym sposobem debugowania czegoś takiego jest użycie serwera proxy http, takiego jak charles proxy, w celu zbadania żądań na drucie i sprawdzenia, jak twoje wyjście różni się od wyjścia curl. – jtahlborn

+0

Dziękuję za pomoc, pomocne okazało się także debugowanie za pomocą serwera proxy charles. Twoje zdrowie. (nie można dać +1, zbyt mało reputacji ..) – user2219448

Powiązane problemy