Bahar 4.x / 3.X (Web MVC) REST API ve JSON2 Post istekleri, herkes için doğru bir kez nasıl alınır?

ayrıntılara girmeden önce, stackoverflow hakkında çok sayıda konuşma ve ilgili soru olduğunu biliyorum. Hepsi bana farklı şekillerde yardım ediyor, bu yüzden bulgularımı özetlemek için bulgularımı tek bir organize SSS olarak bir araya getirdiğimi düşündüm.

İlgili Kavramlar

elbette bunları biliyorsunuz ama sadece hızlı bir inceleme olarak yazıyorum. Bir şeyi kaçırırsam düzenleme yapmaktan çekinmeyin.

HTTP POST İstek:

bir Web hizmetine veya sunucu tarafı uygulamasına bir nesne göndermeye istekli olduğunuzda bir posta isteği kullanılır.

Serileştirme:

, nesneyi web tarayıcınızdan sunucu tarafı uygulamanıza alma işlemidir. JQuery Ajax çağrısı veya Curl post isteği kullanılabilir.

seri hale getirme protokolleri:

en popüler olanlar tezler gün vardır JSON ve XML. XML, seri hale getirilmiş xml nesneleri XML etiketleme doğası nedeniyle boyutu nispeten daha büyük olduğu için daha az popüler hale geliyor. Bu SSS ana odak JSON2 seri hale getirilmesidir.

Yay:

Bahar çerçeve ve güçlü açıklama mümkün verimli bir şekilde web hizmeti ortaya çıkarmak için yapar. İlkbaharda birçok farklı kütüphane var. Buradaki Odak noktamız Spring web MVC .

Curl vs JQuery:

bunlar, müşteri tarafınızda bir mesaj isteği yapmak için kullanabileceğiniz araçlardır. JQuery ajax çağrısını kullanmayı planlıyorsanız bile, posta isteğini yaptıktan sonra ayrıntılı bir yanıt sağladığından hata ayıklama amacıyla Curl kullanmanızı öneririm.

@RequestBody [email protected]/@PathVariable vs @ ModelAttribute:

bir web hizmeti olduğu durumlarda Java EE modelinize bağlı değildir, @RequestBody kullanılmalıdır. Modeli kullanıyorsanız ve json nesne modeli eklenir, aracılığıyla nesneye erişebilirsiniz @ ModelAttribute . Yalnızca isteğinizin GET isteği veya GET ve POST isteği kombinasyonu olduğu durumlarda, @RequestParam/@PathVariable kullanmanız gerekecektir.

@Requestbody vs @ResposeBody:

adından da görebileceğiniz gibi bu kadar basit, sadece ihtiyacınız @ ResponseBody sunucu tarafı yöntemi isteği işledikten sonra istemci yanıt gönderiyorsanız .

RequestMappingHandlerAdapter vs AnnotationMethodHandlerAdapter:

Requestmappinghandleradapter Bahar 3.1 beri AnnotationMethodHandlerAdapter yerini Bahar çerçevesi için yeni haritalama işleyicisi olduğunu. Varolan yapılandırmanız hala AnnotationMethodHandlerAdapter ise, bu yazıyı yararlı bulabilirsiniz. Sağlanan yapılandırma yazımda size Requestmappinghandleradapter'ı nasıl kuracağınıza dair bir fikir verecektir.

,

bir mesaj dönüştürücü kurmanız gerekecek. Tefrika JSON mesaj vücudunuzun yerel bir java nesnesine sunucu yanında dönüştürülür.

temel yapılandırma burada . Konvertörler, temel yapılandırmasında MarshallingHttpMessageConverter ve CastorMarshaller idi örnek , onları mappingjackson2httpmessageconverter ve mappingjacksonhttpmessageconverter ile değiştirdim.

konfigürasyonu nereye koyulur

projemin kurulum şekli, iki yapılandırma dosyam var:

  • uygulama bağlamı XML: Bir uygulama bağlam XML dosyası nerede sessionFactory fasulye, dataSource fasulye, vb. bulunurlar.
  • MVC dağıtıcı Servlet XML: Görünüm çözümleyici fasulye var ve uygulama bağlamı XML içe burası.

hadlerAdapter fasulye MVC Dispatcher XML dosyası daha sonra bulunması gerekir.

<bean name="handlerAdapter"
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
            <ref bean="jsonConverter"/>

        </list>

    </property>
    <property name="requireSession" value="false"/>

</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json"/>
</bean>

