Клиенты 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();