Нажав на веб-сервис Java: curl или URLConnection - PullRequest
4 голосов
/ 28 февраля 2012

Я использую сервер Java, который предоставляет RESTful API по следующему URL:

http://localhost:8080/my-server/

Документы рекомендуют использовать curl для отправки простых PUT запросов (выгрузка файлов) и настоятельно рекомендуют пользователям использовать те же аргументы, что и в примерах. Все примеры выглядят так:

curl -X PUT -f -u admin:password --data-binary @/absolute/path/file/to/upload/file.ext "http://localhost:8080/my-server/file.ext"

Этот сервер не будет работать с FTP или любым другим обычным протоколом передачи.

Я нашел этот вопрос о SO, где ответчик рекомендовал использовать java.net.URL и его спутника java.net.URLConnection вместо попытки работать с curl / libcurl.

Я никогда прежде не запускал команду curl, поэтому я спрашиваю любого, кто знает и curl, и Java, можно ли использовать URL / URLConnection (или любую другую инфраструктуру Java) вместо curl для моей конкретной проблемы. Если нет, то мне придется написать компонент, который выполняет команды из локальной командной строки / терминала, а затем выполнить вышеупомянутую команду curl внутри этого компонента, и это просто кажется уродливым / неприятным.

Если я могу выполнить то же самое в сетевом API Java, я бы предпочел сделать это таким образом.

И, если это можно сделать на Java, как бы я использовал URL / URLConnection, чтобы установить точные те же аргументы команды, что и в приведенном мной примере? В частности:

  • -X
  • PUT
  • -f
  • -u admin:password
  • --data-binary
  • -@absolute/path/...

Заранее благодарим вас за понимание или толчок в правильном направлении!

Ответы [ 3 ]

6 голосов
/ 28 февраля 2012

Я считаю, что это более или менее эквивалентно с использованием Java и :

try {
    Credentials credentials = new UsernamePasswordCredentials("admin", "password");  //-u admin:password
    DefaultHttpClient httpClient = new DefaultHttpClient();
    httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, credentials);
    HttpPut put = new HttpPut("http://localhost:8080/my-server/file.ext");  //-X PUT
    put.setEntity(new FileEntity(new File("/absolute/path/file/to/upload/file.ext"), "image/png"));  //@ - absolute path
    httpClient.execute(put);
} catch(Exception e) {
    //-f, fail silently
}
1 голос
/ 28 февраля 2012

curl - это утилита командной строки unix, в которую нужно просто передать параметры. Использование java.net или apache httpclient потребует от вас написания кода, который использует эти пакеты для связи с вашей службой отдыха. Это не сложно, и вы, безусловно, можете выполнить требования вашего сервиса, но это не так просто, как просто использовать curl.

0 голосов
/ 28 февраля 2012

Если вы выполняете какое-то быстрое и грязное ручное тестирование, изучение curl - это путь из-за его повсеместного распространения.

Но не стоит пытаться интегрировать его в Java (вызывая другиепроцессы из Java чреваты подводными камнями, см. здесь http://kylecartmell.com/?p=9), поэтому, если ваше соединение является частью интеграционного теста или чего-то другого, использование простой Java намного чище и мобильнее, а также легче отлаживать то, что происходит в случае сбоя.

man curl - ваш друг, который выяснил эти варианты, но для начала:

HttpURLConnection bla = (HttpURLConnection) new URL("http://localhost:8080/my-server/").openConnection();
bla.setRequestMethod("PUT");
bla.connect();  
// Now read the inputstream / write the outputstream 
// per the linked answer in the original question 
...