Ответ 1
Фактически% 27 не является решением. Правильный способ избежать состоит в том, чтобы поместить две одиночные кавычки в строку вместо одной.
В примере "o''clock"
Я использую OData для запроса моей базы данных. Следующая строка кода отлично работает, когда "имя_адаптера" содержит только текст.
ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, '');
Если "имя_адаптера" содержит одну цитату, она терпит неудачу. Я попытался избежать одиночной цитаты, используя следующий код:
adapterName = adapterName.replace(/\'/g, '\\\'');
Несмотря на то, что это правильно ускользает от пользовательского текста, функция все еще терпит неудачу. Может ли кто-нибудь сказать мне, какой правильный формат для текста в запросе?
Фактически% 27 не является решением. Правильный способ избежать состоит в том, чтобы поместить две одиночные кавычки в строку вместо одной.
В примере "o''clock"
Я хочу немного расширить ответ, чтобы он также применился к вызову действия операции службы 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"
}
При использовании подстроки wit это должно быть экранировано с помощью 4 вместо 1 апострофа:
a'b ->
$filter=(substringof('a''''b', FirstName))
Это на самом деле описано в документах 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, равно как и планшет").
Вместо использования $filter = Title eq 'text'
Я использую функцию owata startswith().
$filter = startswith (Title, key)
а затем я передаю как можно больше ключей.
var pos = key.indexOf("'");
if(pos > -1) {
key = key.substring(0, pos);
}