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.
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.
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
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.
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
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".