2012-02-01 2 views
3

Я пытаюсь перевести завиток команду в 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(); 

Как я могу перевести локон строки, начинающуюся с -НОМ и скручиванием линией, которая начинается с «--data-бинарным»? Что эквивалентно java для -d?

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

Подсказка приветствуется. Спасибо

+1

Runtime.getRuntime(). Exec ("curl -i -X ​​POST ..."); Не смог устоять, извините :) –

ответ

4

Заголовки не совпадают. Команда curl использует X-Parse-Application-Id и X-Parse-REST-API-Key, тогда как код Java использует Example-Application-Id и Example-REST-API-Key. Полагаю, вы хотите, чтобы они соответствовали друг другу. Кроме того, вы устанавливаете их как тело запроса POST вместо HTTP-заголовков. Вместо этого вам нужно использовать один из методов setHeader на httpPost. Я также рекомендовал бы не устанавливать Content-Type таким образом. Тип контента обычно предоставляется как часть отправленного HttpEntity.

Чтобы разместить изображение с использованием HttpClient в Java, вам необходимо использовать FileEntity, который ссылается на путь файла (/Users/thomas/Desktop/greep-small.png в вашем примере). Прямо сейчас вы публикуете значения заголовков как пары значений имени, как я упоминал ранее.

Выполнение curl -d потребует сделать что-то вроде передачи StringEntity в httpPost.setEntity() с использованием значения, которое вы хотите отправить.

Наконец, код Java использует некоторые учетные данные, которые я вообще не вижу в команде curl.

+0

Спасибо за подробный ответ. Я попробую ваши намеки и дам вам знать, если это сработает. –

+2

Спасибо @laz, ты сделал мой день. Я использовал MultipartEntity, но для имитации бинарного поведения -data нам действительно нужно использовать FileEntity. Большое спасибо. –

+0

@laz То же самое здесь FileEntity - это ключ к репликации --data-binary – JeanPijon

Смежные вопросы