SORU
19 Kasım 2011, CUMARTESİ


Ne kadar Dinlendirici bir POST yöntemi parametreleri erişmek için

SONRASI benim yöntem bu gibi görünüyor:

@POST
@Consumes({"application/json"})
@Path("create/")
public void create(String param1, String param2){
    System.out.println("param1 = "   param1);
    System.out.println("param2 = "   param2);
}

Eclipse Jersey'de bir İstemci oluşturduğumda post yöntemi çağıran yöntem bu gibi görünüyor:

public void create(Object requestEntity){
    webResource.path("create").type(MediaType.APPLICATION_JSON).post(requestEntity);
}

Bu test çalışırken:

@Test
public void hello(){
    String json = "{param1=\"hello\",param2=\"hello2\"}";
    this.client.create(json);
}

Sunucu aşağıdaki çıktıyı verir:

INFO: param1 = {param1="hello",param2="hello2"}
INFO: param2 = 

Ben parametreleri doğru değer veriyor, böylece değiştirmek için ne yapmak gerekiyor?

CEVAP
19 Kasım 2011, CUMARTESİ


@POST yöntemi bir dize yerine JSON bir nesne kabul edilmelidir. Jersey JAXB dizme ve unmarshaling JSON nesneleri (the jersey docs for details) desteklemek için kullanır. Gibi bir sınıf oluşturun:

@XmlRootElement
public class MyJaxBean {
    @XmlElement public String param1;
    @XmlElement public String param2;
}

Daha sonra @POST yöntem aşağıdaki gibi görünecektir:

@POST @Consumes("application/json")
@Path("/create")
public void create(final MyJaxBean input) {
    System.out.println("param1 = "   input.param1);
    System.out.println("param2 = "   input.param2);
}

Bu yöntem, HTTP POST vücut olarak JSON nesnesi almak için bekliyor. JAX-RS bu durumda input -- unannotated bir parametre olarak HTTP mesajın içeriği vücut geçer. Gerçek mesajı gibi görünecektir:

POST /create HTTP/1.1
Content-Type: application/json
Content-Length: 35
Host: www.example.com

{"param1":"hello","param2":"world"}

Bu şekilde JSON kullanarak belli sebeplerden dolayı oldukça yaygındır. Ya da bir şey JavaScript dışında tüketen üreten ise, o zaman düzgün veri kaçmak için dikkatli olmak zorunda. JAX-RS, MessageBodyReader MessageBodyWriter bunu uygulamak için kullanırsınız. Jersey zaten JSON için gerekli türleri (örneğin, Java ilkel ve JAXB sarılmış sınıflar) yanı sıra uygulamaları olduğuna inanıyorum. JAX-RS geçen veri için diğer yöntemleri bir dizi destekler. Bu, iletilen verileri basit değişken geçirmeden kullanan bu yana yeni bir sınıf oluşturulmasını gerektirmez.


<FORM> HTML

Parametreleri açıklamalı @FormParam kullanarak olurdu:

@POST
@Path("/create")
public void create(@FormParam("param1") String param1,
                   @FormParam("param2") String param2) {
    ...
}

Tarayıcı formu "application/x-www-form-urlencoded" kullanarak kodlar. JAX-RS zamanı vücut ve kod çözme yöntemine geçirmeden ilgilenir. Tel görmelisiniz:

POST /create HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 25

param1=hello¶m2=world

İçerik bu durumda URL encoded.


HTTP Başlıkları

Eğer HTTP başlıkları): parametre geçirmek istiyorsanız @HeaderParam annotation kullanarak yapabilirsiniz

@POST
@Path("/create")
public void create(@HeaderParam("param1") String param1,
                   @HeaderParam("param2") String param2) {
    ...
}

HTTP mesaj gibi görünür. Bu YAZI bir vücuda sahip olmadığını unutmayın.

POST /create HTTP/1.1
Content-Length: 0
Host: www.example.com
param1: hello
param2: world

Genel parametre aktarımı için bu yöntemi kullanmam. Eğer belirli bir HTTP başlık olsa değerini erişmek gerekirse gerçekten kullanışlı.


Sorgu Parametreleri HTTP

Bu yöntemi esas Alır HTTP ile kullanılır ama Mesajlar için de aynı derecede geçerlidir. @QueryParam ek açıklama kullanır.

@POST
@Path("/create")
public void create(@QueryParam("param1") String param1,
                   @QueryParam("param2") String param2) {
    ...
}

Önceki yöntem gibi, sorgu dizesi parametreleri üzerinden geçen bir ileti gövdesi gerektirmez. İşte HTTP iletisi:

POST /create?param1=hello¶m2=world HTTP/1.1
Content-Length: 0
Host: www.example.com

Doğru istemci tarafında encode query parameters özellikle dikkatli olmak zorunda. Sorgu parametreleri kullanarak URL uzunluğu kısıtlamaları bazı vekiller tarafından zorunlu olarak onları kodlama ile ilgili sorunlar nedeniyle sorunlu olabilir.


Yol Parametreleri HTTP

Yol parametreleri HTTP kaynak yolu gömülü oldukları dışında sorgu parametreleri benzer. Bu yöntem taraftarı bugün gibi görünüyor. Yol gerçekten HTTP kaynağı tanımlayan bir şey olduğu için önbelleğe HTTP bakımından etkileri vardır. Kodu @Path ek açıklama değiştirilmiş olduğundan biraz diğerlerinden farklı görünüyor ve @PathParam kullanır:

@POST
@Path("/create/{param1}/{param2}")
public void create(@PathParam("param1") String param1,
                   @PathParam("param2") String param2) {
    ...
}

İleti parametreleri herhangi bir mesaj içerdiği hariç sorgu parametresi haline benzer.

POST /create/hello/world HTTP/1.1
Content-Length: 0
Host: www.example.com

Bu yöntem, sorgunun parametre sürümü aynı kodlama sıkıntıları paylaşıyor. Dikkat et de var Path segments are encoded differently.


Gördüğünüz gibi, her yöntemin artıları ve eksileri vardır. Seçim genellikle müşteriler tarafından karar verilir. Eğer FORMtabanlı HTML sayfaları hizmet veren, @FormParam kullanın. Eğer müşterileriniz JavaScript HTML5 tabanlı ise, o zaman muhtemelen JAXB tabanlı serileştirme ve JSON nesneleri kullanmak isteyeceksiniz. MessageBodyReader/Writer uygulamaları yanlış gidebilir daha az bir şey için kaçmak gerekli özeni göstermeliyiz. Eğer müvekkiliniz Java tabanlı ama yok iyi bir XML işlemci (örneğin, Android), sonra ben muhtemelen kullanım FORM kodlama beri bir içerik ceset daha kolay oluşturmak ve kodlamak düzgün daha URLs. Umarım mini-wiki bu giriş JAX-RS destekleyen çeşitli yöntemler üzerinde bazı ışık tutuyor.

Not:tam açıklama faiz, aslında Jersey bu özelliğini henüz kullanmadım. JAX-RS JAXB uygulamaları dağıtılan bir takım olduğumuz için de müdahalesi ile ediyorduk ve mobil istemci uzaya hareket ediyor. JSON üzerinde HTML5 (jQuery tabanlı) çözümleri XML çok daha iyi bir seçimdir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Police

    Android Poli

    21 NİSAN 2010
  • TheDroidDemos

    TheDroidDemo

    15 ŞUBAT 2011
  • Xbox

    Xbox

    1 Kasım 2005