1

使用 Ratpack 脚本构建一个快速而肮脏的 REST API;无法弄清楚如何允许从所有来源删除。

我尝试在 中设置标题delete,并使用all(如示例代码中所示)。使用 curl 发送 DELETE,邮递员,一切总是返回 405。我错过了一些简单的东西吗?

@Grapes([
  @Grab('io.ratpack:ratpack-groovy:1.6.1')
])

ratpack {
    handlers {
        all {
            MutableHeaders headers = response.headers
            headers.set("Access-Control-Allow-Origin", "*")
            headers.set("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE")
            next()
        }

        post("product") {
            ...
        }

        get("product/:id") {
            ...
        }

        delete("product/:productId") {
            // always returns 405
            ...
        }
    }
}
4

1 回答 1

4

您会看到HTTP/1.1 405 Method Not Allowed响应状态,因为您的请求已由get("product/:id")处理程序处理。如果你想为多个 HTTP 方法使用相同的路径,你可以使用prefix结合byMethod方法来为相同的路径定义多个处理程序。

考虑以下示例:

import ratpack.http.MutableHeaders

import static ratpack.groovy.Groovy.ratpack

ratpack {
    handlers {
        all {
            MutableHeaders headers = response.headers
            headers.set("Access-Control-Allow-Origin", "*")
            headers.set("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE")
            next()
        }

        prefix("product") {
            post {
                render("POST /product")
            }

            prefix(":id") {
                path {
                    byMethod {
                        get {
                            render("GET /product/${allPathTokens.id}")
                        }

                        delete {
                            render("DELETE /product/${allPathTokens.id}")
                        }
                    }
                }
            }
        }
    }
}

正如您在上面的示例中看到的,您可以嵌套前缀。我们可以使用以下 curl 请求对其进行测试:

$ curl -X POST http://localhost:5050/product
POST /product%                                                                                                                                                                                                                                 

$ curl -X GET http://localhost:5050/product/test
GET /product/test%                                                                                                                                                                                                                             

$ curl -X DELETE http://localhost:5050/product/test
DELETE /product/test%  

如果您对更多细节感兴趣,我前段时间写了一篇博客文章,其中包含一个类似的示例 - https://e.printstacktrace.blog/using-the-same-prefix-with-different-http-methods-in-鼠包/

于 2019-07-05T18:14:43.773 回答