首页 文章

无法测试使用Spring Boot开发的REST API

提问于
浏览
0

我正在尝试测试使用Spring Boot创建的REST API . 以下是该方法的签名:

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

以下是模型对象的详细信息:

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

我尝试使用1. chrome Postman和2.简单的http POST表单访问此服务 . 每次我收到错误时:415:不支持的媒体类型 .

编辑:以下是多部分bean的bean配置:

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

我尝试将@RequestBody更改为@RequestParam,但它无法正常工作 . 以下是邮递员的请求预览 .

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

我错过了什么明显的东西?

谢谢

2 回答

  • 1
    @RequestBody CsvUploadModel form
    

    这需要 HttpMessageConverter 存在,可以读取 multipart/form-data 类型的请求有效负载 . 不幸的是Spring目前还没有提供这样的转换器 . 有一个 FormHttpMessageConverter ,但只能读取简单的表单数据( application/x-www-form-urlencoded ) .

    为了使您的方法有效,您应该删除 @RequestBody 注释并为文件添加参数:

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

    绑定表单数据不需要 @RequestBody . 然后,您必须手动设置文件:

    form.setFile(file);
    

    也许有第三方转换器支持读取 multipart/form-data . 我既不使用也不知道 .

  • 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);
           }
     }
    

相关问题