PUT и получение POST 405 Метод не разрешен Ошибка для Restful Web-сервисов

Я пытаюсь настроить простой веб-сервис Restful, который возвращает JSON или XML в соответствии с заголовком Accept. Я использую Spring, Maven и WebLogic Server. Я взял пример из этого поста http://software.sawano.se/2012/03/combining-json-and-xml-in-restful-web.html и попытался улучшить его. GET и DELETE работают как для JSON, так и для XML. Но PUT и POST выдают ошибку "Метод 405 не разрешен". Я пытаюсь проверить это с помощью Chrome Extension Advanced Rest Client. ниже заголовки ответа.

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

тело запроса, которое я даю ниже:

{
id: 1
name: "manga"
}

Мой класс контроллера, как показано ниже:

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");}
 }
}

Щас у меня ничего нет в PUT.

5 ответов

Решение

Ну, видимо, мне пришлось изменить свою функцию вызова PUT updateUser, Я удалил @Consumes, @RequestMapping а также добавил @ResponseBody к функции. Итак, мой метод выглядел так:

@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;
}

И это сработало!!! Спасибо всем за ответ.

Уведомление Разрешенные методы в ответе

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

Он принимает только GET и DELETE. Следовательно, вам нужно настроить сервер для включения PUT и POST.

Allow: GET, DELETE

Я не уверен, что я прав, но из заголовка запроса, который вы публикуете:

Заголовки запроса

Принять: приложение / JSON

Происхождение: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo

Пользователь-агент: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/29.0.1547.76 Safari/537.36

Тип контента: application / x-www-form-urlencoded

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

Похоже, вы не настроили тело запроса на тип JSON.

То же самое происходит и со мной, если ваш код верен, а затем выдает ошибку 405. эта ошибка из-за некоторых проблем с авторизацией. перейдите в меню авторизации и выберите "Наследовать аутентификацию от родителя".

Меню параметров типа авторизацииАвторизация Наследовать аутентификацию от выбранного родителя

В моем случае форма (которую я не могу изменить) всегда отправляла POST.
Находясь в своем веб-сервисе, я пытался реализовать метод GET (из-за отсутствия документации я ожидал, что оба варианта разрешены).

Таким образом, это было ошибкой как "Не разрешено", поскольку на моем конце не было метода с типом POST.

Изменение @GET к @POST выше мой метод WS исправил проблему.

Проблема в том, что метод POST запрещен для запросов статических файлов на сервере NGYNX. Вот обходной путь:

# 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;
}

При использовании прокси:

# If NGYNX is like proxy for Apache:

error_page 405 =200 @405; 

location @405 { 
    root /htdocs; 
    proxy_pass http://localhost:8080; 
}

При использовании 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;
}

Браузеры обычно используют GET, поэтому вы можете использовать онлайн-инструменты, такие как ApiTester, для проверки ваших запросов.

Источник: https://ruhighload.com/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0+nginx+405+not+allowed

Другие вопросы по тегам