Клиенты REST для Java?
С JSR 311 и его реализациями у нас есть мощный стандарт для представления объектов Java через REST. Однако на стороне клиента, похоже, чего-то не хватает, что сравнимо с Apache Axis для SOAP - что-то, что скрывает веб-сервис и прозрачно направляет данные обратно в объекты Java.
Как вы создаете Java RESTful клиенты? Используя HTTPConnection и ручной анализ результата? Или специализированные клиенты, например, для Джерси или Apache CXR?
Ответы
Ответ 1
Это старый вопрос (2008), поэтому теперь есть много вариантов, чем было:
UPDATE около 2014:
Новый парень на блоке, который поддерживает NIO (хотя, честно говоря, я не думаю, что это действительно повышает производительность для клиентов, таких как серверы).
ОБНОВЛЕНИЕ 2016:
- OkHttp. Поддерживает новые протоколы HTTP (SPDY и HTTP2). Работает на Android. К сожалению, он не предлагает настоящий асинхронный вариант на основе реактора (см. Выше компоненты Ning и HTTP). Однако, если вы используете новый протокол HTTP2, это не проблема (предполагая, что количество подключений является проблемой).
- Retrofit. Будет автоматически создавать клиенты на основе заглушек интерфейса, подобных некоторым расширениям на Джерси и CXF. Использует OkHttp.
- Apache HttpComponents 5 предположительно получит поддержку HTTP2
Предостережение при выборе клиентов HTTP/REST. Обязательно проверьте, что использует ваш стек фреймворка для HTTP-клиента, как он работает с потоками и в идеале использует одного и того же клиента, если он его предлагает. То есть, если вы используете что-то вроде Vert.x или Play, вы можете попытаться использовать его клиентскую поддержку для участия в любом цикле шины или реактора, который предоставляет инфраструктура... иначе будьте готовы к возможно интересным проблемам с потоками.
Ответ 2
Как я упоминал в этой теме, я обычно использую Jersey который реализует JAX-RS и поставляется с приятным клиентом REST. Самое приятное, если вы реализуете свои ресурсы RESTful с помощью JAX-RS, тогда клиент Джерси может повторно использовать поставщиков сущностей, таких как JAXB/XML/JSON/Atom, и так далее - чтобы вы могли повторно использовать те же объекты на стороне сервера, что и вы использовать на стороне клиента unit test.
Например вот случай unit test из Apache Camel, который ищет XML-ресурсы из ресурса RESTful (используя конечные точки объекта JAXB). Метод ресурса (uri) определяется в этот базовый класс, который просто использует API-интерфейс клиента Jersey.
например.
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);
BTW Надеюсь, что будущая версия JAX-RS добавит хороший API-интерфейс для клиентов в соответствии с тем, что в Джерси
Ответ 3
Вы можете использовать стандартные 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);
Для получения дополнительной информации см.
Ответ 4
Если вы хотите только вызвать службу 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]");
Ответ 5
Вы также можете проверить Restlet, который обладает всеми возможностями на стороне клиента, более REST ориентирован на такие низкоуровневые библиотеки, как HttpURLConnection или Apache HTTP Client (который мы можем использовать в качестве соединителей).
С уважением,
Джером Лувел
Ответ 6
Вы можете попробовать Rapa. Сообщите нам свои отзывы о том же.
И не стесняйтесь регистрировать проблемы или ожидаемые функции.
Ответ 7
Недавно я попробовал Retrofit Библиотека с квадрата, ее отличная возможность, и вы можете легко называть свой API для отдыха.
Конфигурация на основе аннотаций позволяет нам избавиться от множества кодовых табличек.
Ответ 8
Я хотел бы указать еще на два варианта:
Ответ 9
Я использую HTTP-клиент Apache для обработки всей HTTP-информации.
Я пишу синтаксические анализаторы XML SAX для содержимого XML, которое анализирует XML в вашей объектной модели. Я считаю, что Axis2 также предоставляет методы XML → Model (Axis 1 скрывает эту часть, досадно). Генераторы XML тривиально просты.
Это не займет много времени, чтобы код, и, на мой взгляд, довольно эффективен.
Ответ 10
OkHttp легкий и мощный в сочетании с Retrofit. Это хорошо работает для общего использования 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);
}
Ответ 11
Попробуйте JdkRequest
из jcabi-http (я разработчик). Вот как это работает:
String body = new JdkRequest("http://www.google.com")
.header("User-Agent", "it me")
.fetch()
.body()
Отметьте эту запись в блоге для более подробной информации: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html
Ответ 12
Поскольку никто не упомянул, вот еще один: Feign, который используется Spring Cloud.
Ответ 13
Некоторое время я использовал Resty:
JSONResource jsonResource = new Resty().json(uri);
Здесь можно найти несколько примеров .
Ответ 14
Хотя его просто создать HTTP-клиент и сделать повтор. Но если вы хотите использовать некоторые автоматически сгенерированные клиенты, вы можете использовать WADL для описания и генерации кода.
Вы можете использовать RestDescribe для создания и компиляции WSDL, вы можете создавать клиенты в php, ruby, python, java и С#, используя это, Он генерирует чистый код, и есть хорошие изменения, которые вам нужно немного подкорректировать после генерации кода, вы можете найти хорошую документацию и основные мысли за инструментом здесь.
Есть несколько интересных и полезных инструментов WADL, упомянутых на зимнем отдыхе.
Ответ 15
Я написал библиотеку, которая отображает 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);
}
Ответ 16
Попробуйте найти 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
Ура!
Ответ 17
Примеры джерси Клиент отдыха:
Добавление зависимости:
<!-- 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 Array, а затем Json Array в List.
Если Post Request передает объект 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 "));
}
Ответ 18
Вы можете использовать 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();