Hoe maak je een REST-client voor Java?

Met JSR 311 en zijn implementaties hebben we een krachtige standaard voor het blootleggen van Java-objecten via REST. Aan de clientzijde lijkt er echter iets te ontbreken dat vergelijkbaar is met Apache Axis voor SOAP – iets dat de webservice verbergt en de gegevens transparant terugleidt naar Java-objecten.

Hoe maak je Java RESTful-clients? HTTPConnection gebruiken en het resultaat handmatig ontleden? Of gespecialiseerde opdrachtgevers voor b.v. Jersey of Apache CXR?


Antwoord 1, autoriteit 100%

Dit is een oude vraag (2008), dus er zijn nu veel meer opties dan toen:

UPDATES (projecten nog steeds actief in 2020):

  • Apache HTTP-componenten (4.2) Vloeiende adapter– Basisvervanging voor JDK, gebruikt door verschillende andere kandidaten in deze lijst. Beter dan de oude Commons HTTP Client 3 en gemakkelijker te gebruiken voor het bouwen van uw eigen REST-client. Je zult iets als Jackson for JSON parsing-ondersteuning moeten gebruiken en je kunt HTTP-componenten URIBuilder om resource-URI’s te bouwenvergelijkbaar met Jersey/JAX-RS Rest-client . HTTP-componenten ondersteunen ook NIO, maar ik betwijfel of je betere prestaties zult krijgen dan BIO gezien het korte verzoek van REST. Apache HttpComponents 5heeft HTTP/2-ondersteuning.
  • OkHttp– Basisvervanging voor JDK, vergelijkbaar met http-componenten, gebruikt door verschillende andere kandidaten in deze lijst. Ondersteunt nieuwere HTTP-protocollen (SPDY en HTTP2). Werkt op Android. Helaas biedt het geen echte asynchrone optie op basis van een reactorlus (zie Ning- en HTTP-componenten hierboven). Als u echter het nieuwere HTTP2-protocol gebruikt, is dit minder een probleem (ervan uitgaande dat het aantal verbindingen een probleem is).
  • Ning Async-http-client– biedt NIO steun. Voorheen bekend als Async-http-clientdoor Sonatype.
  • Feignwrapper voor http-clients op een lager niveau (okhttp, apache httpcomponenten) . Maakt automatisch clients aan op basis van interfacestubs die vergelijkbaar zijn met sommige Jersey- en CXF-extensies. Sterke veerintegratie.
  • Retrofit– wrapper voor http-clients op een lager niveau (okhttp). Maakt automatisch clients aan op basis van interfacestubs die vergelijkbaar zijn met sommige Jersey- en CXF-extensies.
  • Volley-wrapper voor jdk http-client, door google
  • google-httpwrapper voor jdk http client, of apache httpcomponenten, door google
  • Unirest-wrapper voor jdk http-client, door kong
  • ResteasyJakartaEE-wrapper voor jdk http-client, door jboss, onderdeel van jboss-framework
  • jcabi-httpwrapper voor apache httpcomponenten, onderdeel van jcabi collectie
  • restletwrapper voor apache httpcomponenten, onderdeel van restlet kader
  • rust-assuredwrapper met beweringen voor eenvoudig testen

Een waarschuwing bij het kiezen van HTTP/REST-clients. Zorg ervoor dat u controleert wat uw framework-stack gebruikt voor een HTTP-client, hoe deze threading uitvoert en idealiter dezelfde client gebruikt als deze er een biedt. Dat wil zeggen, als je iets als Vert.x of Play gebruikt, wil je misschien proberen de backing-client te gebruiken om deel te nemen aan elke bus- of reactorlus die het raamwerk biedt… anders wees voorbereid op mogelijk interessante threading-problemen.


Antwoord 2, autoriteit 33%

Zoals ik al zei in deze threadheb ik de neiging om Jerseydie JAX-RS implementeert en wordt geleverd met een mooie REST-client. Het leuke is dat als je je RESTful-resources implementeert met JAX-RS, de Jersey-client de entiteitsproviders kan hergebruiken, zoals voor JAXB/XML/JSON/Atom enzovoort – zodat je dezelfde objecten aan de serverkant kunt hergebruiken als jij gebruik op de client-side unit test.

Bijvoorbeeld hier is een unit-testcasevan de Apache Camel-projectdat XML-payloads opzoekt van een RESTful-resource (met behulp van het JAXB-object Endpoints). De resource(uri)-methode is gedefinieerd in deze basisklassedie alleen de Jersey-client-API gebruikt.

bijv.

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

Tussen haakjes, ik hoop dat toekomstige versie van JAX-RS een mooie client-side API zal toevoegen in de trant van die in Jersey


Antwoord 3, autoriteit 29%

U kunt de standaard Java SE API’s gebruiken:

