web-dev-qa-db-fra.com

Spring - La méthode HTTP 405 DELETE n'est pas prise en charge par cette URL

J'ai un problème étrange lors de l'exécution d'une requête HTTP "DELETE" au printemps. 

J'ai une méthode de contrôleur pour laquelle j'ai mappé une demande DELETE à:

    @RequestMapping(value = "/{authorizationUrl}",method=DELETE)
    public void deleteAuthorizationServer(
            @RequestHeader(value="Authorization") String authorization,
            @PathVariable("authorizationUrl") String authorizationUrl)
            throws  IOException {

        System.out.println("TEST");

    }

Le contrôleur est mappé à l'aide de @RequestMapping("/authorization_servers"); Lorsque j'envoie une demande via mon client DEV Http, je reçois la réponse suivante: 405 Http method DELETE is not supported by this URL.

La demande ressemble à ceci:

 DELETE    localhost:8080/authorization_servers/asxas

  Headers:
  Authorization: "test:<stuff>"

Si quelqu'un peut examiner cela et m'aider, je vous en serais reconnaissant

11
Sasanka Panguluri

Cela fonctionnera:

@RequestMapping(value = "/{authorizationUrl}", method = DELETE)
public @ResponseBody void deleteAuthorizationServer(@RequestHeader(value="Authorization") String authorization,
                                                    @PathVariable("authorizationUrl") String authorizationUrl){
    System.out.printf("Testing: You tried to delete %s using %s\n", authorizationUrl, authorization);
}

Il vous manquait @ResponseBody. Votre méthode était en train de se faire appeler; c'est ce qui s'est passé après que cela produise le code d'erreur.

13
Rob Worsnop

Votre annotation devrait ressembler à ceci:

@RequestMapping(value = "/{authorizationUrl}",method=RequestMethod.DELETE)

Je ne sais pas d'où vous avez obtenu cette variable DELETE. :-)

2
jgitter

Si le modèle @RequestMapping ne correspond pas ou est invalid, il en résulte un 404 non trouvé. Cependant, si cela correspond à un autre mappage avec une méthode différente (ex. GET), il en résulte 405 Http method DELETE is not supported.

Mon problème était comme celui-ci, sauf que ma requête était la cause. C'était ça:

@RequestMapping(value = { "/thing/{id:\\d+" }, method = { RequestMethod.DELETE })

Est-ce que tu le vois? L'attelle de fermeture interne est manquante, elle devrait être: { "/thing/{id:\\d+}" } Le \\d+ est une expression régulière permettant de faire correspondre un ou plusieurs chiffres. Les accolades délimitent le paramètre dans le chemin à utiliser avec @PathVariable.

Comme il est invalide, il ne peut pas correspondre à ma demande DELETE: http://example.com/thing/33 Ce qui aurait entraîné une erreur 404 non trouvée, cependant, j'ai eu un autre mappage pour GET:

@RequestMapping(value = { "/thing/{id:\\d+}" }, method = { RequestMethod.GET })

Étant donné que le modèle d'accolade est correct, mais qu'il ne s'agit pas d'une méthode DELETE, la méthode d'erreur 405 n'est pas prise en charge.

J'espère que cela vous aide!

1
David Lotts

assurez-vous également que vous l'appelez avec "Content-Type" header="text/html". Sinon, modifiez-le ou spécifiez-le dans la variable requestMapping. Si cela ne correspond pas, vous obtenez le même 405. 

J'espère que ça aide quelqu'un.

0
Jason