Остальные клиенты для Java?
с JSR 311 и его реализациями у нас есть мощный стандарт для предоставления объектов Java через Rest. Однако на стороне клиента, похоже, что - то отсутствует, что сопоставимо с Apache Axis для SOAP-что-то, что скрывает веб-службу и прозрачно маршалирует данные обратно в объекты Java.
Как вы создаете Java RESTful клиентов? Используя HTTPConnection и ручной разбор результата? Или специализированные клиенты, например, Джерси или Apache CXR?
18 ответов:
Это старый вопрос (2008) так что теперь есть гораздо больше вариантов, чем было тогда:
- Apache CXF три параметры клиента REST
- Джерси (упоминалось выше).
- Весна также имеет свой собственный под названием RestTemplate
- Commons HTTP Client создайте свой собственный для более старой Java проекты.
обновлениеоколо 2014:
Async-http-client по Sonatype. Ning Async-http-client.новый ребенок в блоке, который обеспечивает поддержку NIO (хотя, честно говоря, я не думаю, что это действительно улучшает производительность для клиентов, как это делает серверы).
- Apache HTTP Components (4.2) Свободный адаптер - лучше, чем старый Commons HTTP Client 3 и проще в использовании для создания собственного клиента REST. Вам придется использовать что-то вроде Джексон для разбора JSON поддержка и вы можете использовать HTTP components URIBuilder для построения URIs ресурса подобный клиенту остальных Джерси/Джакс-РС. HTTP-компоненты также поддерживают NIO, но я сомневаюсь, что вы получите лучшую производительность, чем BIO, учитывая короткий характер запроса ОСТАЛЬНОЕ.
обновление 2016:
- OkHttp - поддерживает новые протоколы HTTP (SPDY и HTTP2). Работает на Android. К сожалению, он не предлагает истинную асинхронную опцию на основе реакторного цикла (см. компоненты Ning и HTTP выше). Однако если вы используете более новый протокол HTTP2, это меньше проблем (при условии, что количество подключений является проблемой).
- модернизация - автоматически создавать клиенты, основанные на интерфейсных заглушках, похожих на некоторые расширения Jersey и CXF. Использует OkHttp.
- Apache HttpComponents 5 предположительно будет иметь поддержку HTTP2
предостережение о выборе HTTP / REST клиентов. Обязательно проверьте, что ваш стек фреймворка использует для HTTP-клиента, как он выполняет потоковую обработку и в идеале использует тот же клиент, если он его предлагает. То есть если вы используете что-то вроде Верт.x или Play вы можете попробовать использовать свой резервный клиент для участия какую бы шину или контур реактора ни обеспечивал каркас... в противном случае будьте готовы к возможным интересным вопросам резьбы.
Как я уже упоминал в этой теме Я предпочитаю использовать Джерси который реализует JAX-RS и поставляется с хорошим клиентом отдыха. Хорошая вещь заключается в том, что если вы реализуете свои ресурсы RESTful с помощью JAX-RS, то клиент Jersey может повторно использовать поставщиков сущностей, таких как JAXB/XML/JSON/Atom и т. д., Поэтому вы можете повторно использовать те же объекты на стороне сервера, что и на клиентском модульном тесте.
вот единичный тестовый случай от проект Apache Camel который ищет полезные данные XML из ресурса RESTful (используя конечные точки объекта JAXB). Метод ресурса (uri) определяется в этот базовый класс который просто использует API клиента Джерси.например
clientConfig = new DefaultClientConfig(); client = Client.create(clientConfig); resource = client.resource("http://localhost:8080"); // lets get the XML as a String String text = resource("foo").accept("application/xml").get(String.class);кстати, я надеюсь, что будущая версия JAX-RS добавит хороший API на стороне клиента по линиям одного в Джерси
вы можете использовать стандартные API Java SE:
private void updateCustomer(Customer customer) { try { URL url = new URL("http://www.example.com/customers"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setInstanceFollowRedirects(false); connection.setRequestMethod("PUT"); connection.setRequestProperty("Content-Type", "application/xml"); OutputStream os = connection.getOutputStream(); jaxbContext.createMarshaller().marshal(customer, os); os.flush(); connection.getResponseCode(); connection.disconnect(); } catch(Exception e) { throw new RuntimeException(e); } }или вы можете использовать API клиента REST, предоставляемые реализациями JAX-RS, такими как Jersey. Эти API-интерфейсы проще в использовании, но требуют дополнительных банок на пути к классу.
WebResource resource = client.resource("http://www.example.com/customers"); ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); System.out.println(response);дополнительная информация:
вы также можете проверить Restlet который имеет полные возможности на стороне клиента, более ориентированные на REST, чем библиотеки более низкого уровня, такие как HttpURLConnection или Apache HTTP Client (которые мы можем использовать в качестве соединителей).
с наилучшими пожеланиями, Жером Лувель
Если вы хотите только вызвать службу REST и проанализировать ответ, вы можете попробовать Уверены
// Make a GET request to "/lotto" String json = get("/lotto").asString() // Parse the JSON response List<String> winnderIds = with(json).get("lotto.winners.winnerId"); // Make a POST request to "/shopping" String xml = post("/shopping").andReturn().body().asString() // Parse the XML Node category = with(xml).get("shopping.category[0]");
вы могли бы попробовать Рапа. Дайте нам знать ваши отзывы о том же. И не стесняйтесь регистрировать проблемы или ожидаемые функции.
Я хотел бы указать еще 2 варианта:
- Restfulie, основанный на веб-фреймворке VRaptor, имеет как серверные, так и клиентские реализации с очень хорошей поддержкой гипермедиа.
- RESTEasy есть JAX-RS прокси-клиент на основе реализация.
Я недавно пробовал модернизация библиотека от площади, его большой, и вы можете вызвать свой REST API очень легко. Конфигурация на основе аннотаций позволяет нам избавиться от большого количества кодирования котельной плиты.
Я использую Apache HTTPClient для обработки всех HTTP-сторон вещей.
Я пишу синтаксические анализаторы XML SAX для содержимого XML, которое анализирует XML в вашей объектной модели. Я считаю, что Axis2 также предоставляет методы XML -> Model (ось 1 скрыла эту часть, досадно). Генераторы XML тривиально просты.
Это не займет много времени, и вполне эффективная, на мой взгляд.
попробовать
JdkRequestС jcabi-http (Я разработчик). Вот как это работает:String body = new JdkRequest("http://www.google.com") .header("User-Agent", "it's me") .fetch() .body()проверьте это сообщение в блоге для более подробной информации:http://www.yegor256.com/2014/04/11/jcabi-http-intro.html
OkHttp является легким и мощным, когда в сочетании с модифицированной, а также. Это хорошо работает для общего использования Java, а также на Android.
OkHttp: http://square.github.io/okhttp/
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); String post(String url, String json) throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); return response.body().string(); }модернизация: http://square.github.io/retrofit/
public interface GitHubService { @GET("/users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); }
поскольку никто не упомянул, вот еще один: симулировать, которым пользуется Весеннее Облако.
хотя его просто создать HTTP-клиент и сделать reuest. Но если вы хотите использовать некоторые автоматически сгенерированные клиенты, вы можете использовать WADL для описания и генерации кода.
можно использовать RestDescribe чтобы создать и скомпилировать WSDL, вы можете создавать клиенты в php, ruby, python, java и C# с помощью этого. Он генерирует чистый код и есть хорошие изменения, что вы должны настроить его немного после генерации кода, Вы можете найти хорошую документацию и основные мысли за инструментом здесь.
есть несколько интересных и полезных WADL tools указано на wintermute.
Я написал библиотеку, которая сопоставляет интерфейс java с удаленной службой JSON REST:
https://github.com/ggeorgovassilis/spring-rest-invoker
public interface BookService { @RequestMapping("/volumes") QueryResult findBooksByTitle(@RequestParam("q") String q); @RequestMapping("/volumes/{id}") Item findBookById(@PathVariable("id") String id); }
попробуйте посмотреть на http-rest-client
https://github.com/g00dnatur3/http-rest-client
вот простой пример:
RestClient client = RestClient.builder().build(); String geocoderUrl = "http://maps.googleapis.com/maps/api/geocode/json" Map<String, String> params = Maps.newHashMap(); params.put("address", "beverly hills 90210"); params.put("sensor", "false"); JsonNode node = client.get(geocoderUrl, params, JsonNode.class);библиотека заботится о сериализации и привязке json для вас.
вот еще один пример,
RestClient client = RestClient.builder().build(); String url = ... Person person = ... Header header = client.create(url, person); if (header != null) System.out.println("Location header is:" + header.value());и последний пример,
RestClient client = RestClient.builder().build(); String url = ... Person person = client.get(url, null, Person.class); //no queryParamsУра!
примеры клиента отдыха Джерси:
Добавление зависимости:<!-- jersey --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-json</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20090211</version> </dependency>ForGetMethod и передача двух параметров:
Client client = Client.create(); WebResource webResource1 = client .resource("http://localhost:10102/NewsTickerServices/AddGroup/" + userN + "/" + groupName); ClientResponse response1 = webResource1.get(ClientResponse.class); System.out.println("responser is" + response1);GetMethod передает один параметр и получает ответ списка:
Client client = Client.create(); WebResource webResource1 = client .resource("http://localhost:10102/NewsTickerServices/GetAssignedUser/"+grpName); //value changed String response1 = webResource1.type(MediaType.APPLICATION_JSON).get(String.class); List <String > Assignedlist =new ArrayList<String>(); JSONArray jsonArr2 =new JSONArray(response1); for (int i =0;i<jsonArr2.length();i++){ Assignedlist.add(jsonArr2.getString(i)); }выше он возвращает список, который мы принимаем в качестве списка, а затем преобразуем его в массив Json, а затем массив Json в список .
если запрос Post передает объект Json в качестве параметра:
Client client = Client.create(); WebResource webResource = client .resource("http://localhost:10102/NewsTickerServices/CreateJUser"); // value added ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user)); if (response.getStatus() == 500) { context.addMessage(null, new FacesMessage("User already exist ")); }
вы можете использовать java. net. URL
public class URL { public URL(java.lang.String s) throws java.net.MalformedURLException {} public java.net.URLConnection openConnection() throws java.io.IOException {} ... }из URL-адреса можно создать HttpURLConnection, который позволяет вызывать определенные
requests. Here’s an example of doing a simple GET request: URL url = new URL("http://example.com/customers/1"); connection = (HttpURLConnection) getUrl.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/xml"); if (connection.getResponseCode() != 200) { throw new RuntimeExceptioin("Operation failed: " + connection.getResponseCode()); } System.out.println("Content-Type: " + connection.getContentType()); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line = reader.readLine(); while (line != null) { System.out.println(line); line = reader.readLine(); } connection.disconnect();
Comments