2014-02-11 141 views
8

我想设置一个简单的Restful Web服务,根据Accept标头返回JSON或XML。我正在使用Spring,Maven和WebLogic Server。我从这篇文章http://software.sawano.se/2012/03/combining-json-and-xml-in-restful-web.html中拿出了这个例子,并试图改进它。 GET和DELETE同时适用于JSON和XML.BUT和POST会给出“405方法不允许”的错误。我正在尝试使用Chrome扩展高级休息客户端进行测试。下面是Response头。PUT和POST获取405方法不允许错误的Restful Web服务

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 

,我给请求体低于:现在我没有在放东西

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

:如下图所示

{ 
id: 1 
name: "manga" 
} 

我的控制器类。

+1

** Allow **响应只显示“GET,DELETE”。这是一个服务器问题... –

回答

4

好吧,显然我不得不改变我的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; 
} 

它的工作!谢谢大家的回应。

9

通知允许的方法在响应

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 
+0

准确地说我的问题。在响应中检查非常好允许的方法:) – Bankin

+0

谢谢,这是我需要的线索。 – djangofan

1

我不知道如果我是正确的,但是从请求头,你后:

请求头

接受:应用/ JSON

产地:chrome-extension:// hgmloofddffdnphfgcellkdfbfbjeloo

User-A gent:Mozilla/5.0(Windows NT 6.1; WOW64)为AppleWebKit/537.36(KHTML,例如Gecko)铬/ 29.0.1547.76 Safari浏览器/ 537.36

内容类型:应用/ X WWW的窗体-urlencoded

接受编码:gzip,放气, sdch Accept-Language:en-US,en; q = 0.8

好像你没有将你的请求体配置成JSON类型。

相关问题