как перевести curl -X post в java - PullRequest
3 голосов
/ 02 февраля 2012

Я пытаюсь перевести команду 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"?Что такое Java-эквивалент для -d?

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

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

1 Ответ

4 голосов
/ 02 февраля 2012

Заголовки не совпадают.Команда 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.

...