【问题标题】:convert curl call into java urlconnection call将 curl 调用转换为 java urlconnection 调用
【发布时间】:2013-03-19 01:38:42
【问题描述】:

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

ENTIRE CODE

【问题讨论】:

  • 你有什么错误吗? “它不起作用”到底是什么意思?
  • 这应该会创建日志文件,可以在RabbitMQ管理页面看到,但没有创建。

标签: java curl rabbitmq trace


【解决方案1】:

我能看到的两个问题:

  • 您没有设置请求方法,在您的 curl 示例中它是“PUT”
  • “-d”数据应该是请求正文,而不是请求参数(即您应该将该字符串写入请求输出流)

另外,当您执行userpass.getBytes() 时,您将使用默认平台字符编码获取字节。这可能是也可能不是您想要的编码。最好使用明确的字符编码(大概是服务器所期望的)。

【讨论】:

  • 我试着做这件事,但还是不行。这是新代码:pastebin.com/Ziqx3Z68
  • @user2219448 - 通常最容易更新您的答案或创建一个新问题。也就是说,您可能应该在设置 doOutput 之后设置方法。另外,您应该对正文内容进行 url 编码。调试此类问题的一种简单方法是使用 charles 代理之类的 http 代理来检查线路上的请求,并查看您的输出与 curl 输出有何不同。
  • 感谢您的帮助,使用 charles 代理进行调试也很有帮助。干杯。 (不能给 +1,没有足够的声誉..)
【解决方案2】:

这是最终解决方案:

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

  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2022-01-17
    • 2016-08-24
    相关资源
    最近更新 更多