PUT и POST получение 405 метод не допускается ошибка для веб-служб Restful
Я пытаюсь настроить простой веб-сервис 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 Advanced Rest Клиент. ниже приведены заголовки ответов.
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 ответов
обратите внимание, разрешенные методы в ответе
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
ну, по-видимому, мне пришлось изменить функцию вызова 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;
}
и это сработало!!! Спасибо всем за ответ.
Я не уверен, что я прав, но из заголовка запроса, который вы публикуете:
заголовки запроса
Accept: Application/json
происхождение: chrome-расширение: / / hgmloofddffdnphfgcellkdfbfbjeloo
User-Agent: 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-кодировка: gzip, deflate, sdch Accept-язык: en-US, en; q=0.8
похоже, что вы не настроили тело запроса на тип JSON.
Я то же самое случилось со мной, Если ваш код правильный, а затем также дать 405 ошибку. эта ошибка из-за какой-то проблемы с авторизацией. перейдите в меню " авторизация "и перейдите в"наследовать аутентификацию от родителя".
проблема в том, что метод 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