2014-10-29 29 views
6

DropWizard, REST için başlık altında Jersey kullanır. DropWizard uygulamasının göstereceği RESTful uç noktaları için bir istemci nasıl yazılacağını anlamaya çalışıyorum. Bu yüzden o yapılandırılmış API istemci hayal ediyorumDropWizard/Jersey API İstemcileri

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

: Bu örnek uğruna

, benim DropWizard uygulaması CRUDding otomobiller için bir kaç basit RESTful bitiş noktaları sunar bir CarResource sahiptir diyelim

// 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. 
    } 
} 

Ama birbirlerine bütünüyle aykırıdır bulabilirsiniz Sihirbazı müşterilerine Bırak için sadece iki resmi referanslar: a CarServiceClient gibi bir şey olabilir

  • DropWizard recommended project structure - Ben car.service.client paketi altında bir car-client projede müvekkilim kodu koymalıyız iddia ettiği; ama daha sonra ... - "DropWizard İstemcisi" gibi görünen, DropWizard uygulamasının diğer RESTful web hizmetleriyle (böylece aracı olarak işlev görür) bütünleştirilmesi anlamına gelir.

Bu yüzden, DropWizard web hizmetleriniz için Java API istemcileri yazmanın standart yolu nedir? DropWizard'ın bu tür bir kullanım durumu için kullanabileceğim bir istemci kütüphanesi var mı? İstemciyi bazı Jersey istemci API'sı aracılığıyla uygulamalı mıyım? Birisi, CarServiceClient'a sahte kod ekleyebilir mi, bu yüzden bunun nasıl işe yaradığını anlayabilir miyim?

cevap

-10

Sen

0

Evet ne dropwizard-istemci yalnızca hizmet kendisi tarafından kullanılmak üzere olan sağlar, büyük olasılıkla diğer hizmetleri iletişim uygulamak için Bahar Framework ile entegre edebilirsiniz. Doğrudan istemci uygulamaları için hiçbir şey sağlamaz.

HttpClients ile çok fazla sihir yapmıyor zaten. İstemciyi yml dosyasına göre yapılandırır, mevcut Jackson nesne eşleştiricisi ve doğrulayıcıyı Jersey istemcisine atar ve bence uygulamanın iş parçacığı havuzunu yeniden kullanır. Tüm bunlara https://github.com/dropwizard/dropwizard/blob/master/dropwizard-client/src/main/java/io/dropwizard/client/JerseyClientBuilder.java

'u kontrol edebilirsiniz. Sanırım derslerimi Jersey Client'ı kullandığınız gibi yapıyorum. Aşağıdaki soyut bir istemci hizmetleri için ben kullanıyorum sınıftır:

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

} 

ve burada bunu somut hale nasıl:

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

kimse DW 0.8.2 bir bina kullanmaya çalışıyor ise 0.8.2 ila 0.8 senin pom.xml'Bu

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 

güncellemesi dropwizard-client: istemci ve aşağıdaki hata alıyorsanız. ve iyi olmalısınız. Bir iskelenin alt bağımlılığının güncellendiği fikrine inanıyorum.

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

JAX-RS istemcisini kullanarak kullanabileceğiniz bir desen.

javax.ws.rs.core.Response post = client 
     .target("http://...") 
     .request(MediaType.APPLICATION_JSON) 
     .header("key", value) 
     .accept(MediaType.APPLICATION_JSON) 
     .post(Entity.json(myObj)); 
:

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

Daha sonra aramaları şu şekilde yapabiliriz:

müşteri almak için
İlgili konular