Jersey方法不允许 405

3

我是新手对于rest服务。我正在尝试创建一个服务,该服务接受来自客户端的JSON字符串。当我使用JQuery调用此服务时,我会收到405错误。 以下是ws的Java代码:

@POST
@Path("logevent")
@Consumes(MediaType.APPLICATION_JSON)
public boolean logEvent(String obj)
{
  System.out.println(obj);
  return true;
}

并且

@Path("getdata")
@GET
public String getData()
{
  return "Hello";
}

发送JSON的jQuery代码如下:

var json ="{\"userName\":\"testtest\"}";
var json_data =  JSON.stringify(json);

$.ajax({
    type: "POST",
    url: "http://localhost:8080/log/log/logevent",
    // The key needs to match your method's input parameter (case-sensitive).
     data: json_data,
    contentType: "application/json",
    dataType: "json",
    success: function(data){alert(data);},
    failure: function(errMsg) {
        alert(errMsg);
    }

出了什么问题?发布(post)不起作用,但是当我使用URL http://<serverip>/log/log/getdata 进行get请求时,我可以得到响应。


感谢Michal纠正了这个错别字。 - Ritesh Waghela
这个类的@Path是什么?JAX-RS会将“/log/log/logevent”匹配到“logEvent()”方法吗? - user1907906
你的意思是它确实匹配吗? - user1907906
在jQuery中使用http://localhost:8080/,在浏览器中使用<serverip>。这两者是相同的吗? - user1907906
我正在使用 http://localhost:8080/log/log/logevent。 - Ritesh Waghela
2个回答

2

JSON的MessageBodyReader能够将JSON流反序列化为JAXB bean(或POJO),但不能反序列化为字符串。可以创建一个类似以下的JAXB bean:

@XmlRootElement
public class User {

    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(final String userName) {
        this.userName = userName;
    }
}

并将你的POST资源方法更改为:

@POST
@Path("logevent")
@Consumes(MediaType.APPLICATION_JSON)
public boolean logEvent(User obj) {}

然后将@ConsumesMediaType.APPLICATION_JSON更改为MediaType.TEXT_PLAIN,并且在您的ajax请求中也将contentType更改为text/plain。但是您将在obj中拥有{"userName":"testtest"}字符串。 - Michal Gajdos
幸运!我正在做同样的事情,但它显示无法消耗内容类型。 - Ritesh Waghela

0

首先确保路径为/log/log/logevent

然后尝试更改请求/响应类型:

您应该使用application/json;charset=UTF-8(W3C XHR规范),此外,您的Web服务不会响应JSON,而是输出布尔值,也许您应该更改响应类型。

例如,使用UTF-8:

JAX-RS

@Consumes("application/json;charset=UTF-8")

jQuery

contentType:"application/json;charset=UTF-8"

谢谢你的帮助,但这不起作用。我尝试过这个,但出现了相同的错误。 - Ritesh Waghela
有趣的是,我有一个正常工作的获取方法:@Path("getdata") @GET public String getData() { return "你好"; } - Ritesh Waghela

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接