将curl调用转换为java urlconnection调用

我有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命令可以在本自述文件中找到。 它用于开始在RabbitMQ上记录日志。 回应并不重要。

现在我创建了这样的东西(我删除了不太重要的行,即捕获exception等),但不幸的是它不起作用:

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

完整的代码

这是最终解决方案:

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

我能看到两个问题:

  • 你没有设置请求方法,在你的curl示例中它是“PUT”
  • ‘-d’数据应该是请求 ,而不是请求参数(即你应该将该字符串写入请求OutputStream)

另外,当你执行userpass.getBytes()你会使用默认的平台字符编码来获取字节。 这可能是也可能不是你想要的编码。 最好使用显式字符编码(可能是服务器所期望的编码)。