PUT et POST obtenant une erreur de méthode 405 non autorisée pour les services Web inactifs

J’essaie de configurer un service Web reposant simple qui renvoie JSON ou XML en fonction de l’en-tête Accepter. J’utilise Spring, Maven et WebLogic Server. J’ai pris l’exemple de cet article http://software.sawano.se/2012/03/combining-json-and-xml-in-restful-web.html et j’ai essayé de l’améliorer. GET et DELETE fonctionnent à la fois en JSON et en XML.Mais PUT et POST génèrent une erreur “Méthode 405 non autorisée”. J’essaie de tester cela avec le client de repos avancé Chrome Extension. ci-dessous sont les en-têtes de réponse.

Status 405 Method Not Allowed Show explanation Loading time: 327 Request headers Accept: Application/json Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Response headers Connection: close Date: Tue, 11 Feb 2014 15:17:24 GMT Content-Length: 34 Content-Type: text/html Allow: GET, DELETE X-Powered-By: Servlet/2.5 JSP/2.1 Raw Parsed 

le corps de la demande que je donne est ci-dessous:

 { id: 1 name: "manga" } 

Ma classe de contrôleurs est illustrée ci-dessous:

 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.HashSet; import java.util.Set; @Controller @RequestMapping("/users") public class RESTController { Userlist obj2; boolean flag=false; private Logger logger = LoggerFactory.getLogger(getClass()); @RequestMapping(value = "/{id}",method = RequestMethod.GET) @ResponseBody public User getUser(@PathVariable int id, @RequestHeader("Accept") Ssortingng acceptHeader) { User temp = new User(); if(obj2==null) { temp= new User(0, "Null"); } else { Set set1= obj2.getUsers(); for(User a:set1) { if(id==a.getId()) temp=a; } } logger.trace("Serving resource for Accept header: {}", acceptHeader); return temp; } @RequestMapping(value="",method = RequestMethod.GET) @ResponseBody public Userlist getUsers(){ if(flag==false){ User new1=new User(1,"Rob"); User new2=new User(2,"VAN"); User new3=new User(3,"DAM"); User new4=new User(4,"Helio"); Set obj1 =new HashSet(); obj1.add(new1); obj1.add(new2); obj1.add(new3); obj1.add(new4); obj2=new Userlist(obj1); flag=true; } return obj2; } @RequestMapping(value="/{id}",method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.OK) public void deleteUser(@PathVariable int id){ Set set1= obj2.getUsers(); for(User a:set1) { if(id==a.getId()) set1.remove(a); } Userlist obj3=new Userlist(set1); obj2=obj3; //return obj3; } @RequestMapping(value="/{id}",method = RequestMethod.PUT, consumes = "Application/json") @ResponseStatus(HttpStatus.OK) public void updateUser(@PathVariable int id, @RequestBody User temp){ System.out.println("Inside the put function"); if(temp==null){System.out.println("This is a Null for PUT");} } } 

À l’heure actuelle, je n’ai rien dans PUT.

Remarquez les méthodes autorisées dans la réponse

 Connection: close Date: Tue, 11 Feb 2014 15:17:24 GMT Content-Length: 34 Content-Type: text/html Allow: GET, DELETE X-Powered-By: Servlet/2.5 JSP/2.1 

Il accepte uniquement GET et DELETE. Par conséquent, vous devez modifier le serveur pour activer également PUT et POST.

 Allow: GET, DELETE 

Eh bien, apparemment, j’ai dû changer ma fonction d’appel PUT updateUser . J’ai supprimé les @Consumes , les @RequestMapping et ajouté un @ResponseBody à la fonction. Donc, ma méthode ressemblait à ceci:

 @RequestMapping(value="/{id}",method = RequestMethod.PUT) @ResponseStatus(HttpStatus.OK) @ResponseBody public void updateUser(@PathVariable int id, @RequestBody User temp){ Set set1= obj2.getUsers(); for(User a:set1) { if(id==a.getId()) { set1.remove(a); a.setId(temp.getId()); a.setName(temp.getName()); set1.add(a); } } Userlist obj3=new Userlist(set1); obj2=obj3; } 

Et ça a marché !!! Merci à tous pour la réponse.

Je ne sais pas si j’ai raison, mais à partir de l’en-tête de requête que vous publiez:

Demander des en-têtes

Accepter: application / json

Origine: extension de chrome: // hgmloofddffdnphfgcellkdfbfbjeloo

Agent utilisateur: Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, comme Gecko) Chrome / 29.0.1547.76 Safari / 537.36

Type de contenu: application / x-www-form-urlencoded

Accept-Encoding: gzip, deflate, sdch Accept-Langue: en-US, en; q = 0,8

il semble que vous n’ayez pas configuré le corps de votre requête en JSON.

La même chose arrive avec moi, si votre code est correct et donnez également une erreur 405. Cette erreur est due à un problème d’autorisation. allez dans le menu d’autorisation et passez à “Hériter de l’autorisation parent”.

Menu d'options Type d'autorisationAutorisation hériter de l'autorisation du parent sélectionné

Le problème est que la méthode POST est interdite pour les demandes de fichiers statiques du serveur NGYNX. Voici la solution de contournement:

 # Pass 405 as 200 for requested address: server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 404 /404.html; error_page 403 /403.html; error_page 405 =200 $uri; } 

Si vous utilisez un proxy:

 # If NGYNX is like proxy for Apache: error_page 405 =200 @405; location @405 { root /htdocs; proxy_pass http://localhost:8080; } 

Si vous utilisez FastCGI:

 location ~\.php(.*) { fastcgi_pass 127.0.0.1:9000; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include /etc/nginx/fastcgi_params; } 

Les navigateurs utilisent généralement GET, vous pouvez donc utiliser des outils en ligne comme ApiTester pour tester vos demandes.

Source: https://ruhighload.com/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0+nginx+405+not+allowed