web-dev-qa-db-fra.com

PUT et POST obtenir l'erreur 405 de la méthode non autorisée pour les services Web inactifs

J'essaie de configurer un service Web reposant simple qui renvoie JSON ou XML conformément à 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") String acceptHeader) {
    User temp = new User();
    if(obj2==null)
    {
        temp= new User(0, "Null");
    }
    else   {
        Set<User> 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<User> obj1 =new HashSet<User>();
    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<User> 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.

9
Some Guy Really

Eh bien, apparemment, j'ai dû changer ma fonction d'appel PUT updateUser. J'ai supprimé le @Consumes, le @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<User> 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.

5
Some Guy Really

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 ajuster le serveur pour activer également PUT et POST. 

Allow: GET, DELETE
10
aNish

Je ne sais pas si j'ai raison, mais à partir de l'en-tête de demande 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.

2
weiyueli

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 tels que 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

0
Zon

Il m’arrive la même chose 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 des autorisations et passez à "Hériter de l’autorisation du parent".

Authorization Type options menuAuthorization Inherit auth from parent selected

0
Solanki Vaibhav