birden fazla mesaj dönüştürücü olabilir. burada, normal bir JSON ve bir JSON 2 mesaj dönüştürücü oluşturdum. Hem REF hem de XML dosyasındaki normal fasulye biçimi kullanılmıştır (şahsen ref etiketini neater olarak tercih ederim).

REST API

burada REST API'sini açığa çıkaran bir örnek denetleyicidir.

kontrolör

bir HTTP post isteği için REST API'SİNİN maruz kaldığı yerdir.

@Component
@Controller
@RequestMapping("/api/user")
public class UserController {
@RequestMapping(value = "/add", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String insertUser(@RequestBody final User user) {
    System.out.println(user.toString());
    userService.insertUser(user);
    String userAdded = "User-> {" + user.toString() + "} is added";
    System.out.println(userAdded);
        return userAdded;
    }
}

Java Nesnesi

@JsonAutoDetect
public class User {

private int id;
private String username;
private String name;
private String lastName;
private String email;

public int getId() {
    return externalId;
}

public void setId(final int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(final String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(final String email) {
    this.email = email;
}
public String getUsername() {
    return username;
}

public void setUsername(final String username) {
    this.username = username;
}

public String getLastName() {
    return lastName;
}

public void setLastName(final String lastName) {
    this.lastName = lastName;
}

@Override
public String toString() {
    return this.getName() + " | " + this.getLastName()  + " | " + this.getEmail()
            + " | " + this.getUsername()  + " | " + this.getId()  + " | ";
    }

}

CURL Post call

curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add

ilgili mesajlar ve sorular

bu SSS değildi aşağıdaki gönderileri ve soruları veren tüm insanlar için değilse mümkündür (yararlı ilgili gönderilerle / sorularla karşılaşırsam bu liste genişleyecektir):

  1. doğru json içerik türü nedir?
  2. bahar 3.0 jackson mesaj dönüştürücü kullanarak json yanıt yapma
  3. Json verilerini Curl ile nasıl YAYINLAYABİLİRİM Yay İSTİRAHATINI Test etmek için Terminal/komut satırı?
  4. 'JSON
  5. https://github.com/geowarin/spring-mvc-examples
  6. json'u curl ile PHP'YE nasıl gönderebilirim
  7. Bahar dinlenme / MappingJacksonHttpMessageConverter geçersiz json üretir
  8. https://github.com/eugenp/REST
  9. Spring Web MVC - validate individual request params
  10. Yay dayanağını Test etmek için Terminal/komut satırından Curl ile Json verilerini nasıl YAYINLAYABİLİRİM?
  11. bir Java Servlet
  12. dan bir Json nesnesini nasıl döndürüyorsunuz
  13. JSON döndürülürse hangi MIME türü dinlenmeye mi?
40
tarihinde sordu Community 2013-06-04 08:18:19
kaynak

2 ответов

CURL Post call

curl -i -H "Content-Type: application/json" -X POST -d '{"id":100,"username":"JohnBlog","name":"John","lastName":"Blog","email":"[email protected]"}' http://localhost:8080/[YOURWEBAPP]/api/user/add

Farklı Hata Senaryoları:

Bir şey düzgün çalışmıyor ve ne olduğundan emin değiliz.

Senaryo Bir:

HTTP/1.1 404 Not Found
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 949
Date: Tue, 04 Jun 2013 02:59:35 GMT

bu, REST API'SİNİN sağladığınız URL'de bulunmadığı anlamına gelir.

Kök nedeni:
  • bir yazım hatası olabilir istek (inan bana bu olabilir)!
  • bahar yapılandırmanızın doğru olmadığı olabilir. Eğer durum buysa, aslında neyin yanlış gittiğini daha da araştırmak gerekir, ancak daha karmaşık soruşturmaya başlamadan önce yapmanız gereken bazı ilk eylemleri sağladım.
Eylem:

her şeyin mükemmel bir şekilde doğru yapıldığından ve Yapılandırmanızla ilgili hiçbir şeyin yanlış olmadığından emin olduktan sonra ne de URL: - Koş. maven temiz. - Web app Undeploy veya sadece silin. - Web app Redeploy - Senin maven/gradle

Bahar sadece bir sürümünü kullandığınızdan emin olun

Senaryo İki:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 968
Date: Tue, 04 Jun 2013 03:08:05 GMT
Connection: close

bunun arkasındaki tek sebep, isteğinizin doğru biçimlendirilmemesi gerçeğidir. Ayrıntılı kıvırma yanıtını kontrol ederseniz, istemci tarafından gönderilen isteğin sözdizimsel olarak yanlış olduğunu " görebilmelisiniz.".

Kök nedeni:

ya JSON biçiminiz doğru değil veya JAVA nesnesi için zorunlu bir parametre eksik.

Eylem:

JSON nesnesini doğru biçimde ve doğru sayıda parametreyle sağladığınızdan emin olun. Null özellikler zorunlu değildir ama tüm NotNullable özellikleri için veri sağlamak için var. Json dosyanızı Java nesnelerine dönüştürmek için Java yansıması kullandığını hatırlamak çok önemlidir, bu ne anlama geliyor? bu değişken ve Yöntem anlamına gelir isimler büyük / küçük harf duyarlıdır. Json dosyanız "kullanıcı adı" değişkenini Gönderiyorsa, Java nesnenizdeki eşleşen değişkenin de "kullanıcı adı"olarak adlandırılması gerekir. Eğer getters ve setters varsa, onlar da aynı kuralı takip etmek zorunda. getUserName ve setusername önceki örneğimizle eşleşecek.

Senario Üç:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT
Kök nedeni:

json medya türü web hizmetiniz tarafından desteklenmiyor. Bu, açıklama belirtmemeniz nedeniyle olabilir medya türü veya Curl post komutundaki ortam türünü belirtmiyorsunuz.

Eylem:

mesaj dönüştürücünüzün doğru şekilde ayarlandığını kontrol edin ve web hizmeti ek açıklamasının yukarıdaki örnekle eşleştiğinden emin olun. Bunlar iyi olsaydı, Curl post isteğinizde içerik türünü belirttiğinizden emin olun.

json medya türü web hizmetiniz tarafından desteklenmiyor.

Senario N (!):

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Content-Type: application/json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Tue, 04 Jun 2013 03:06:16 GMT 

Tebrikler kullanıcı aslında sunucu tarafı REST API'SİNE gönderilir.

bahar mvc kılavuzunda bahar nasıl kurulacağı hakkında daha fazla bilgi için.

ilgili mesajlar ve sorular

bu SSS, aşağıdaki gönderileri ve soruları veren tüm insanlar için değilse mümkün değildi (bu liste yararlı ilgili gönderilerle/sorularla karşılaşırsam genişleyecektir):

  1. nedir doğru json içerik türü?
  2. bahar 3.0' json tepki kullanarak jackson mesaj dönüştürücü
  3. Yay dayanağını Test etmek için Terminal/komut satırından Curl ile Json verilerini nasıl YAYINLAYABİLİRİM?
  4. 'JSON
  5. https://github.com/geowarin/spring-mvc-examples
  6. json'u curl ile PHP'YE nasıl gönderebilirim
  7. Bahar dinlenme / MappingJacksonHttpMessageConverter geçersiz json üretir
  8. https://github.com/eugenp/REST
  9. Spring Web MVC - validate individual request params
  10. JSON verilerini nasıl YAYINLAYABİLİRİM Yay İSTİRAHATINI Test etmek için Terminal / komut satırından kıvırın mı?
  11. bir Java Servlet
  12. den bir Json nesnesini nasıl döndürüyorsunuz
  13. JSON bir REST API'si tarafından döndürülürse hangi MIME türü?
11
cevap AmirHd 2017-05-23 15:16:56
kaynak

, bir fasulye sınıfının @JsonIgnore olmadan bir alan için 2 veya daha fazla ayarlayıcı varsa ele alınabileceğini fark etmek iyi olmalıdır.isteğe bağlı olanlar. İlkbahar/Jackson at HttpMediaTypeNotSupportedException ve http durum 415 Desteklenmeyen Medya Türü.

örnek:

@JsonGetter
public String getStatus() {
    return this.status;
}

@JsonSetter
public void setStatus(String status) {
    this.status = status;
}

@JsonIgnore
public void setStatus(StatusEnum status) {
    if (status == null) {
        throw new NullPointerException();
    }

    this.status = status.toString();
}

güncelleme: Biz de belirtmek zorunda @JsonGetter ve @JsonSetter bu durumda, değil var dönüş türü olarak kullanıldıĞında sorunlar.

sadece Bahar 3.2.2 ve Jackson 2.2 ile test etti. Parametre ( @RequestBody ) ve/veya dönüş türü ( @ResponseBody ) olarak iyi çalışır.

güncelleme 2:

@JsonGetter ve @JsonSetter belirtilmişse, @JsonIgnore gerekli değil gibi görünüyor.

1
cevap Ludovic Guillaume 2013-06-05 14:52:59
kaynak

Diğer sorular json java spring curl html-post