【问题标题】:Method Not Allowed 405, when hitting POST request after grails uprgade from 2.5.2 to 3.3.11Method Not Allowed 405,当 grails 从 2.5.2 升级到 3.3.11 后点击 POST 请求
【发布时间】:2020-07-10 03:23:33
【问题描述】:

将 grails 2.5.2 升级到 3.3.11 后,我在点击 POST 请求时收到 Method Not Allowed 响应。 GET 方法工作正常。

控制器:

package omapi

import grails.rest.RestfulController
import org.springframework.http.HttpStatus

import static org.springframework.http.HttpStatus.NOT_FOUND
import static org.springframework.http.HttpStatus.NO_CONTENT

class PhaseController extends RestfulController {

PhaseController(){
    super(Phase)
}

static responseFormats = ['json', 'xml']
static allowedMethods = [show:  'GET', index:'GET',productAcronym:'GET', phaseByName: 'GET',save:'POST',update:'PUT',delete:'DELETE', deleteGroup: 'DELETE', deletePhase: 'DELETE']

def phaseService

def index(){
    def phases = phaseService.getAllPhases()
    respond phases
}

def show(){
    def phase = phaseService.getPhaseById(params.id)
    respond phase
}

def phaseByName(){
    def phase = phaseService.getPhaseByName(params?.name)
    respond phase
}

def productAcronym() {
    def phase = phaseService.getPhaseByProductAcronym(params?.acronym)
    log.info("==== phase by product Acronym =====$params.acronym==");
    respond phase;
}
  }

网址映射:

package omapi

import grails.core.GrailsApplication
import java.nio.file.AccessDeniedException

class UrlMappings {

    static mappings = {

        "/applications/$id/processingGroup"(controller: "application",action: "processingGroup")
        "/accounts/$id/applications/"(controller: "accounts", action: "applications")
        "/accounts/$aId/application/$id/products/"(controller: "application", action: "products")
        "/ftpServer/connection"(controller: 'ftpServer', action: 'testConnection')
        "/application/$id/jobs/"(controller: "job",action: "jobByApplication")
        "/application/cycleDates"(controller: "cycleDates",action: "getCycleDatesByApplication")
        "/ProcessingBranch/branch/"(controller: "processingTicketBranch",action: "branch")

        "/application/$appCode/Offset"(controller: "ReportClientOffset",action: "offsetValue")
        "/$controller/$action?/$id?(.$format)?"{
            constraints {
                // apply constraints here
            }
        }
        "/$controller/$id"(parseRequest: true){
            action = [GET:"show",PUT:"update",POST:"404",DELETE:"delete"]
            constraints {
                id matches: /\d+/
            }
        }

        "/$controller"{
            action = [GET:"index",POST: "save",PUT:"update",DELETE:"delete"]
            constraints {
            }
        }

        "/"(view:"/index")
        "403"(controller: "error", action: "error403")
        "404"(controller: "error", action: "error404")
        "409"(controller: "error", action: "error409")
        "500"(controller: "error", action: "error500")
        "500"(controller: "error", action: "error403", exception: AccessDeniedException)
    }
}

请求:[POST] localhost:5555/OMApi/phase

回复:

{
    "timestamp": 1594295030496,
    "status": 405,
    "error": "Method Not Allowed",
    "message": "No message available",
    "path": "/OMApi/phase"
}

对于 grails 2.5.2,一切正常。它看起来像一个与 Spring 相关的问题。关于这个问题的所有搜索都没有结果。任何想法?是因为 UrlMapping 中的一些错误还是 CORS 拦截器无法正常工作等其他问题?

【问题讨论】:

    标签: spring grails grails-3.3.x


    【解决方案1】:

    将 grails 2.5.2 升级到 3.3.11 后,我得到 Method Not 击中 POST 请求时允许响应。 GET 方法有效 很好。

    看起来您已将/OMApi/phase 映射到PhaseController 中的index 操作,该操作在allowedMethods 中配置了index: 'GET',这意味着index 操作只能通过'GET' 请求访问。任何其他动词都应导致该操作的 405。如果您想同时允许 GETPOST 执行 index 操作(不清楚为什么要这样做),请将您的 allowedMethods 更改为包含 index: ['GET', 'POST'] 而不是 index: 'GET'

    希望对你有帮助。

    【讨论】:

    • 另外,如果你想允许任何动词(不仅仅是GETPOST),那么你可以简单地从allowedMethods中删除index:条目。
    • 谢谢@Jeff Scott Brown 的回答。带有上述allowedMethods 映射的请求/OMAPI/phase 对于grails 2.5.2 中的GET POST 方法工作正常。将 grails 升级到 3.3.11 后出现此问题。在 grails 2.5.2 和 3.3.11 中定义 allowedMethods 有什么区别吗?你能建议任何文件吗?我找不到任何东西。
    • 没有看到演示问题的项目,我无法确定为什么它在 2.5.2 中起作用或看起来有所不同,但您在 3.3.11 中看到的行为是设计使然。文档位于docs.grails.org/3.3.11/ref/Controllers/allowedMethods.html。当我最初编写 allowedMethods 的东西时,它都是由过滤器完成的。后来我重写了它以在编译时进行配置。我不记得那是在 2.5 之前还是之后。我试图重新创建您引用的 2.5.2 行为,但我不能,所以我认为还有其他一些因素。抱歉,我无法提供更多帮助。
    • 你知道有什么方法可以让/OMApi/phaseGETPOST 方法工作吗?如果请求/OMApi/phase POST,那么它将转到保存方法,如果请求GET /OMApi/phase,它将转到索引方法。我正在我的相位控制器中扩展 RestfulController。如果我创建新的 grails 3.3.11 应用程序,上述方案工作正常,但我的 grails 应用程序不允许使用方法(从 2.5.2 升级到 3.3.11)
    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 2016-12-04
    • 1970-01-01
    • 2015-03-09
    • 2014-09-03
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多