Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用路径和查询参数记录PUT REST调用(无正文)_Java_Spring Restdocs - Fatal编程技术网

Java 使用路径和查询参数记录PUT REST调用(无正文)

Java 使用路径和查询参数记录PUT REST调用(无正文),java,spring-restdocs,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

通过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
在body中呈现(像form参数)?是虫子吗?下面是完整的应用程序示例:

@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
公共类DemoApplicationTests{
@统治
public JUnitRestDocumentation restDocumentation=新的JUnitRestDocumentation();
私有MockMvc-MockMvc;
@自动连线
私有WebApplicationContext上下文;
@以前
公共作废设置(){
this.mockMvc=MockMvcBuilders.webAppContextSetup(this.context)
.apply(文档配置(此.rest文档))
.build();
}
@试验
public void contextLoads()引发异常{
mockMvc.perform(
RestDocumentationRequestBuilders.put(“/posts/{id}/read?currentUser=johndoe”,42))
.andDo(文档(“标记为已读”),路径参数(
参数WithName(“id”)。描述(“职位id”)
)))
.andDo(文件(“标记为已读”),请求参数(
参数WithName(“当前用户”)。说明(“用户的登录ID”)
)));
}
}
如果你学习,你会读到

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

所以问题是,尽管规范在这一部分中不是100%清楚:是否允许发送一个没有请求主体的PUT请求

这是一个问题,如果你问10个开发人员,你会得到11个答案,但是为了处理所有不可预测的问题,Spring REST文档将你的查询参数放在请求体中,只是为了为所有那些稍微更严格的web服务器做准备。;-)

如果你学习,你会读到

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

所以问题是,尽管规范在这一部分中不是100%清楚:是否允许发送一个没有请求主体的PUT请求


这是一个问题,如果你问10个开发人员,你会得到11个答案,但是为了处理所有不可预测的问题,Spring REST文档将你的查询参数放在请求体中,只是为了为所有那些稍微更严格的web服务器做准备。;-)

另外,根据您的端点“@PutMapping({id}/read”)”,我注意到在您的REST文档测试中缺少路径的“/read”部分。

另外,根据您的端点“@PutMapping({id}/read”)”,我注意到在您的REST文档测试“/read”缺少部分路径。

观察良好。观察良好。请参阅,而不是链接到已过时的HTTP规范。RFC非常具体,它声明您将当前表示形式替换为已发送的负载,该负载为空。处理
PUT
请求后,资源也不应有任何表示或表示相同语义的表示(甚至可以是HTTP 204响应)。当然,服务可以自由地将接收到的表示转换为匹配的相等但不同的表示。感谢@mle的解释,我已经尝试在这种情况下使用PATCH方法,Spring REST文档按照预期记录了它(HTTP规范似乎更不愿意在PATCH中存在body)请参阅,而不是链接到过时的HTTP规范。RFC非常具体,它声明您将当前表示替换为您发送的负载,该负载为空。处理
PUT
请求后,资源也不应有任何表示或表示相同语义的表示(甚至可以是HTTP 204响应)。当然,服务可以自由地将接收到的表示转换为匹配的相等但不同的表示。感谢@mle的解释,我已经尝试在这种情况下使用PATCH方法,Spring REST文档按照预期记录了它(HTTP规范似乎更不愿意在PATCH中存在body)