NutzCN Logo
问答 Nutz REST 请求中使用JSON字符串问题
发布于 301天前 作者 guanml 406 次浏览 复制 上一个帖子 下一个帖子
标签: json mvc

REST 请求中使用JSON字符串

/dataprocess/loadimages/{"basepath":"/Users/guanml/Data/east"}

结果提示
Search mapping for path=/dataprocess/loadimages/{"basepath":"/Users/guanml/Data/east"} : NOT Action match

于是我把 请求的字符串用 encodeURI 这个方法编码了一下再提交,结果还是报找不到路径。
js$.ajax({ type: "POST", url: encodeURI("../dataprocess/loadimages/" + JSON.stringify({basepath: $("#mosaicPath").val()})), dataType: "son", processData: true, \n

但是我使用类似的请求,却可以正常的请求到,只是请求字符串里不包含 “/” 。
js\n query/datasourceinfo/{"satallite":"ZY-3","cgq":"CCD","colormode":"全色","starttime":"201404","endtime":"201604","xzqhid":"230000","citytype":"province"} \n

这个问题算不算是 nutz 的bug?

10 回复

问题在于那些反斜杠,那是路径分隔符

来自炫酷的 NutzCN

另外,用post当然不行啊,路径更不匹配了

来自炫酷的 NutzCN

我说的encode,只是encode一下json那部分,不是整个路径啊

来自炫酷的 NutzCN

@wendal 我执行 encodeURI(JSON.stringify({basepath: $("#mosaicPath").val()})) 返回的结果也是一样

@wendal 我把POST改成 GET 也不行

@guanml 完整代码

来自炫酷的 NutzCN

@wendal 那些反斜杠 都在 { } 里,而且还是字符串 ,nutz 不能够判断吗?

@wendal
function loadMosaicImages() {

$.ajax({
    type: "GET",
    url: "../dataprocess/loadimages/" + encodeURI(JSON.stringify({basepath: $("#mosaicPath").val()})),
    dataType: "text",
    processData: true,
    beforeSend: function () {
        //异步请求时spinner出现
        $("#loadlabel").text("");
        var target = $("#loadsp").get(0);
        spinner.spin(target);
        $("#loadImagesBtn").attr("disabled", true);
    },
    error: function (req, status, error) {
        spinner.stop();
        $("#loadImagesBtn").removeAttr("disabled");
        if (status === "timeout") {

            alert("请求超时,请稍后再试!!");
            return;
        } else if (status === "error") {

            alert("数据请求失败,请稍后再试!如果还未解决,请联系管理员!");
            return;
        }

        return;
    },
    success: function (obj) {
        spinner.stop();
        $("#loadImagesBtn").removeAttr("disabled");

        if (obj.code === 0) {
            $("#loadlabel").text("创建成功!");
            $("#loadlabel").addClass("label label-success");
            var data = obj.data;
            $.each(data, function (i, res) {
                $("#selList").append("<option id='" + i + "'>" + res + "</option>");
            });

        } else {
            $("#loadlabel").text(obj.message);
            $("#loadlabel").addClass("label label-danger");
        }


    }
});

后台代码

@At("/loadimages/?")
@GET
@POST
@AdaptBy(type = JsonAdaptor.class)
public Object loadImages(MosaicParam param, AdaptorErrorContext errCtx) {
    if (errCtx != null || param.getBasepath().isEmpty()) {
        MessageWrap<String> messge = new MessageWrap<String>(1, "传入的影像基址参数初始化出错");
        return messge;
    }

    //获取所有影像文件
    List<File> files = fileIndexService.indexImageFiles(param.getBasepath());

    List<String> filenames = new ArrayList<String>();

    for (int i = 0; i < files.size(); i++) {
        File image = files.get(i);
        filenames.add(image.getName());
    }

    if (filenames.size() > 0) {
        MessageWrap<List<String>> messge = new ResultWrap<List<String>>(filenames, 0, "成功加载影像文件!");
        return messge;
    }

    MessageWrap<List<String>> messge = new ResultWrap<List<String>>(filenames, 1, "加载影像文件数为0!");
    return messge;

}

测试代码

入口方法, 用贪婪匹配.

    @AdaptBy(type=JsonAdaptor.class)
    @At("/pathjson/**")
    public void pathjson(NutMap map) {
        System.out.println(Json.toJson(map));
    }

访问地址:

http://127.0.0.1:8080/nutzbook/demo/pathjson/{path:'abc'}
// Chrome 在地址栏自动转义
http://127.0.0.1:8080/nutzbook/demo/pathjson/%7Bpath:'abc'%7D

后台输出

{
   "path" :"abc"
}

@wendal (*@ο@*) 哇~ 用贪婪匹配 搞定了! 兽总 威武霸气帅!

添加回复
请先登陆
回到顶部