private void updateCustomer(Customer customer) { 
    try { 
        URL url = new URL("https://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); 
    } 
} 

Of u kunt de REST-client-API’s gebruiken die worden geleverd door JAX-RS-implementaties zoals Jersey. Deze API’s zijn gemakkelijker te gebruiken, maar vereisen extra jars op je klassenpad.

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

Voor meer informatie zie:


Antwoord 4, Autoriteit 6%

Als u alleen een rustdienst wilt aanroepen en de reactie wilt ontleden, kunt u uitproberen rust verzekerd

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

Antwoord 5, Autoriteit 4%

U kunt Restlet die volledige klant-zijmogelijkheden heeft, meer rust georiënteerd Zoals HTTPURLCONNECTION of APACHE HTTP-client (die we kunnen hefage als connectoren).

vriendelijke groeten,
Jerome Louvel


Antwoord 6, Autoriteit 3%

U kunt rapa . Laat ons uw feedback weten over hetzelfde.
En voel je vrij om problemen of verwachte functies te loggen.


Antwoord 7, Autoriteit 3%

Ik wil graag nog 2 meer opties wijs:


Antwoord 8, autoriteit 3%

Probeer JdkRequestvan jcabi-http(ik ben een ontwikkelaar). Zo werkt het:

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

Bekijk deze blogpost voor meer details: http:// www.yegor256.com/2014/04/11/jcabi-http-intro.html


Antwoord 9, autoriteit 2%

Ik heb onlangs RetrofitBibliotheek van Square geprobeerd, het is geweldig en je kunt je rest API aanroepen Heel makkelijk.
Op annotaties gebaseerde configuratie stelt ons in staat om veel ketelplaatcodering te verwijderen.


Antwoord 10, autoriteit 2%

Ik gebruik Apache HTTPClient om alle HTTP-zaken af te handelen.

Ik schrijf XML SAX-parsers voor de XML-inhoud die de XML in uw objectmodel parseert. Ik geloof dat Axis2 ook XML -> Modelmethoden (As 1 verborg dit deel, hinderlijk). XML-generatoren zijn triviaal eenvoudig.

Het duurt niet lang om te coderen en is naar mijn mening behoorlijk efficiënt.


Antwoord 11, autoriteit 2%

OkHttp is ook lichtgewicht en krachtig in combinatie met Retrofit. Dit werkt goed voor algemeen Java-gebruik en voor 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);
}

Antwoord 12

Omdat niemand het heeft genoemd, is hier nog een: Feign, die wordt gebruikt door Spring Cloud.


Antwoord 13

Hoewel het eenvoudig is om een HTTP-client te maken en opnieuw te maken. Maar als u gebruik wilt maken van enkele automatisch gegenereerde clients, kunt u WADL gebruiken om code te beschrijven en te genereren.

U kunt RestDescribegebruiken om WSDL te genereren en te compileren, u kunt clients genereren in php, ruby, python, java en C# gebruiken. Het genereert schone code en er is een goede verandering dat je het een beetje moet aanpassen na het genereren van de code, je kunt goede documentatie en onderliggende gedachten vinden achter de tool hier.

Er zijn weinig interessante en nuttige WADL-gereedschappen vermeld op wintermute.


Antwoord 14

Ik heb een bibliotheek geschreven die een Java-interface in kaart brengen naar een Remote JSON Rest Service:

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

Antwoord 15

Voorbeelden van Jersey Rest Client:
Afhankelijkheid toevoegen:

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

vergeetmethod en passeer twee parameter:

         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 één parameter doorgeven en een antwoord krijgen van de lijst:

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

Hierboven retourneert het een lijst die we accepteren als een lijst en deze vervolgens converteren naar Json Array en vervolgens Json Array naar List .

Als Post Request Json Object als parameter doorgeeft:

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

Antwoord 16

Ik heb RestAssuredde meeste de tijd om de reactie van de rustservice te ontleden en de services te testen. Naast Rest Assured heb ik ook onderstaande bibliotheken gebruikt om met Resful-services te communiceren.

a. Jersey Rest-client

b. Spring RestTemplate

c. Apache HTTP-client


Antwoord 17

Probeer http-rest-client te bekijken

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

Hier is een eenvoudig voorbeeld:

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

De bibliotheek zorgt voor json-serialisatie en binding voor u.

Hier is nog een voorbeeld,

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

En nog een laatste voorbeeld,

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

Proost!


Antwoord 18

Ik gebruik momenteel https://github.com/kevinsawicki/http-requestIk hou van hun eenvoud en de manier waarop voorbeelden worden getoond, maar ik was vooral verkocht toen ik las:

Wat zijn de afhankelijkheden?

Geen. Het doel van deze bibliotheek is om een enkele klasse te zijn met enkele innerlijke statische klassen. Het testproject vereist Jetty om verzoeken te testen tegen een daadwerkelijke HTTP-serverimplementatie.

die een aantal problemen op een java 1.6-project heeft opgelost. Wat betreft het decoderen van json in objecten gsonis gewoon onoverwinnelijk 🙂

Other episodes