5

私はcurlコマンドを持っています:

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

そして、同じことを行う Java API で HTTP リクエストを作成したいと考えています。この curl コマンドは、このREADMEにあります。RabbitMQ でログの記録を開始するために使用されます。レスポンスは重要ではありません。

今のところ、私はこのようなものを作成しました(重要度の低い行、つまり例外をキャッチするなどを削除しました)が、残念ながら機能しません:

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);

コード全体

4

2 に答える 2

11

これは最終的な解決策です:

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();
    }

  }

}
于 2013-04-02T10:35:14.853 に答える
1

私が見ることができる2つの問題:

  • リクエストメソッドを設定していません.curlの例では「PUT」です
  • 「-d」データは、リクエスト パラメーターではなくリクエストボディである必要があります (つまり、その文字列をリクエスト OutputStream に書き込む必要があります)。

また、userpass.getBytes()そうすると、デフォルトのプラットフォーム文字エンコーディングを使用してバイトを取得しています。これは、希望するエンコーディングである場合とそうでない場合があります。明示的な文字エンコーディング (おそらくサーバーが期待するもの) を使用することをお勧めします。

于 2013-03-28T15:05:17.090 に答える