使用Javascript在OData请求中使用撇号问题

时间:2018-03-14 17:36:13

标签: javascript json ajax odata

我有一个文本输入,用于通过JS传递值,使用OData查询参数从JSON文件中获取名称的过滤数据。

如果某人的名字中有撇号,我在传递网址时会收到错误的请求。

我知道撇号应该是escaped by double quoting。我已经尝试过了,虽然请求没有中断,但它会传递两个与数据不匹配的撇号(导致没有结果)。

以下是我的代码的高级别:

JSON

{
    "value": [{
        "Title": "John O'Smith"
    }]
}

HTML

<input type="text" value="John O'Smith" />
<button>Search</button>

JS

var term = $('input').val();
var searchTerm = term.replace(/'/g, "''");

var serviceURL = "/api/service?&$filter=contains(Title,'" + searchTerm + "')";

$('button').on('click', function(){
    $.get( serviceURL, function( data ) {
        // Code to display filtered JSON data
    });
});

当我通过AJAX传递上面的serviceURL时,网址将显示为:

/api/service?&$filter=contains(Title,'John O''Smith')

请求有效,但它带有两个与我的JSON对象不匹配的撇号。

如果我按原样传递 - 没有替换 - 我得到Bad Request

我也试过通过其他传统方法逃避它('\'',encodeUriComponent)

知道我做错了什么或如何解决这个问题?

更新

不幸的是,似乎有一个单独的问题,或者它被高度缓存,因为上面的所有内容现在都按预期工作。

2 个答案:

答案 0 :(得分:3)

你的名字中有一个空格,所以你需要在加倍撇号后对其进行编码:

var term = "John O'Smith";
var searchTerm = encodeURIComponent(term.replace(/'/g, "''"));

var serviceURL = "/api/service?&$filter=contains(Title,'" + searchTerm + "')";

将产生:

/api/service?&$filter=contains(Title,'John%20O''Smith')

答案 1 :(得分:1)

尝试用双引号交换每个单引号,反之亦然。

或者你可以将javascripts的concat()方法链接在一起。文档:concat()