Как избежать одиночной кавычки для использования в запросе OData? - PullRequest
28 голосов
/ 20 октября 2010

Я использую OData для запроса моей базы данных.Следующая строка кода работает нормально, когда «adaptorName» просто содержит текст.

ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, '');

Если «adapterName» содержит одну кавычку, произойдет сбой.Я попытался избежать одиночной кавычки, используя следующий код:

adapterName = adapterName.replace(/\'/g, '\\\'');

Хотя это правильно экранирует текст, определенный пользователем, функция все равно не работает.Может кто-нибудь сказать мне, что правильный формат для текста в запросе?

Ответы [ 5 ]

89 голосов
/ 19 декабря 2010

На самом деле% 27 не является решением. Правильный способ избежать этого - поместить в строку две одинарные кавычки вместо одной. В примере "o''clock"

6 голосов
/ 18 ноября 2014

Я хочу немного расширить ответ, чтобы он также относился к вызову действия операции службы oData. Ответ опубликованный ответ является правильным, но существует определенный порядок, в котором параметры для операции службы должны быть закодированы.

Операции службы oData получают параметры примитивного типа, в которых строки заключены в ', так что действительный URL (предварительное кодирование) будет таким

AddString? Значение = 'o''clock'

Это заставит сервер видеть

AddString? Значение = 'о'

и

'часы'

выдаст «Bad Request - Ошибка в синтаксисе запроса».

Чтобы исправить это, вы должны дважды экранировать 'и UrlEncode его перед вставкой в ​​URL.

Не UrlEncode самого URL.

Вот пример, который будет работать.

// value passed as "o'clock"
public async Task AddString(string value)
{
    // Escape ' with '' and UrlEncode value
    value = HttpUtility.UrlEncode(value.Replace("'", "''"));

    string url = String.Format("AddString?value='{0}'", value);

    // No need to UrlEncode url here as dynamic content has already been escaped 

    // Execute .....
}

[WebGet]
public void AddString(string value) 
{
    // here value will be "o'clock"
}
0 голосов
/ 09 июля 2019

Это на самом деле описано в документах oData: http://docs.oasis -open.org / odata / odata / v4.01 / cs01 / part2-url-условных обозначений / odata-v4.01-cs01-part2-url-условных обозначениях.html # sec_URLComponents

Например, одно из этих правил состоит в том, что одинарные кавычки в строковых литералах представляются в виде двух последовательных одинарных кавычек.

Пример 3: допустимые URL-адреса OData:

http://host/service/People('O''Neil')

http://host/service/People(%27O%27%27Neil%27)

http://host/service/People%28%27O%27%27Neil%27%29

http://host/service/Categories('Smartphone%2FTablet')

Пример 4: недействительноURL OData:

http://host/service/People('O'Neil')

http://host/service/People('O%27Neil')

http://host/service/Categories('Smartphone/Tablet')

Первый и второй примерынедопустимы, потому что одинарная кавычка в строке> литерал должна быть представлена ​​в виде двух последовательных одинарных кавычек.Третий пример недопустим, потому что прямая косая черта интерпретируется как разделители сегментов пути и Категории («Смартфон не является действительным сегментом пути OData, равно как и Планшет»).

0 голосов
/ 08 июля 2014

Вместо использования $ filter = Title eq 'text'

Я использую функцию oData startwith ().

$ filter = launchwith (Title, key)

и затем я передаю как можно больше ключей.

var pos = key.indexOf("'");if(pos > -1) {key = key.substring(0, pos);}

0 голосов
/ 01 марта 2013

При использовании подстроки с ней нужно избегать, имея 4 вместо 1 апострофа:

a'b -> $filter=(substringof('a''''b', FirstName))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...