将curl调用转换为javaurlconnection调用
我有一个命令:将curl调用转换为javaurlconnection调用,java,curl,rabbitmq,trace,Java,Curl,Rabbitmq,Trace,我有一个命令: curl -i -u guest:guest -H "content-type:application/json" -XPUT \ http://localhost:15672/api/traces/%2f/my-trace \ -d'{"format":"text","pattern":"#"}' 我想在JavaAPI中创建HTTP请求,它也会做同样的事情。此curl命令可以在中找到。它用于在RabbitMQ上开始记录日志。回应并不重要 目前,我创建了类似的内容(我删除了不太
curl -i -u guest:guest -H "content-type:application/json"
-XPUT \ http://localhost:15672/api/traces/%2f/my-trace \
-d'{"format":"text","pattern":"#"}'
我想在JavaAPI中创建HTTP请求,它也会做同样的事情。此curl命令可以在中找到。它用于在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);
我可以看到两个问题:
- 您没有设置request方法,在您的curl示例中,它是“PUT”
- '-d'数据应该是请求主体,而不是请求参数(即,您应该将该字符串写入请求输出流)
另外,当您执行
userpass.getBytes()
时,您将使用默认的平台字符编码获取字节。这可能是您想要的编码,也可能不是。最好使用显式字符编码(可能是服务器期望的编码)。这是最终的解决方案:
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();
}
}
}
你有什么错误吗?“它不工作”到底是什么意思?这应该会创建日志文件,可以在RabbitMQ管理页面中看到,但它没有创建。我尝试过这样做,但仍然不工作。这里有一个新的代码:@user2219448-通常最容易更新答案或创建新问题。也就是说,您可能应该在设置doOutput之后设置方法。此外,您不应该对正文内容进行url编码。调试类似内容的一种简单方法是使用类似charles proxy的http代理来检查连线上的请求,并查看您的输出与curl输出的区别。感谢您的帮助,使用charles proxy进行调试也很有帮助。干杯(无法给出+1,声誉不足..)