1

将 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 拦截器无法正常工作等其他问题?

4

1 回答 1

1

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

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

我希望这会有所帮助。

于 2020-07-10T13:29:15.223 回答