我正在尝试将curl命令转换为Java(使用Apache HttpClient 4.x):
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
但是我收到以下错误:{“error”:“unauthorized”}。
这就是我的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-binary”开头的卷曲线?什么是等价的-d?
-d '{ "name":"Andrew", "picture": { "name": "greep.png", "__type": "File" } }' \
任何提示都表示赞赏。感谢
答案 0 :(得分:4)
标题不匹配。 curl
命令使用X-Parse-Application-Id
和X-Parse-REST-API-Key
,而Java代码使用Example-Application-Id
和Example-REST-API-Key
。我想你会希望那些匹配。另外,您将它们设置为请求的POST
正文而不是HTTP标头。您需要使用httpPost
上的setHeader
方法之一。我还建议不要以这种方式明确设置Content-Type
。内容类型通常作为发布的HttpEntity
的一部分提供。
要在Java中使用HttpClient发布图像内容,您需要使用引用文件路径的FileEntity
(示例中为/Users/thomas/Desktop/greep-small.png
)。现在,您正在将标题值作为名称值对发布,如前所述。
实施curl -d
需要做一些事情,例如使用您要发送的值将StringEntity
传递给httpPost.setEntity()
。
最后,Java代码正在使用curl
命令中根本没有看到的一些凭据。