programing

Spring 4.x/3.x (Web MVC) REST API와 JSON2 POST 요청, 어떻게 하면 제대로 할 수 있을까요?

showcode 2023. 3. 21. 22:42
반응형

Spring 4.x/3.x (Web MVC) REST API와 JSON2 POST 요청, 어떻게 하면 제대로 할 수 있을까요?

자세한 내용을 말씀드리기 전에 Stackoverflow에 대해 많은 대화와 관련 질문이 있었다는 것을 알고 있습니다.이 모든 것들이 저에게 다른 방식으로 도움이 되기 때문에 저는 저의 조사 결과를 정리한 하나의 FAQ로 정리했습니다.

관련 개념

물론 당신은 이것에 대해 알고 있겠지만, 나는 단지 간단한 리뷰로 그것들을 쓸 뿐이다.제가 부족한 부분이 있으면 자유롭게 편집해 주세요.

HTTP POST 요구:

게시 요청은 웹 서비스 또는 서버 측 응용 프로그램에 개체를 보낼 때 사용됩니다.

시리얼화:

웹 브라우저에서 서버 측 응용 프로그램으로 개체를 가져오는 프로세스입니다.jQuery Ajax 콜 또는 Curl Post 요청을 사용할 수 있습니다.

시리얼화 프로토콜:

최근 가장 인기 있는 것은 JSON과 XML입니다.XML 태그의 특성상 직렬화된 XML 객체의 크기가 상대적으로 커짐에 따라 XML의 인기는 낮아지고 있습니다.이 FAQ에서는 JSON2의 시리얼화에 중점을 두고 있습니다.

봄:

스프링 프레임워크와 그 강력한 주석을 통해 웹 서비스를 효율적으로 노출할 수 있습니다.봄에는 많은 다른 도서관들이 있습니다.저희가 주목하고 있는 것은 Spring Web MVC입니다.

컬 vs JQuery:

이것들은, 클라이언트측에서 투고 요구에 사용할 수 있는 툴입니다.JQuery ajax 콜을 사용할 예정이라도 Post Request 후 Curl을 통해 자세한 응답을 얻을 수 있으므로 디버깅을 위해 Curl을 사용하는 것이 좋습니다.

@RequestBody vs @RequestParam/@PathVariable vs @ModelAttribute:

Java EE 모델에 의존하지 않는 웹 서비스가 있는 경우 @RequestBody를 사용해야 합니다.모델을 사용하고 있고 JSON 개체가 모델에 추가된 경우 @ModelAttribute를 통해 개체에 액세스할 수 있습니다.요청이 GET 요청 또는 GET 및 POST 요청 조합인 경우에만 @RequestParam/@PathVariable을 사용해야 합니다.

@RequestBody vs @ResposeBody:

이름에서 알 수 있듯이 @ResponseBody는 서버 측 메서드가 요청을 처리한 후 클라이언트에 응답을 보내는 경우에만 필요합니다.

RequestMappingHandlerAdapter vs AnnotationMethodHandlerAdapter:

RequestMappingHandlerAdapter는 스프링 3.1 이후 AnnotationMethodHandlerAdapter를 대체하는 스프링 프레임워크의 새로운 매핑핸들러입니다기존 설정이 아직 AnnotationMethodHandlerAdapter에 있는 경우 이 게시물이 유용할 수 있습니다.제 투고에 기재되어 있는 설정을 통해 Request Mapping Handler Adapter를 설정하는 방법을 알 수 있습니다.

세우다

메시지 변환기를 설정해야 합니다.이렇게 하면 서버 측에서 직렬화된 JSON 메시지 본문이 로컬 Java 개체로 변환됩니다.

여기서부터의 기본 설정.컨버터는 기본 설정 예에서 MarshallingHttpMessageConverter와 CastorMarshaller로 되어 있으며 MappingJackson2로 대체되어 있습니다.HttpMessageConverter 및 MappingJacksonHttpMessageConverter.

