3

Java JAX-RS の REST サーバーと HTML ページがあります。

メソッドを使用できるように、JSON 配列、ユーザー名、accountID xmlhttpをすべて 1 つの大きな文字列にして、POST 要求を介して HTML ページから送信したいと考えています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見つけて保存する必要があります。そうではありませんか?datausernameaccID@QueryParam

ここで何が問題なのか知っている人はいますか?

PS: xmlhttp リクエストは正しく初期化され、接続は確立されますが、パラメーターはサーバーに渡されません。

4

1 に答える 1

2

あなたがやろうとしていること:

@QueryParamリクエストのクエリからパラメーターを取得するために使用されます。

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

この例idnameは、 としてアクセスできます@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 コードで。

于 2012-11-12T13:41:24.563 に答える