2012-02-28 3 views
4

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

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 или любым другим обычным протоколом передачи.

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

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

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

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

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

+0

Вы также можете дать [HttpClient] (http://hc.apache.org/httpclient-3.x/) попробуйте. – RanRag

+0

Спасибо @RanRag - поддерживает ли 'httpclient' все аргументы, которые мне нужны? – IAmYourFaja

ответ

6

Я считаю, что это более или менее эквивалентно с использованием 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 
} 
+0

Ничего себе, спасибо Tomasz (и +1 для примера кода!). Реальный быстро, можете ли вы объяснить мне, как аргументы, которые я перечислил, сопоставляют с вашим кодом (помимо '-u user: password', это довольно понятно). Особенно интересуются '-X',' -f', '--data-binary' и идентификатором' @ absolute'. Еще раз спасибо за отличный ответ! – IAmYourFaja

+1

'-X' означает, что следующий параметр - протокол (' PUT'), '-f' не печатает страницы ошибок, если сервер их возвращает,' --data-binary' отключает автоматические преобразования новой строки, а '@' означает, что данные поступают из файла, а не из командной строки. – mihi

+0

@AdamTannon: * mihi * отлично поработал с объяснением этих параметров, я добавил комментарии к своему образцу кода. –

1

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

+0

Thanks Rick - я нашел статью [this] (http://www.javalobby.org/java/forums/t53333.html) о запуске команд терминала из приложения Java. Если я поеду по этому маршруту, будет выполняться аналогичная реализация, чтобы код этого автора выполнял завиток для меня (при условии, что у меня завиток установлен локально)? Или я здесь вне базы? – IAmYourFaja

+0

Это будет, но если вы делаете это из кода, я бы рекомендовал использовать httpclient, как рекомендовал Tomasz выше. Это будет намного более гибким и менее подверженным ошибкам. –

0

Если вы делаете некоторые быстрые «N» грязного ручное тестирование, обучение завиток путь из-за его вездесущности ,

Но не стоит пытаться интегрировать его в 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 

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

  • Нет связанных вопросов^_^