webentwicklung-frage-antwort-db.com.de

REST Clients für Java?

Mit JSR 311 und seinen Implementierungen verfügen wir über einen leistungsstarken Standard zum Exponieren von Java -Objekten über REST. Auf der Clientseite scheint jedoch etwas zu fehlen, das mit Apache Axis für SOAP - etwas, das den Webdienst verbirgt und die Daten transparent zurück zu Java - Objekten marshallt.

Wie erstellen Sie Java RESTful-Clients? Mit HTTPConnection und manuellem Parsing des Ergebnisses? Oder spezialisierte Clients für beispielsweise Jersey oder Apache CXR?

220
Yaba

Dies ist eine alte Frage (2008), daher gibt es heute viel mehr Optionen als damals:

AKTUALISIEREN circa 2014:

Das neue Kind auf dem Block, das NIO-Unterstützung bietet (obwohl ich ehrlich gesagt nicht der Meinung bin, dass dies die Leistung von Clients wie Servern wirklich verbessert).

UPDATE 2016 :

  • OkHttp - Unterstützt neuere HTTP-Protokolle (SPDY und HTTP2). Funktioniert auf Android. Leider bietet es keine echte Reactor-Loop-basierte Async-Option (siehe Ning- und HTTP-Komponenten oben). Wenn Sie jedoch das neuere HTTP2-Protokoll verwenden, ist dies weniger problematisch (vorausgesetzt, die Anzahl der Verbindungen ist problematisch).
  • Retrofit - Erstellt automatisch Clients basierend auf Schnittstellenstubs, die einigen Jersey- und CXF-Erweiterungen ähneln. Verwendet OkHttp.
  • Apache HttpComponents 5 wird angeblich HTTP2 unterstützen

Eine Einschränkung bei der Auswahl von HTTP/REST-Clients. Stellen Sie sicher, dass Sie überprüfen, was Ihr Framework-Stack für einen HTTP-Client verwendet, wie er Threading ausführt, und im Idealfall denselben Client verwenden, falls er einen anbietet. Das heißt, wenn Sie etwas wie Vert.x oder Play verwenden, möchten Sie möglicherweise versuchen, seinen Backing-Client zu verwenden, um an den Bus- oder Reaktorschleifen teilzunehmen, die das Framework bereitstellt.

181
Adam Gent

Wie ich in diesem Thread erwähnt habe , verwende ich tendenziell Jersey , das JAX implementiert -RS und wird mit einem Nice REST Client geliefert. Das Schöne ist, wenn Sie Ihre RESTful-Ressourcen mit JAX-RS implementieren, kann der Jersey-Client die Entity-Provider wie für JAXB/XML/JSON wiederverwenden/Atom und so weiter - so können Sie auf der Serverseite dieselben Objekte wiederverwenden, die Sie auf der Clientseite beim Unit-Test verwenden.

Zum Beispiel ist hier ein Unit-Testfall aus dem Apache Camel-Projekt der sucht XML-Nutzdaten von einer RESTful-Ressource (mithilfe des JAXB-Objekts Endpoints). Die resource (uri) -Methode wird in dieser Basisklasse definiert, die nur die Jersey-Client-API verwendet.

z.B.

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

Übrigens hoffe ich, dass die zukünftige Version von JAX-RS eine nette clientseitige API in Anlehnung an die in Jersey hinzufügt

70
James Strachan

Sie können die Standard Java SE APIs verwenden:

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

Sie können auch die REST Client-APIs verwenden, die von JAX-RS-Implementierungen wie Jersey bereitgestellt werden. Diese APIs sind einfacher zu verwenden, erfordern jedoch zusätzliche Jars in Ihrem Klassenpfad.

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

Weitere Informationen finden Sie unter:

61
bdoughan

Wenn Sie nur einen REST Service aufrufen und die Antwort analysieren möchten, können Sie Rest Assured ausprobieren

// 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]");
11
Johan

