Clientes de descanso para Java?

Com a JSR 311 e as implementações, temos um padrão poderoso para expor objetos Java via repouso. No entanto, do lado do cliente parece haver algo faltando que é comparável ao Apache Axis para SOAP-algo que esconde o serviço web e marshals os dados transparentemente de volta aos objetos Java.

Como criar clientes descansados Java? Usando HTTPConnection e análise manual do resultado? Ou clientes especializados para, por exemplo, Jersey ou Apache CXR?

Author: ndmeiri, 2008-10-21

18 answers

Esta é uma pergunta antiga (2008) por isso há muitas mais opções Agora do que havia na época:

actualizar circa 2014:

O miúdo novo no bloco que fornece suporte ao NIO (embora sinceramente eu não ache que isto realmente melhore o desempenho dos clientes como faz com os servidores).

  • componentes de HTTP Apache (4. 2) adaptador fluente - Melhor do que o antigo cliente HTTP 3 do Commons e mais fácil de usar para construir o seu próprio cliente de descanso. Vais ter de usar algo como O Jackson para o suporte do JSON parsing e você pode usar o URIBuilder de componentes HTTP para construir URIs de recursos semelhante ao cliente de descanso de Jersey/JAX-RS. Componentes HTTP também suporta NIO, mas eu duvido que você vai obter um melhor desempenho do que BIO dada a curta natureza de pedido de descanso.

Actualizar 2016:

  • OkHttp - suporta protocolos HTTP mais recentes (SPDY e HTTP2). Funciona com o Android. Infelizmente não oferece um verdadeiro opção async baseada no ciclo do reactor (ver os componentes Ning e HTTP acima). No entanto, se você usar o protocolo HTTP2 mais recente isto é menos um problema (assumindo que a contagem de conexão é problema).
  • Retrofit - irá criar automaticamente clientes com base em interfaces semelhantes a algumas extensões Jersey e CXF. Usa O Ohttp.
  • Apache HttpComponents 5 terá supostamente suporte de HTTP2
Um aviso para escolher clientes HTTP/REST. Certifique-se de verificar qual o seu framework stack está usando para um cliente HTTP, como ele faz threading, e idealmente usar o mesmo cliente se ele oferece um. Isto se usares algo como o Vert.x ou Play você pode querer tentar usar o seu cliente de suporte para participar em qualquer circuito de ônibus ou reator que o framework fornece... caso contrário, estar preparado para questões de tópicos possivelmente interessantes.
 162
Author: Adam Gent, 2016-01-24 14:22:21
Como mencionei em Este tópico tenho tendência a usar Jersey que implementa o JAX-R e vem com um bom cliente de descanso. O bom é se você implementar seus recursos RESTful usando JAX-RS, em seguida, o Jersey cliente pode reutilizar a entidade fornecedores, tais como para JAXB/XML/JSON/Atom e assim por diante -, então você pode reutilizar os mesmos objetos no lado do servidor, como você usa no lado do cliente de teste de unidade.

Por exemplo Aqui está um caso de teste unitário do camelo Apache projecto que procura as cargas de XML a partir de um recurso repousante (usando os objectivos do objecto JAXB). O método resource (uri) é definido em Esta classe base que apenas usa a API do cliente de Jersey.

Por exemplo

    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);        

Espero que a futura versão do JAX-R adicione uma boa API ao lado do cliente, tal como a de Jersey

 70
Author: James Strachan, 2017-05-23 12:26:35

Pode usar o Java SE APIs padrão:

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); 
    } 
} 
Ou podes usar as APIs dos outros clientes fornecidas por implementações do JAX-R, Como Jersey. Estas APIs são mais fáceis de usar, mas requerem frascos adicionais no seu caminho de classe.
WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

Para mais informações, ver:

 59
Author: Blaise Doughan, 2010-11-26 21:39:13

Se apenas deseja invocar um serviço de repouso e analisar a resposta, pode experimentar Tenha a certeza