구성을 저장할 위치

프로젝트 셋업 방법에는 다음 두 가지 설정 파일이 있습니다.

  • 응용 프로그램콘텍스트 XML: 첫 번째는 sessionFactory bean, dataSource bean 등이 있는 응용 프로그램콘텍스트 XML 파일입니다
  • MVC Dispatcher Servlet XML: 뷰 리졸바 빈을 사용하여 응용 프로그램 컨텍스트 XML을 가져옵니다.

hadlerAdapter bean은 MVC Dispatcher XML 파일보다 나중에 배치해야 합니다.

<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>

여러 개의 메시지 변환기를 사용할 수 있습니다.여기에서는 JSON 2 메시지컨버터뿐만 아니라 일반 JSON도 만들었습니다.XML 파일의 Ref 형식과 normal bean 형식이 모두 사용되었습니다(개인적으로는 ref 태그가 네이터로 선호됩니다).

REST API

다음은 REST API를 공개하는 샘플컨트롤러입니다

컨트롤러

여기서 HTTP 포스트 요청에 대한 REST API가 노출됩니다.

@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 오브젝트

@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 투고 콜

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

관련 투고 및 질문

이 FAQ는 다음 투고와 질문을 제공한 모든 사람이 아니면 가능하지 않습니다(이 목록은 유용한 관련 투고/질문을 접하게 되면 확대됩니다).

  1. 올바른 JSON 콘텐츠 유형은 무엇입니까?
  2. Jackson 메시지 컨버터를 사용한 JSON 응답 생성 Spring 3.0
  3. 터미널/명령줄에서 Spring REST 테스트에 컬을 사용하여 JSON 데이터를 게시하는 방법은 무엇입니까?
  4. REST API에 JSON 게시
  5. https://github.com/geowarin/spring-mvc-examples
  6. JSON을 PHP에 컬로 게시하는 방법
  7. Spring REST | MappingJacksonHttpMessageConverter가 비활성 JSON을 생성함
  8. https://github.com/eugenp/REST
  9. Spring Web MVC - 개별 요청 매개 변수 검증
  10. 터미널/명령줄에서 Spring REST 테스트에 컬을 사용하여 JSON 데이터를 게시하는 방법은 무엇입니까?
  11. Java Servlet에서 JSON 개체를 반환하려면 어떻게 해야 합니까?
  12. REST API에 의해 JSON이 반환되는 경우 MIME 유형은 무엇입니까?

CURL 투고 콜

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

다른 오류 시나리오:

여기에서는, 컬 콜 후에 발생할 가능성이 있는 에러나, 무엇이 잘못되었을 가능성이 있는지를 설명합니다.

시나리오 1:

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

이는 REST API가 사용자가 제공한 URL에 존재하지 않음을 의미합니다.

Root cause:
  • 당신의 요청에 오타가 있을 수 있습니다(믿을 수 있습니다).
  • 스프링 구성이 올바르지 않을 수 있습니다.이 경우 실제로 무엇이 잘못되었는지 더 자세히 조사할 필요가 있지만, 보다 정교한 조사를 시작하기 전에 해야 할 몇 가지 초기 조치를 제공했습니다.
Actions:

모든 것이 완벽하게 완료되고 구성에 문제가 없는지 확인한 후, 또는 URL: - maven clean을 실행합니다.- 웹 앱의 배포를 취소하거나 간단히 삭제하십시오. - 웹 앱을 다시 배포합니다. - Maven/gradle에서 Spring 버전을 하나만 사용하십시오.

시나리오 2:

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

유일한 이유는 요청 형식이 올바르지 않기 때문입니다.자세한 컬 응답을 체크 아웃하면 "The request by client sended internatically internatically internatically"가 표시됩니다.

Root cause:

JSON 형식이 올바르지 않거나 JAVA 개체의 필수 매개 변수가 누락되었습니다.

Actions:

