2014-09-15 3 views
0

스프링 부트로 작성한 REST API를 테스트하려고합니다.스프링 부트로 개발 된 REST API를 테스트 할 수 없습니다.

@RequestMapping(consumes = "multipart/form-data", method = RequestMethod.POST) 
    public Response<String> upload(@RequestBody CsvUploadModel form) { 

다음 모델 개체의 세부 사항은 다음과 같습니다 : 메소드의 서명은 다음 내가 1 크롬 이죠 2. 간단한 HTTP의 POST 양식을 사용하여이 서비스에 액세스 시도

private char separator; 
    private char quoteCharacter; 
    private String metricName; 
    private String groupName; 
    private MultipartFile file; 
//getters and setters 

. 오류가 발생할 때마다 : 415 : 지원되지 않는 미디어 유형.

편집 :

/** 
    * Allow file uploads 
    * 
    * @return 
    */ 
    @Bean 
    public MultipartConfigElement multipartConfigElement() { 
     MultiPartConfigFactory factory = new MultiPartConfigFactory(); 
     factory.setMaxFileSize("500MB"); 
     factory.setMaxRequestSize("500MB"); 
     return factory.createMultipartConfig(); 
    } 

    /** 
    * Get the multipart resolver 
    * 
    * @return 
    */ 
    @Bean 
    public MultipartResolver multipartResolver() { 
     return new CommonsMultipartResolver(); 
    } 

내가 @RequestParam에 @RequestBody를 변경 시도했지만 작동하지 않았다 : 다음은 멀티 파트 빈의 빈 구성입니다. 다음은 우편 배달부의 요청 미리보기입니다.

POST /dev/wizard/upload HTTP/1.1 
Host: localhost:10022 
Cache-Control: no-cache 

----WebKitFormBoundaryE19zNvXGzXaLvS5C 
Content-Disposition: form-data; name="metricName" 

test 
----WebKitFormBoundaryE19zNvXGzXaLvS5C 
Content-Disposition: form-data; name="separator" 

, 
----WebKitFormBoundaryE19zNvXGzXaLvS5C 

내가 뭘 놓치고 있습니까?

감사

+0

임베디드 Tomcat을 사용하고 있습니까? MultipartConfigElement 빈을 작성하고 있습니까? – gyoder

+0

임베디드 부두를 사용 중입니다. 예, MultiPartConfigElementBean을 만들고 있습니다. 나는 그 질문에 같은 것을 추가했다. – user3968762

+0

내가 너라면, 모델 객체에서 MultipartFile을 나눠서 @RequestParam ("file") MultipartFile 파일로 다시 전달해 보겠습니다. – gyoder

답변

0
@RequestBody CsvUploadModel form 

는이 유형 multipart/form-data의 요청 페이로드를 읽을 수 있어야하는 HttpMessageConverter이 필요합니다. 아쉽게도 Spring은 현재 이러한 변환기를 제공하지 않습니다. FormHttpMessageConverter이 있지만 간단한 양식 데이터 (application/x-www-form-urlencoded) 만 읽을 수 있습니다. 위해

당신이 @RequestBody 주석을 제거하고 파일의 매개 변수를 추가해야 작업을 당신의 방법을 얻을 수 있습니다 :

upload(CsvUploadModel form, @RequestParameter(required=false) MultipartFile file) 

@RequestBody는 폼 데이터 바인딩 필요하지 않습니다. 그런 다음 파일을 수동으로 설정해야합니다 :

form.setFile(file); 

어쩌면 multipart/form-data을 읽기를 지원 타사 계산기가있다. 또한 나는 어떤 것도 사용하거나 알지 못한다.

+0

@RequestBody 주석을 제거하여 작동하도록 관리합니다. – user3968762

0

시도 개조

<dependency> 
    <groupId>com.squareup.retrofit</groupId> 
    <artifactId>retrofit</artifactId> 
    <version>1.6.1</version> 
</dependency> 

.

import retrofit.http.Body; 
import retrofit.http.POST; 

public interface IRestController { 

     @POST("/api-name") 
     public Response api(@Body Request request); 
} 

.

import static org.junit.Assert.assertNotNull; 
import org.junit.Test; 
import retrofit.RestAdapter; 

public class TestRestAPI { 

     private static final String SERVER = "http://localhost:8080"; 

     private IRestController service = new RestAdapter.Builder() 
              .setEndpoint(SERVER).build() 
              .create(IRestController.class); 

     @Test 
     public void basicTest(){  
       Response response = service.api(new Request()); 
       assertNotNull(response); 
     } 
} 
관련 문제