Метод запрещен 405, при выполнении запроса POST после обновления grails с 2.5.2 до 3.3.11 - PullRequest
0 голосов
/ 10 июля 2020

После обновления grails 2.5.2 до 3.3.11 я получаю ответ «Метод запрещен» при выполнении запроса POST. Метод 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;
}
  }

Сопоставление URL-адресов:

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, который не работает?

1 Ответ

1 голос
/ 10 июля 2020

После обновления grails 2.5.2 до 3.3.11 я получаю ответ «Метод запрещен» при выполнении запроса POST. Метод GET работает нормально.

Похоже, у вас есть /OMApi/phase, сопоставленное с действием index в PhaseController, которое настроено с index: 'GET' в allowedMethods, что означает index действие доступно только через запрос 'GET'. Любой другой глагол должен дать результат 405 для этого действия. Если вы хотите разрешить как GET, так и POST для действия index (неясно, почему вы хотите это сделать), измените allowedMethods, включив index: ['GET', 'POST'] вместо index: 'GET'.

Надеюсь, это поможет.

...