2012-02-01 19 views
3

にカール-Xポストを変換するために、私は(ApacheのHttpClientを4.xを使用して)は、Javaにcurlコマンドを翻訳しようとしています:どのように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 

が、私は次のエラーを取得:{ "エラー": "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-バイナリ」で始まるカール行で始まるカールラインを翻訳することができますか? -dのJavaに相当するものは何ですか?

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

いずれのヒントもありがとうございます。ありがとう

+1

Runtime.getRuntime()。exec( "curl -i -X POST ...");抵抗することはできません、申し訳ありません:) –

答えて

4

ヘッダーが一致しません。 curlコマンドはX-Parse-Application-IdX-Parse-REST-API-Keyを使用していますが、JavaコードはExample-Application-IdExample-REST-API-Keyを使用しています。私はそれらが一致することを望むと思います。さらに、HTTPヘッダーではなく、要求の本文としてPOSTとして設定しています。代わりにhttpPostsetHeaderメソッドの1つを使用する必要があります。また、このような方法で明示的にContent-Typeを設定しないことをお勧めします。コンテンツタイプは通常、投稿されるHttpEntityの一部として提供されます。

JavaでHttpClientを使用して画像コンテンツを投稿するには、ファイルのパスを参照するFileEntity(例では/Users/thomas/Desktop/greep-small.png)を使用する必要があります。今は、私が前に述べたように、ヘッダー値を名前の値のペアとしてポストしています。

curl -dを実装するには、StringEntityhttpPost.setEntity()に送信する値を渡す必要があります。

最後に、Javaコードでは、curlコマンドでは表示されない資格情報が使用されています。

+0

詳細なお返事ありがとうございます。私はあなたのヒントを試し、それがうまくいくかどうかを知らせます。 –

+2

ありがとう@ laz、あなたは私の一日を作った。私はMultipartEntityを使用していましたが、 - データ - バイナリの動作をシミュレートするためには、FileEntityを使用する必要があります。どうもありがとう。 –

+0

@lazと同じですFileEntityは--data-binaryを複製する鍵です – JeanPijon