2014-10-29 4 views
6

DropWizard использует Jersey под капотом для ОТДЫХА. Я пытаюсь выяснить, как написать клиент для конечных точек RESTful, которые откроет мое приложение DropWizard.DropWizard/Jersey API Клиенты

Ради этого примера, скажем, мой DropWizard приложение имеет CarResource, который предоставляет несколько простых RESTful конечных точек для CRUDding автомобилей:

@Path("/cars") 
public class CarResource extends Resource { 
    // CRUDs car instances to some database (DAO). 
    public CardDao carDao = new CarDao(); 

    @POST 
    public Car createCar(String make, String model, String rgbColor) { 
     Car car = new Car(make, model, rgbColor); 
     carDao.saveCar(car); 

     return car; 
    } 

    @GET 
    @Path("/make/{make}") 
    public List<Car> getCarsByMake(String make) { 
     List<Car> cars = carDao.getCarsByMake(make); 
     return cars; 
    } 
} 

Так что я бы себе представить, что структурированная клиент API будет что-то вроде CarServiceClient:

// Packaged up in a JAR library. Can be used by any Java executable to hit the Car Service 
// endpoints. 
public class CarServiceClient { 
    public HttpClient httpClient; 

    public Car createCar(String make, String model, String rgbColor) { 
     // Use 'httpClient' to make an HTTP POST to the /cars endpoint. 
     // Needs to deserialize JSON returned from server into a `Car` instance. 
     // But also needs to handle if the server threw a `WebApplicationException` or 
     // returned a NULL. 
    } 

    public List<Car> getCarsByMake(String make) { 
     // Use 'httpClient' to make an HTTP GET to the /cars/make/{make} endpoint. 
     // Needs to deserialize JSON returned from server into a list of `Car` instances. 
     // But also needs to handle if the server threw a `WebApplicationException` or 
     // returned a NULL. 
    } 
} 

Но только два официальных ссылки уронить мастера клиентов я могу найти абсолютно противоречащими друг другу:

  • DropWizard recommended project structure - который утверждает, что я должен поставить свой код клиента в car-client проекта под car.service.client пакета; но затем ...
  • DropWizard Client manual - что делает его похожим на «DropWizard Client» предназначен для интеграции моего приложения DropWizard с другими RESTful веб-сервисами (таким образом, выступая посредником).

Так что я спрашиваю, каков стандартный способ написания клиентов Java API для ваших веб-сервисов DropWizard? У DropWizard есть клиентская библиотека, которую я могу использовать для этого типа использования? Должен ли я внедрять клиента через API-интерфейс клиента Джерси? Может кто-то добавить псевдокод к моему CarServiceClient, чтобы я мог понять, как это будет работать?

ответ

-10

Вы можете интегрировать с Spring Framework для реализации

0

Да, что dropwizard-клиент предоставляет должен использоваться только самой службы, скорее всего, общаться и другие услуги. Он не обеспечивает ничего для клиентских приложений напрямую.

В любом случае, это не делает магии с HttpClients. Он просто настраивает клиента в соответствии с yml-файлом, назначает существующий объект-манипулятор Jackson и валидатор клиенту Jersey, и я думаю, что повторно использует пул потоков приложения. Вы можете проверить все это на https://github.com/dropwizard/dropwizard/blob/master/dropwizard-client/src/main/java/io/dropwizard/client/JerseyClientBuilder.java

Я думаю, что я собирался и структурировал свои занятия так же, как и с помощью Jersey Client. Ниже абстрактный класс Я использую для обслуживания клиентов:

public abstract class HttpRemoteService { 

    private static final String AUTHORIZATION_HEADER = "Authorization"; 
    private static final String TOKEN_PREFIX = "Bearer "; 

    private Client client; 

    protected HttpRemoteService(Client client) { 
    this.client = client; 
    } 

    protected abstract String getServiceUrl(); 

    protected WebResource.Builder getSynchronousResource(String resourceUri) { 
    return client.resource(getServiceUrl() + resourceUri).type(MediaType.APPLICATION_JSON_TYPE); 
    } 

    protected WebResource.Builder getSynchronousResource(String resourceUri, String authToken) { 
    return getSynchronousResource(resourceUri).header(AUTHORIZATION_HEADER, TOKEN_PREFIX + authToken); 
    } 

    protected AsyncWebResource.Builder getAsynchronousResource(String resourceUri) { 
    return client.asyncResource(getServiceUrl() + resourceUri).type(MediaType.APPLICATION_JSON_TYPE); 
    } 

    protected AsyncWebResource.Builder getAsynchronousResource(String resourceUri, String authToken) { 
    return getAsynchronousResource(resourceUri).header(AUTHORIZATION_HEADER, TOKEN_PREFIX + authToken); 
    } 

    protected void isAlive() { 
    client.resource(getServiceUrl()).get(ClientResponse.class); 
    } 

} 

и вот как я делаю это бетон:

private class TestRemoteService extends HttpRemoteService { 

    protected TestRemoteService(Client client) { 
     super(client); 
    } 

    @Override 
    protected String getServiceUrl() { 
     return "http://localhost:8080"; 
    } 

    public Future<TestDTO> get() { 
     return getAsynchronousResource("/get").get(TestDTO.class); 
    } 

    public void post(Object object) { 
     getSynchronousResource("/post").post(object); 
    } 

    public void unavailable() { 
     getSynchronousResource("/unavailable").get(Object.class); 
    } 

    public void authorize() { 
     getSynchronousResource("/authorize", "ma token").put(); 
    } 
    } 
1

если кто-то пытается использовать DW 0.8.2 при строительстве клиент, и вы получаете следующее сообщение об ошибке:

cannot access org.apache.http.config.Registry 
class file for org.apache.http.config.Registry not found 

at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:858) 
at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:129) 
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) 
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) 
... 19 more 

обновления вашего dropwizard-клиент в вашем pom.xml от 0.8.2 до 0.8. и вам должно быть хорошо. Я считаю, что была обновлена ​​субзависимость присадки, которая исправила ее.

<dependency> 
     <groupId>io.dropwizard</groupId> 
     <artifactId>dropwizard-client</artifactId> 
     <version>0.8.4</version> 
     <scope>compile</scope> 
    </dependency> 
1

Вот шаблон, который вы можете использовать с помощью JAX-RS-клиента.

Чтобы получить клиент:

javax.ws.rs.client.Client init(JerseyClientConfiguration config, Environment environment) { 
    return new JerseyClientBuilder(environment).using(config).build("my-client"); 
} 

Вы можете совершать звонки следующим образом:

javax.ws.rs.core.Response post = client 
     .target("http://...") 
     .request(MediaType.APPLICATION_JSON) 
     .header("key", value) 
     .accept(MediaType.APPLICATION_JSON) 
     .post(Entity.json(myObj)); 
Смежные вопросы