4

我正在使用在以下 URL 上公开 RESTful API 的 Java 服务器:

http://localhost:8080/my-server/

文档推荐curl用于提交简单PUT请求(文件上传),并强烈建议用户使用与示例中提供的完全相同的参数。所有示例如下所示:

curl -X PUT -f -u admin:password --data-binary @/absolute/path/file/to/upload/file.ext "http://localhost:8080/my-server/file.ext"

此服务器不能与 FTP 或任何其他正常传输协议一起使用。

我在 SO 上找到了这个问题,其中回答者建议使用java.net.URL及其伴侣java.net.URLConnection,而不是尝试使用 curl/libcurl。

我以前从来没有运行过curl命令,所以我问任何知道 curl 和 Java 的人是否可以使用 URL/URLConnection(或任何其他 Java 框架)而不是 curl 来解决我的具体问题。如果没有,那么我将不得不编写一个从本地命令行/终端执行命令的curl组件,然后在该组件内执行上述命令,这感觉很丑/讨厌。

如果我可以在 Java 网络 API 中完成同样的事情,我更愿意这样做。

而且,如果它可以在 Java 中完成,我将如何使用 URL/URLConnection 来设置与我提供的示例完全相同的命令参数具体来说:

  • -X
  • PUT
  • -f
  • -u admin:password
  • --data-binary
  • -@absolute/path/...

在此先感谢您的任何见解或朝着正确的方向轻推!

4

3 回答 3

6

我相信这或多或少等同于使用 Java 和

try {
    Credentials credentials = new UsernamePasswordCredentials("admin", "password");  //-u admin:password
    DefaultHttpClient httpClient = new DefaultHttpClient();
    httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials);
    HttpPut put = new HttpPut("http://localhost:8080/my-server/file.ext");  //-X PUT
    put.setEntity(new FileEntity(new File("/absolute/path/file/to/upload/file.ext"), "image/png"));  //@ - absolute path
    httpClient.execute(put);
} catch(Exception e) {
    //-f, fail silently
}
于 2012-02-28T18:12:02.980 回答
1

curl 是一个命令行 unix 实用程序,您只需将选项传递给它。使用 java.net 或 apache httpclient 将需要您编写使用这些包与您的休息服务对话的代码。做起来不难,你当然可以满足你的服务要求,但并不像使用 curl 那样简单。

于 2012-02-28T18:02:02.187 回答
0

如果您正在做一些快速的“n”脏手动测试,那么学习 curl 是必经之路,因为它无处不在。

但是尝试将其集成到 Java 中是不值得的(从 Java 调用其他进程充满了陷阱;请参见此处http://kylecartmell.com/?p=9)所以如果您的连接是集成测试的一部分或一些东西,使用纯 Java 更干净,更便携。当事情失败时,也更容易调试正在发生的事情。

man curl是您找出这些选项的朋友,但要让您开始:

HttpURLConnection bla = (HttpURLConnection) new URL("http://localhost:8080/my-server/").openConnection();
bla.setRequestMethod("PUT");
bla.connect();  
// Now read the inputstream / write the outputstream 
// per the linked answer in the original question 
于 2012-02-28T18:12:46.650 回答