记录没有正文的PUT REST调用以及路径和查询参数

时间:2018-03-29 16:53:00

标签: java spring-restdocs

通过HTTP PUT设计的REST API调用只有路径和查询参数,不需要正文:

PUT /posts/{id}/read?currentUser={loginId} 

尝试使用Spring REST Docs 2.0.0记录它.RELEASE我注意到http-request.adoc如下:

[source,http,options="nowrap"]
----
PUT /posts/42?currentUser=johndoe HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

currentUser=johndoe
----

我很困惑,为什么currentUser=johndoe在正文中呈现(如表格参数)?这是一个错误吗?下面的完整应用示例:

@RestController
@RequestMapping("/posts")
@SpringBootApplication
public class DemoApplication {

    @PutMapping("{id}/read")
    public void markPostRead(@PathVariable("id") String id, @RequestParam("currentUser") String login) {
        System.out.println("User " + login + " has read post " + id);
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
@RunWith(SpringRunner.class)
@WebMvcTest
public class DemoApplicationTests {

    @Rule
    public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation();
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @Before
    public void setUp() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
                .apply(documentationConfiguration(this.restDocumentation))
                .build();
    }
    @Test
    public void contextLoads() throws Exception {
        mockMvc.perform(
                RestDocumentationRequestBuilders.put("/posts/{id}/read?currentUser=johndoe", 42))
                .andDo(document("mark-as-read", pathParameters(
                        parameterWithName("id").description("ID of the Post")
                )))
                .andDo(document("mark-as-read", requestParameters(
                        parameterWithName("currentUser").description("Login ID of user")
                )));
    }

}

2 个答案:

答案 0 :(得分:2)

如果你学习RFC 2616 with special attention on the PUT section,你会读到......

  

PUT方法请求将封闭实体存储在提供的Request-URI下。

所以问题是,虽然规范在这一部分并非100%明确:是否允许发送没有请求体的PUT请求?

这是你得到11个答案的问题之一,如果你问10个开发人员,但只是对所有不可思议的问题都很好,Spring REST Docs将你的查询参数放在请求体中,只是为了更加严格的那些准备那里的网络服务器。 ; - )

答案 1 :(得分:2)

另外,根据您的终端" @PutMapping(" {id} / read")",我注意到在您的REST文档测试中" / read&# 34;部分路径不见了。