Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将curl调用转换为javaurlconnection调用_Java_Curl_Rabbitmq_Trace - Fatal编程技术网

将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,声誉不足..)