Я пытаюсь передать регулярные выражения от клиента к серверу, используя стороннюю клиентскую сторону Angular JS и сервер Nancy FX. У меня возникла особая проблема с символом "+". В настоящее время я явно кодирую "+" как клиентскую сторону "%2B":
this.getMatchingPoints = function (stringMatch) {
console.log("Application Points Service: getPointsMatching('" + stringMatch + "')");
/* we have a particular problem with the character '+' in regular expressions, since
* encodeURIComponent ignores it, and urldecoders treat it as a space. So it must be
* manually url encoded after passing the rest of the string to encodeURIcomponent */
var encodedPattern = encodeURIComponent(stringMatch).replace('+', '%2B');
return $http.get('/Json/PointsMatching/' + encodedPattern);
};
... но он по-прежнему принимается как сторона космического сервера.
В некотором смысле это не имеет большого значения, учитывая, что любой экземпляр, например, "[AZ] +" в регулярном выражении может быть заменен на "[AZ] [AZ] * '; или, в качестве альтернативы, я мог бы написать свой собственный специальный кодер для "+" клиентской стороны со своей собственной специальной стороной сервера декодера.
Но мне интересно, сталкивался ли кто-либо с этой проблемой раньше, и если да, то как они ее решили?
Немного больше исследований показывает, что это глубокая и трудная для устранения ошибка в Nancy FX, о которой разработчики знают; см. здесь.
Мое обходное решение заключается в том, что пробелы не являются допустимыми символами в конкретном контексте, в котором я работаю, чтобы заменить все пробелы на стороне плюсов:
/* <summary>
* Return a JSON formatted document comprising a list of all those application points whose
* names match the regular expression.
* </summary>
* <remarks>
* <para>This entry point is expected to be invoked with the pattern as the final element in the path
* (i.e. <code>/Json/PointsMatching/pattern_here</code>). This variant cannot cope with either slashes
* or backslashes in the pattern, even if they're URL encoded.</para>
* </remarks>
* <param name="pattern">A regular expression.</param>
* <returns>A JSON formatted document comprising a list of all those application points whose
* names match the regular expression.</returns>
*/
this.Get["/PointsMatching/{pattern}"] = _ =>
{
string pattern = (string)_.pattern;
/* THIS IS A HACK! The URL decoder used by Nancy decodes both '+' and '%2B' as ' ', which
* rather defeats the point of url encoding. However, we don't normally use spaces in
* application point names (although it would be valid to do so), so it fairly save to
* replace all spaces in patterns with pluses. */
pattern = pattern.Replace(" ", "+");
return this.WithValidUser<string>(pattern, InterestRegistry.Instance.GetPointsMatching);
};
Это явно уродливое, а не решение общего назначения, но оно работает пока.