如何使PUT请求成为RESTful?

问题描述

使用单个API资源/,我们仅编写了一个处理程序来处理API资源GET上的POST/请求

POST我们用来在数据库中创建资源,通过在请求正文中发送数据

PUT,我们用来更新数据库中的现有资源

RESTful最佳实践表示,我的理解是,处理程序需要为所有请求/GETPOST的API资源(例如PUT)提供服务>

我们希望同一个处理程序处理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'并做更多的逻辑来创建资源。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...