Sie können auch Restlet überprüfen, das alle clientseitigen Funktionen bietet, und mehr REST auf Bibliotheken niedrigerer Ebene wie HttpURLConnection oder Apache HTTP Client (die wir nutzen können) Verbinder).

Viele Grüße, Jerome Louvel

10
Jerome Louvel

Ich habe vor kurzem versucht Retrofit Bibliothek von Square, es ist großartig und Sie können Ihre Rest-API sehr einfach aufrufen. Die auf Anmerkungen basierende Konfiguration ermöglicht es uns, viel Kesselplattencodierung loszuwerden.

7

Sie könnten versuchen Rapa . Teilen Sie uns Ihr Feedback dazu mit. Sie können auch Probleme oder erwartete Funktionen protokollieren.

7
HariKrishnan

Ich möchte auf zwei weitere Optionen hinweisen:

6
Ophir Radnitz

Ich benutze Apache HTTPClient, um die gesamte HTTP-Seite der Dinge zu behandeln.

Ich schreibe XML-SAX-Parser für den XML-Inhalt, der das XML in Ihr Objektmodell analysiert. Ich glaube, dass Axis2 auch XML -> Modellmethoden verfügbar macht (Achse 1 hat diesen Teil ärgerlich versteckt). XML-Generatoren sind einfach.

Der Code dauert nicht lange und ist meiner Meinung nach ziemlich effizient.

5
JeeBee

OkHttp ist auch in Kombination mit Retrofit leicht und leistungsstark. Dies funktioniert sowohl für die allgemeine Verwendung von Java als auch für 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();
}

Nachrüsten : http://square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
5
Sam Edwards

Da niemand etwas erwähnt hat, ist hier ein anderes: Feign , das von Spring Cloud verwendet wird.

4
Leon

Versuchen Sie JdkRequest von jcabi-http (ich bin ein Entwickler). So funktioniert es:

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

Weitere Informationen finden Sie in diesem Blogbeitrag: http://www.yegor256.com/2014/04/11/jcabi-http-intro.html

4
yegor256

Seit einiger Zeit benutze ich Resty :

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

Man kann einige Beispiele finden hier .

2
aribeiro

Beispiele für Trikot Rest Client:
Abhängigkeit hinzufügen:

         <!-- 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 und Übergabe von zwei Parametern:

          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 übergibt einen Parameter und erhält eine Antwort auf die Liste:

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

Oben wird eine Liste zurückgegeben, die wir als Liste akzeptieren und dann in ein Json-Array und dann in ein Json-Array in eine Liste konvertieren.

Wenn nach der Anforderung ein Json-Objekt als Parameter übergeben wird:

   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

Es ist zwar einfach, einen HTTP-Client zu erstellen und eine Bestätigung zu erstellen. Wenn Sie jedoch einige automatisch generierte Clients verwenden möchten, können Sie WADL zum Beschreiben und Generieren von Code verwenden.

Sie können RestDescribe verwenden, um WSDL zu generieren und zu kompilieren. Sie können Clients in PHP, Ruby, Python, Java und C #) damit generieren. Es generiert sauberen Code und es gibt Eine gute Änderung, die Sie ein wenig nach der Codegenerierung anpassen müssen. Sie können eine gute Dokumentation und grundlegende Gedanken hinter dem Tool finden hier .

Es gibt nur wenige interessante und nützliche WADL-Tools auf Wintermute erwähnt.

1
GG.

Versuchen Sie es mit http-rest-client

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

Hier ist ein einfaches Beispiel:

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

Die Bibliothek kümmert sich um die Serialisierung und Bindung von JSON für Sie.

Hier ist ein weiteres Beispiel:

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

Und ein letztes Beispiel:

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams

Prost!

1
g00dnatur3

Ich habe eine Bibliothek geschrieben, die eine Java Schnittstelle einem entfernten JSON REST Service zuordnet:

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