Подтвердить что ты не робот

Как избежать одиночной кавычки, которая будет использоваться в запросе OData?

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

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

Если "имя_адаптера" содержит одну цитату, она терпит неудачу. Я попытался избежать одиночной цитаты, используя следующий код:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Это приведет к тому, что сервер увидит

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

и

'часы'

приведет к ошибке "Плохой запрос - ошибка в синтаксисе запроса".

Чтобы исправить это, вы должны удвоить escape 'и 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"
}

Ответ 3

При использовании подстроки wit это должно быть экранировано с помощью 4 вместо 1 апострофа:

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

Ответ 4

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

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

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

http://host/service/People ("О'Нил")

HTTP://хост/сервис/Люди (% 27х% 27% 27Neil% 27)

HTTP://хост/сервис/People% 28% 27х% 27% 27Neil% 27% 29

http://host/service/Categories ('Смартфон% 2FTablet')

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

http://host/service/People ('О'Нил')

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

http://host/service/Categories ("смартфон/планшет")

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

Ответ 5

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

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

$filter = startswith (Title, key)

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

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