JSON 개체를 올바른 형식과 올바른 매개 변수 수로 제공해야 합니다.Nullable 속성은 필수는 아니지만 모든 Not Nullable 속성에 대한 데이터를 제공해야 합니다.Spring은 Java Reflection을 사용하여 JSON 파일을 Java 객체로 변환하고 있다는 것을 기억하는 것이 매우 중요합니다.이것은 매우 중요합니다.변수 및 메서드 이름이 CasE SensItiVe임을 의미합니다.JSON 파일이 변수 "userName"을 보내는 경우 Java 개체 내의 일치하는 변수도 "userName"으로 지정해야 합니다.게터나 세터도 같은 규칙을 따라야 합니다.getUserName 및 setUserName은 위의 예와 일치합니다.

세나리오 3:

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
Root cause:

Json 미디어 유형이 웹 서비스에서 지원되지 않습니다.이는 주석이 미디어 유형을 지정하지 않았거나 Curl post 명령에서 미디어 유형을 지정하지 않았기 때문일 수 있습니다.

Actions:

메시지 변환기가 올바르게 설정되어 있는지 확인하고 웹 서비스 주석이 위의 예와 일치하는지 확인하십시오.이상이 없으면 Curl Post 요청에서 content-type을 지정해야 합니다.

json 미디어 유형이 웹 서비스에서 지원되지 않습니다.

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 

사용자가 실제로 서버측 REST API로 전송된 것을 축하드립니다.

스프링 체크 아웃 설정 방법에 대한 자세한 내용은 스프링 MVC 가이드를 참조하십시오.

관련 투고 및 질문

이 FAQ는 다음 투고와 질문을 제공한 모든 사람이 아니면 가능하지 않습니다(이 목록은 유용한 관련 투고/질문을 접하게 되면 확대됩니다).

  1. 올바른 JSON 콘텐츠 유형은 무엇입니까?
  2. Jackson 메시지 컨버터를 사용한 JSON 응답 생성 Spring 3.0
  3. 터미널/명령줄에서 Spring REST 테스트에 컬을 사용하여 JSON 데이터를 게시하는 방법은 무엇입니까?
  4. REST API에 JSON 게시
  5. https://github.com/geowarin/spring-mvc-examples
  6. JSON을 PHP에 컬로 게시하는 방법
  7. Spring REST | MappingJacksonHttpMessageConverter가 비활성 JSON을 생성함
  8. https://github.com/eugenp/REST
  9. Spring Web MVC - 개별 요청 매개 변수 검증
  10. 터미널/명령줄에서 Spring REST 테스트에 컬을 사용하여 JSON 데이터를 게시하는 방법은 무엇입니까?
  11. Java Servlet에서 JSON 개체를 반환하려면 어떻게 해야 합니까?
  12. REST API에 의해 JSON이 반환되는 경우 MIME 유형은 무엇입니까?

콩 클래스는 1개의 필드에 대해 2개 이상의 세터가 있는 경우에는 처리할 수 없다는 점에 주의해 주십시오.@JsonIgnore선택 사항으로.스프링/잭슨 던지기HttpMediaTypeNotSupportedException및 http status 415 Unsupported Media Type 입니다.

예:

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

업데이트 : 또한 지정해야 합니다.@JsonGetter그리고.@JsonSetter이 경우 리턴 타입으로 사용할 때 문제가 발생하지 않도록 합니다.

방금 Spring 3.2.2와 Jackson 2.2로 테스트했습니다.파라미터로서 정상적으로 동작합니다(@RequestBody및/또는 반환 유형(또는 둘 다)@ResponseBody).

업데이트 2:

한다면@JsonGetter그리고.@JsonSetter지정되어 있습니다.@JsonIgnore필요하지 않은 것 같습니다.

언급URL : https://stackoverflow.com/questions/16909742/spring-4-x-3-x-web-mvc-rest-api-and-json2-post-requests-how-to-get-it-right-o

반응형