3

次のように、JQueryを介してRESTベースのサービスに送信するJavaScriptコードに文字列のリストがあります。

var ids = []; 
$("input:checked").each(function() {
    ids.push(this.id);
});
var selectedIds = JSON.stringify(ids);
$.post("/todonotes/tasks/removeTask", selectedIds,function(e) {
}, "json");

ご覧のとおり、JavaScript配列をJSON配列に変換します。

ここで、サーバー側では、Spring MVCとJacksonを使用して、入力JSONを受信して​​解析します。

@RequestMapping(value="/tasks/removeTask", method = RequestMethod.POST)
public @ResponseBody String removeTask(@RequestBody List<String> selectedIds) {
    ...
}

しかし、私はいつも得ます:

HTTP Status 415 - 

--------------------------------------------------------------------------------

type Status report message 

description The server refused this request because the request entity is in a format     not supported by the requested resource for the requested method.

JSONオブジェクトから引用符を削除しようとしましたが、使用@RequestParamも成功しませんでした。

OQJFの提案に従って更新します。

投稿リクエストを次のように変更しました。

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},function(e) {  
}, "json");

これでコントローラーメソッドが呼び出されましたが、各List要素には二重引用符と角かっこが入力されています。これはリスト引数です:

[["15", "21"]]

たとえば、最初の要素は次のようになります。

["15"

Stringの各要素を解析したくないList

また、変換を削除しようとしましたJSON.stringifyが、コントローラーが呼び出されませんでした。これで私は得ました:

HTTP Status 400 - Required List parameter 'selectedIds' is not present

--------------------------------------------------------------------------------

type Status report

message Required List parameter 'selectedIds' is not present

description The request sent by the client was syntactically incorrect.

アップデート

次のように、IDを保持するオブジェクトを作成しようとしました。

public class TaskIdHolder {

    private String[] selectedIds;

    public String[] getSelectedIds() {
        return selectedIds;
    }

    public void setSelectedIds(String[] selectedIds) {
        this.selectedIds = selectedIds;
    }
}

次に、コントローラーメソッドのシグネチャを変更しました。

public @ResponseBody String removeTask(@RequestBody TaskIdHolder selectedIds) {

そして、私のJSONリクエストは次のようになります。

{"selectedIds":["15"]}

Andreiの提案に従って、Jqueryコードも変更しました。

var data = JSON.stringify({selectedIds:selectedIds});
$.post("/todonotes/tasks/removeTask", data, function(e) {

selectedIdsはJavaScript配列です。

しかし今、私は次のようになります。

POST http://localhost:8080/todonotes/tasks/removeTask 415 (Unsupported Media Type) 
4

3 に答える 3

4

JSON.stringify(),コードを使用する必要がないことはわかっているので、次のようになります。

var ids = []; 
$("input:checked").each(function() {
    ids.push(this.id);
});

$.post("/todonotes/tasks/removeTask", $.param({'id': ids}, true),function(e) {
}, "json");

また、サーバー側では、次の値を指定する必要があります。

public methodName(@RequestParam("id") List<String> selectedIds)
于 2013-03-23T13:25:07.590 に答える
3

次のことを試してください。コントローラーのメソッドシグネチャを変更したり、IDを保持するオブジェクトを作成したりする必要はありません。

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds.join(',')},function(e) {  
}, "json");

そうすれば、リクエストパラメータをまたは(両方のシナリオで機能する)としてselectedIds: id1,id2,id3宣言した場合に、コントローラーがIDを期待する方法のようにIDを送信できます。String[]List<String>

于 2014-01-28T22:03:58.897 に答える
2

リクエストパラメータに明示的な名前を付けてみてください。

$.post("/todonotes/tasks/removeTask", {selectedIds: selectedIds},...

更新します。リクエストデータオブジェクト全体をJSONに文字列化することもできます。

var data = {selectedIds: selectedIds};
$.post("/todonotes/tasks/removeTask", JSON.stringify(data),...
于 2013-03-23T13:18:26.950 に答える