如何使PUT请求保持RESTful?
对于单个API资源如何使PUT请求保持RESTful?,rest,httphandler,Rest,Httphandler,对于单个API资源/,我们只编写了一个处理GET和POSTAPI资源/请求的处理程序 POST我们用来在数据库中创建一个资源,通过在请求体中发送数据 PUT我们用于更新数据库中的现有资源 我的理解是,RESTful最佳实践表明,处理程序需要为所有请求GET,POST和PUT提供API资源(比如/) 我们希望相同的处理程序处理PUT请求,但API资源类似于/1234,其中1234是现有id 从技术上讲,API资源/1234也将映射到处理/的同一处理程序,但是 从RESTful最佳实践来看,/12
/
,我们只编写了一个处理GET
和POST
API资源/
请求的处理程序
POST
我们用来在数据库中创建一个资源,通过在请求体中发送数据
PUT
我们用于更新数据库中的现有资源
我的理解是,RESTful最佳实践表明,处理程序需要为所有请求GET
,POST
和PUT
提供API资源(比如/
)
我们希望相同的处理程序处理PUT
请求,但API资源类似于/1234
,其中1234
是现有id
从技术上讲,API资源/1234
也将映射到处理/
的同一处理程序,但是
从RESTful最佳实践来看,
/1234
是否需要在不将id作为API资源URI的一部分传递的情况下进行处理?像下面这样的
func ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet { // for API resource '/'
p.getProducts(w, r)
return
}
if r.Method == http.MethodPost { // for API resource '/'
p.addProduct(w, r)
return
}
if r.Method == http.MethodPut { // for API resource '/'
p.updateProduct(w, r)
return
}
}
func updateProduct(w http.ResponseWriter, r *http.Request) {
var idString string
decoder := json.NewDecoder(r.Body)
decoder.Decode(idString)
id, err := findID(idString)
// do whatever with id
}
func findID(str string) (int, error) {
dfa := regexp.MustCompile(`/([0-9]+)`)
matches := dfa.FindAllStringSubmatch(str, -1) // returns [][]string
idString := matches[0][1]
id, err := strconv.Atoi(idString)
return id, nil
}
正如我所理解的,你是对的。 对于端点
/
,您有两个可以在没有Id
的情况下处理的调用
一个是POST
,后端将生成您的Id
第二个是获取所有资源的GET
,但这取决于您。可能由于安全原因,您不想列出所有可用资源
一个额外的信息是,
PUT
&“POST”可以使用相同的处理程序,但处理程序中的逻辑必须检查是否提供了“id”,并执行额外的逻辑来创建资源。这在某种程度上是多余的,但您可以也应该这样做。从RESTful的角度来看,您正在创建更一致的信息包—主体。重要的是,您将此添加到呼叫结束点/id
哦,明白了。。。粗粒度资源(/
)应由一个处理程序处理,该处理程序在内部调用另一个处理细粒度资源的处理程序/id
。对吗?如果是,我们是否使用中间件处理程序来处理此类逻辑?您的第二条评论是正确的。端点(/
)请仅用于GET
和'POST'操作。我已使用代码更改更新了查询,其中ServeHTTP
是处理API资源//code>的GET
,PUT
和POST
请求的单个处理程序。对于PUT
请求,我没有从/
重定向到/id
,而是解析请求主体以检索id
。。。请对此进行评论。我认为,您不应该在结束点没有id
的情况下通过PUT
来处理(/
)。正确的终点是(/id
)。REST不提供关于请求处理程序实现的指导;如果你想要“最佳实践”,那么你需要在别处寻找它们。