如何使PUT请求保持RESTful?

如何使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

对于单个API资源
/
,我们只编写了一个处理
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不提供关于请求处理程序实现的指导;如果你想要“最佳实践”,那么你需要在别处寻找它们。