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
找到 data
、 username
、 accID
变量并存储它们不是吗?
有人知道这里有什么问题吗?
PS:xmlhttp请求初始化正确并建立连接,但参数未在服务器上传递。
【问题讨论】:
req.send
是设置URL的查询还是请求的正文?
req.send()
将请求数据发送到服务器,我猜是正文。
我喜欢你的问题。它让我了解了表单参数在 JAX-RS 中的工作原理。
【参考方案1】:
你想做什么:
@QueryParam
用于从请求的查询中获取参数:
http://example.com/some/path?id=foo&name=bar
在此示例中,id
和 name
可以作为 @QueryParam
访问。
但是您正在发送请求的正文中的参数。
你应该做什么:
要从正文中获取参数,您应该使用@FormParam
和application/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 通信的主要内容,如果未能解决你的问题,请参考以下文章