Jax-RS 和 Xmlhttp 通信

Posted

技术标签:

【中文标题】Jax-RS 和 Xmlhttp 通信【英文标题】:Jax-RS and Xmlhttp Communication 【发布时间】:2012-10-31 22:05:13 【问题描述】:

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

我想通过 xmlhttp POST 请求从 HTML 页面发送一个 JSON 数组、一个用户名和一个 accountID,方法是将它们全部设为一个大字符串,以便我可以使用 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 函数应该通过 @QueryParam 找到 datausernameaccID 变量并存储它们不是吗?

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

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

【问题讨论】:

req.send是设置URL的查询还是请求的正文? req.send() 将请求数据发送到服务器,我猜是正文。 我喜欢你的问题。它让我了解了表单参数在 JAX-RS 中的工作原理。 【参考方案1】:

你想做什么:

@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 代码中。

【讨论】:

你是对的!现在我也了解了 Jax-RS 中的表单参数。非常感谢您的回复和您的时间。

以上是关于Jax-RS 和 Xmlhttp 通信的主要内容,如果未能解决你的问题,请参考以下文章

google浏览器不支持XMLhttp请求怎么办呢? 不要回答卸载了重新安装,本人已经试过了,行不通,请高手解决!

通信类

WebService

回顾ajax

JAX-RS 和 JAX-WS 有啥区别?

原生Ajax jquery中使用Ajxa