Jax-RS和Xmlhttp通信

时间:2012-11-12 13:20:02

标签: java javascript xmlhttprequest jax-rs

我在Java JAX-RS中有一个REST服务器和一个HTML页面。

我希望通过xmlhttp POST请求从HTML页面发送JSON数组,用户名和帐户ID,方法是将所有这些都设为一个大字符串,以便我可以使用xmthttp.send()方法

HTML发送代码是:

function sendData() {   
    var req = createRequest();
    var postUrl = "rest/hello/treeData";

    var dsdata = $("#treeview").data("kendoTreeView").dataSource.data();
    var accID = "onthespot";
    var username = "alex";

    req.open("post", postUrl, true);
    req.setRequestHeader("Content-type","text/plain");

    req.send("data=" + JSON.stringify(dsdata) + "&username=" + username + "&accID=" + accID);

    req.onreadystatechange = function() {
        if (req.readyState != 4) {
            return;
        }
        if (req.status != 200) {
            alert("Error: " + req.status);
            return;
        }
        alert("Sent Data Status: " + req.responseText);
    }
}

服务器JAX-RS代码是:

@Path("/treeData")
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
public String storeTreeData(
        @QueryParam("data") String data,
        @QueryParam("username") String username,
        @QueryParam("accID") String accID) {

        System.out.println("Data= " + data + "\nAccID= " + accID + "\nUsername= " + username);

        return "Done";
}

问题是所有变量都打印为null。 storeTreeData函数应该通过data找到usernameaccID@QueryParam变量并存储它们是不是正确的?

有人知道这里有什么问题吗?

PS:xmlhttp请求已正确初始化并且已建立连接,但参数未在服务器上传递。

1 个答案:

答案 0 :(得分:2)

您尝试做什么:

@QueryParam用于从请求查询中获取参数:

http://example.com/some/path?id=foo&name=bar

在此示例中,idname可以@QueryParam的形式访问。

但您要在请求的正文中发送参数。

你应该做什么:

要从正文中获取参数,您应该将@FormParamapplication/x-www-form-urlencoded一起使用:

@Path("/treeData")
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public Response storeTreeData(
        @FormParam("data") String data,
        @FormParam("username") String username,
        @FormParam("accID") String accID) {

    // Build a text/plain response from the @FormParams.
    StringBuilder sb = new StringBuilder();
    sb.append("data=").append(data)
      .append("; username=").append(username)
      .append("; accId=").append(accID);

    // Return 200 OK with text/plain response body.
    return Response.ok(sb.toString()).build();
}

修改

您还应该使用

req.setRequestHeader("Content-type","application/x-www-form-urlencoded");

在您的JavaScript代码中。