Могу ли я разрешить УДАЛИТЬ из всех источников с groovy-dsl? - PullRequest
1 голос
/ 05 июля 2019

Создание быстрого и грязного REST API с помощью скрипта Ratpack;не могу понять, как разрешить УДАЛЕНИЕ из всех источников.

Я пытался установить заголовки в пределах delete и использовать all (как в примере кода.) Отправка DELETE с помощью curl, почтальона, всеговсегда возвращает 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
            ...
        }
    }
}

1 Ответ

4 голосов
/ 05 июля 2019

Вы видите 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-ratpack/

...