Таким образом, функция, которую вы передаете .use
, представляет собой промежуточное программное обеспечение, которое может выполнять до и после обработки входящего действия . Вы получаете доступ к "текущей" активности из контекста поворота через свойство turnContext.Activity
. Эти действия могут быть отправлены от пользователя или из какой-либо другой системы, которая отправляет их через API DirectLine боту (при условии, что вы используете Bot Framework Service).
Исходящие действия, то есть действия, которые отправляются ботом в ответ на входящие действия, также могут быть перехвачены промежуточным программным обеспечением, но промежуточному программному обеспечению необходимо более явно участвовать в отправке этих действий. , Это делается путем регистрации обработчика в контексте поворота с использованием API onSendActivities
.
Все это выглядит примерно так:
botAdapter.use(async (turnContext, next) => {
// pre-processing of the current incoming activity
console.log(`Processing activity ${turnContext.activity.id} starting... `);
// hook up a handler to process any outgoing activities sent during this turn
turnContext.onSendActivities(async (sendContext, activities, nextSend) => {
// pre-processing of outgoing activities
await nextSend();
// post-processing outgoing activities
});
await next();
// post-processing of the current incoming activity
console.log(`Processing activity ${turnContext.activity.id} finishing. `);
});
Следует отметить, что обработчики исходящей активности могут вызываться 0..*
раз, так как они в основном инициируются вызовами логики нижестоящего потока. turnContext.sendActivit[y|ies]
. Поэтому, если во время хода отправлено несколько действий, ваш обработчик будет вызываться для каждого пакета.
Вы могли бы попробовать: org.apache.commons.httpclient.util.URIUtil.encodeQuery
в свободное-городское-население-httpclient Apache проект
Как это (см. URIUtil):
URIUtil.encodeQuery("http://www.google.com?q=a b")
станет:
http://www.google.com?q=a%20b
можно, конечно, сделать это сами, но парсинг URI может стать довольно грязным...
Можно использовать конструкторов мультиаргумента URI
класс. От URI
javadoc:
конструкторы мультиаргумента заключают запрещенные символы в кавычки как требуется компонентами, в которых они появляются. Символ процента (' % ') всегда заключается в кавычки этими конструкторами. Любые другие символы сохраняются.
Поэтому, если Вы используете
URI uri = new URI("http", "www.google.com?q=a b");
Затем, Вы добираетесь http:www.google.com?q=a%20b
, который не совершенно правилен, но это немного ближе.
, Если Вы знаете, что Ваша строка не будет иметь фрагментов URL (например, http://example.com/page#anchor ), затем можно использовать следующий код для получения то, что Вы хотите:
String s = "http://www.google.com?q=a b";
String[] parts = s.split(":",2);
URI uri = new URI(parts[0], parts[1], null);
Для сейфа необходимо просканировать строку для #
символы, но это должно запустить Вас.
Блог java.net имел класс на днях, который, возможно, сделал то, что Вы хотите (но он снижается прямо сейчас, таким образом, я не могу проверить).
Этот код здесь мог, вероятно, быть изменен, чтобы сделать то, что Вы хотите:
Вот является тем, о котором я думал с java.net: https://urlencodedquerystring.dev.java.net /
Если вы этого не сделаете как библиотеки, как насчет этого?
Обратите внимание, что вам не следует использовать эту функцию для всего URL-адреса, вместо этого вы должны использовать ее для компонентов ... например, просто компонент «a b», когда вы создаете URL - иначе компьютер не будет знать, какие символы должны иметь особое значение, а какие - буквальное.
/** Converts a string into something you can safely insert into a URL. */
public static String encodeURIcomponent(String s)
{
StringBuilder o = new StringBuilder();
for (char ch : s.toCharArray()) {
if (isUnsafe(ch)) {
o.append('%');
o.append(toHex(ch / 16));
o.append(toHex(ch % 16));
}
else o.append(ch);
}
return o.toString();
}
private static char toHex(int ch)
{
return (char)(ch < 10 ? '0' + ch : 'A' + ch - 10);
}
private static boolean isUnsafe(char ch)
{
if (ch > 128 || ch < 0)
return true;
return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
}