2015-05-10 18 views
11

Belge, belirli bir sorgu parametresinin isteğe bağlı olduğunu ve varsayılan bir argüman sağlamadığını söyleyen bir RESTful API'm var. Yani, değeri sağlayabilir ya da GET isteğine bir parametre olarak göndermeyebilirim.Jersey Client/JAX-RS ve isteğe bağlı (varsayılan değil) @QueryParam (istemci tarafı)

Örnek:

http://www.example.com/service/endpoint?queryA=foo&queryB=bar 

T:

  • queryA
  • queryB
  • isteğe (olmadan GET gönderebilir)

Bu çalışması gerekir Gerekli olan onun da çalışması gerekir:

http://www.example.com/service/endpoint?queryA=foo 

Bunu nasıl yapabilirim Jersey-Proxy için bir istemci arabirimi yapabilirim ?? Arabirim için sunucu tarafı kod yok, bu nedenle sunucu API'siyle etkileşime geçmek için istemci oluşturmak için Jersey-Proxy aracılığıyla org.glassfish.jersey.client.proxy.WebResourceFactory kullanıyorum.

Numune arayüzü: Ben başka bir yöntem yapabilirsiniz biliyorum

import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.Response; 

@Path("/service") 
@Produces("application/json") 
public interface ServiceInterface { 

    @Path("/endpoint") 
    @GET 
    public Response getEndpoint(
      @QueryParam("queryA") String first, 
      @QueryParam("queryB") String second); 

} 

:

@Path("/endpoint") 
    @GET 
    public Response getEndpoint(
      @QueryParam("queryA") String first); 

Ama birden isteğe bağlı alanları olduğunda ne olur ?? Bunların olası her mutasyonunu yapmak istemiyorum!

+0

: http://stackoverflow.com/questions/13968261/required-queryparam-in-jax-rs-and-what-to-do-in-their-absence – quintin

+0

İşte sunucu tarafı içindir, istemci tarafı değil. – justderb

cevap

20

için

arayüzü oldu sağ hepsi

boyunca ben bu kolay oldu inanamıyorum: sorular arayüzünden daha farklı

import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.Response; 

@Path("/service") 
@Produces("application/json") 
public interface ServiceInterface { 

    @Path("/endpoint") 
    @GET 
    public Response getEndpoint(
      @QueryParam("queryA") String first, 
      @QueryParam("queryB") String second); 

} 

Bildirim şey ?? Hayır! Çünkü cevap bu!


belirli bir değere bir parametre varsayılan istiyorsanız @DefaultValue

kullanmayın, sen parametresinde @DefaultValue notu kullanın:

import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.Response; 

@Path("/service") 
@Produces("application/json") 
public interface ServiceInterface { 

    @Path("/endpoint") 
    @GET 
    public Response getEndpoint(
      @QueryParam("queryA") String first, 
      @QueryParam("queryB") @DefaultValue("default") String second); 

} 

Geçiş null@QueryParam için

@QueryParam'u isteğe bağlı yapmak istiyorsanız, @DefaultValue ek notunu uygulamayın. Sorgu parametresiyle bir değer iletmek için, normalde değeri iletmeniz yeterlidir. Sorgu parametresinin hiç görünmemesini istiyorsanız, null'u geçin!

import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.Response; 

@Path("/service") 
@Produces("application/json") 
public interface ServiceInterface { 

    @Path("/endpoint") 
    @GET 
    public Response getEndpoint(
      @QueryParam("queryA") String first, 
      // Pass null to this parameter to not put it in the GET request 
      @QueryParam("queryB") String second); 

} 

Yani çağıran ServiceInterface.getEndpoint("firstQueryParam", "secondQueryParam"); aramalar:

http://targethost.com/service/endpoint?queryA=firstQueryParam&queryB=secondQueryParam 

ve arama ServiceInterface.getEndpoint("firstQueryParam", null); aramalar:

http://targethost.com/service/endpoint?queryA=firstQueryParam 

Ve walla! İkinci sorgu parametresi yok! :)

Bu sorunuza cevap verebilir
+1

Dizelerin yerine sayılar ne olacak? Boş kullanmanın bir yolu yoktur, bu yüzden değeri kontrol etmeniz gerekir. – jlanza

+0

Otomatik kutular türlerini kullanmanız gerektiğine inanıyorum: 'Boole', 'Tamsayı' vb. – justderb

1

Sen yöntem haline bir UriInfo örneğini (veya HttpServletRequest gibi başka bir şeyi) enjekte ve bunun dışına istediğini veri elde edebilirsiniz. Örneğin

@Path("/endpoint") 
@GET 
public Response getEndpoint(@Context UriInfo info, @QueryParam("queryA") String queryA) { 
    String queryB = info.getQueryParameters().getFirst("queryB"); 
    if (null != queryB) { 
    // do something with it 
    } 
    ... 
} 
+0

Bu, WebResourceFactory ile birlikte çalışıyor ve Jersey ile başınızın üstü kapalı mı? Bunu yapıp yapamayacağımı göreceğim ... – justderb

+0

Jersey istemcisinden bahsediyorsunuz, ancak örnek verebildiğim kadarıyla bir JAX-RS uç noktasının sunucu tarafı tanımı ... – Alex

+0

Tanım istemci için -Ancak, sunucu tarafı kodum yok. – justderb

İlgili konular