Java - Преобразовывает Строку в допустимый объект URI

Таким образом, функция, которую вы передаете .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]. Поэтому, если во время хода отправлено несколько действий, ваш обработчик будет вызываться для каждого пакета.

71
задан Denis Kniazhev 27 May 2015 в 13:27
поделиться

4 ответа

Вы могли бы попробовать: 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 может стать довольно грязным...

56
ответ дан user2340612 24 November 2019 в 12:56
поделиться

Можно использовать конструкторов мультиаргумента 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);

Для сейфа необходимо просканировать строку для # символы, но это должно запустить Вас.

4
ответ дан Community 24 November 2019 в 12:56
поделиться

Блог java.net имел класс на днях, который, возможно, сделал то, что Вы хотите (но он снижается прямо сейчас, таким образом, я не могу проверить).

Этот код здесь мог, вероятно, быть изменен, чтобы сделать то, что Вы хотите:

http://svn.apache.org/repos/asf/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/uri/UriBuilder.java

Вот является тем, о котором я думал с java.net: https://urlencodedquerystring.dev.java.net /

1
ответ дан TofuBeer 24 November 2019 в 12:56
поделиться

Если вы этого не сделаете как библиотеки, как насчет этого?

Обратите внимание, что вам не следует использовать эту функцию для всего 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;
}
9
ответ дан 24 November 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: