如何卷曲-X后转化成Java

问题描述:

我想翻译一个curl命令到Java(使用Apache的HttpClient 4.x版):如何卷曲-X后转化成Java

export APPLICATION_ID=SOME_ID 
export REST_API_KEY=SOME_KEY 

curl -i -X POST \ 
    -H "X-Parse-Application-Id: ${APPLICATION_ID}" \ 
    -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \ 
    -H "Content-Type: image/png" \ 
    --data-binary @/Users/thomas/Desktop/greep-small.png \ 
    https://api.parse.com/1/files/greep.png 

,但我得到了以下错误:{ “错误”: “未经授权”}。

这是我的Java代码如下所示:

DefaultHttpClient httpclient = new DefaultHttpClient(); 
HttpHost targetHost = new HttpHost("localhost", 80, "http"); 
httpclient.getCredentialsProvider().setCredentials(
     new AuthScope(targetHost.getHostName(), targetHost.getPort()), 
     new UsernamePasswordCredentials("username", "password")); 
HttpPost httpPost = new HttpPost("https://api.parse.com/1/files/greep.png"); 

System.out.println("executing request:\n" + httpPost.getRequestLine()); 

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
nameValuePairs.add(new BasicNameValuePair("Example-Application-Id", "SOME_ID")); 
nameValuePairs.add(new BasicNameValuePair("Example-REST-API-Key", "SOME_KEY")); 
nameValuePairs.add(new BasicNameValuePair("Content-Type", "image/png")); 

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 


HttpResponse response = httpclient.execute(httpPost); 
HttpEntity responseEntity = response.getEntity(); 

System.out.println("----------------------------------------"); 
System.out.println(response.getStatusLine()); 
if (responseEntity != null) { 
    System.out.println("Response content length: " 
      + responseEntity.getContentLength()); 
} 
System.out.println(EntityUtils.toString(responseEntity)); 
httpclient.getConnectionManager().shutdown(); 

如何翻译与-H和卷曲行开始卷曲行以“--data二进制”开始?什么是Java相当于-d?

-d '{ "name":"Andrew", "picture": { "name": "greep.png", "__type": "File" } }' \ 

任何提示表示赞赏。谢谢

+1

Runtime.getRuntime()。exec(“curl -i -X POST ...”);无法抗拒,对不起:) – 2012-02-02 00:52:32

标题不匹配。 curl命令使用X-Parse-Application-IdX-Parse-REST-API-Key,而Java代码使用的是Example-Application-IdExample-REST-API-Key。我想你会希望那些匹配。另外,您将它们设置为请求的POST正文,而不是HTTP标头。您需要改用httpPost上的setHeader方法之一。我也建议不要以这种方式明确地设置Content-Type。内容类型通常作为发布的HttpEntity的一部分提供。

要在Java中使用HttpClient发布图像内容,您需要使用引用文件路径(您的示例中为/Users/thomas/Desktop/greep-small.png)的FileEntity。现在,您正在将标题值作为名称值对发布,如前所述。

实施curl -d需要做一些事情,比如将StringEntity传递到httpPost.setEntity()使用您想要发送的值。

最后,Java代码使用了一些凭据,我根本没有在curl命令中看到。

+0

感谢您的详细解答。我会尝试你的提示,并让你知道它是否有效。 – 2012-02-03 14:01:46

+2

谢谢@拉斯,你让我的一天。我使用的是MultipartEntity,但为了模拟--data-binary行为,我们确实需要使用FileEntity。非常感谢。 – 2013-04-17 17:16:07

+0

@laz同样在这里FileEntity是复制的关键--data-binary – JeanPijon 2017-06-05 14:31:19