// 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]");
 9
Author: Johan, 2016-01-02 02:44:14

Podes tentarRapa . Deixe-nos saber o seu feedback sobre o mesmo. E sinta-se livre para registrar problemas ou características esperadas.

 7
Author: Jasper, 2011-11-21 09:21:41

Gostaria de apontar mais duas opções:

 6
Author: Ophir Radnitz, 2011-12-25 07:48:56

Eu tentei recentementeRetrofit Biblioteca da praça, é grande e você pode chamar a sua API de descanso muito facilmente. A configuração baseada na anotação permite-nos livrar-nos de muitos códigos de placa da caldeira.

 6
Author: Yasitha Chinthaka, 2014-06-07 09:09:57

USO o Apache HTTPClient para lidar com todo o lado HTTP das coisas.

Escrevo os analisadores de SAX XML para o conteúdo XML que processa o XML no seu modelo de objecto. Acredito que o Axis2 também expõe métodos de modelo XML - > (o eixo 1 escondeu esta parte, irritantemente). Geradores de XML são trivialmente simples.

Não demora muito a codificar, e é bastante eficiente, na minha opinião.

 5
Author: JeeBee, 2008-10-21 11:04:15

Tente JdkRequest de jcabi-http (sou um programador). É assim que funciona:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

Verifique este post para mais detalhes: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

 4
Author: yegor256, 2014-04-11 18:53:15

O OkHttp é leve e poderoso quando combinado com Retrofit também. Isso funciona bem para uso geral Java, bem como no 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();
}

Retrofit: http://square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
 4
Author: Sam Edwards, 2015-11-16 14:18:27

Desde que ninguém mencionado, aqui está outro: fingir , que é usado pornuvem de Primavera .

 3
Author: Leon, 2018-04-28 14:19:22

Há algum tempo que ando a usar O Resty.:

JSONResource jsonResource = new Resty().json(uri);

Pode-se encontrar alguns exemplos Aqui.

 2
Author: aribeiro, 2016-02-02 15:46:16

Embora seja simples criar um cliente HTTP e fazer um reuest. Mas se você quiser fazer uso de alguns clientes gerados automaticamente, você pode fazer uso de WADL para descrever e gerar código.

Você pode usar RestDescribe para gerar e compilar o WSDL, você poderá gerar clientes em php, ruby, python, java e C# usando isto. Ele gera código limpo e há uma boa mudança que você tem que ajustá-lo um pouco após a geração de código, você pode encontrar boa documentação e subjacente pensamentos por trás da ferramenta aqui .

Existem poucas ferramentas interessantes e úteis de WADL mencionadas em wintermute.

 1
Author: GG., 2013-01-13 12:48:14

Escrevi uma biblioteca que mapeia uma interface java para um serviço remoto de descanso JSON:

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);
}
 1
Author: George Georgovassilis, 2014-04-04 07:37:27

Tente ver o http-rest-client

Https://github.com/g00dnatur3/http-rest-client

Aqui está um exemplo simples:

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);
A biblioteca trata da serialização e ligação do json. Aqui está outro exemplo.
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());

E um último exemplo,

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams
Saúde!
 1
Author: g00dnatur3, 2014-07-20 21:09:02

Exemplos de cliente de jersey:
Adicionar dependência:

         <!-- 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>

Esquecer o método e passar dois parâmetros:

          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 passando um parâmetro e obtendo um Respone da lista:

       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));    
    }

Em cima ele retorna uma lista que estamos aceitando como uma lista e, em seguida, convertê-lo para JSON Array e, em seguida, JSON Array para Lista .

Se após pedido passar o objecto Json como parâmetro:

   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 "));
    }
 1
Author: abhishek ringsia, 2014-09-23 10:43:07

Pode usar o 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 {}
...
}

A partir de um URL, poderá criar uma ligação HttpURLConnection que lhe permite invocar um

específico.
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();
 -1
Author: vikseln, 2014-06-14 04:04:28