Почему Java URLEncoder не генерирует то, что делает Python urllib.parse.urlencode? - PullRequest
0 голосов
/ 30 марта 2019

Мои вопросы выглядят так же, как и этот вопрос: Java-эквивалент Pythons urllib.urlencode (UrlEncode на основе HashMap) однако, это не так.Поскольку его ответ неверен (или я делаю что-то неправильно, о чем я не знаю).

У меня есть этот код Python3:

def create_vxttoken_data(path_uri, expiry, reuse, shared_secret):
    # Combine the parameters into a URL-encoded string
    message = []
    message.extend([('pathURI', path_uri)])
    message.extend([('expiry', expiry)])
    message.extend([('reuse', reuse)])
    print(message)

    url_encoded_message = urlencode(message)
    print(url_encoded_message)

    # ... rest of the code

Это вывод:

[('pathURI', 'http://my.domain.net/*'), ('expiry', 1553937508), ('reuse', 0)]
pathURI=http%3A%2F%2Fmy.domain.net%2F%2A&expiry=1553937508&reuse=0

Я пытался написать это на Kotlin.Итак, это мой код:

fun main(args: Array<String>) {
    val queryParams = "pathURI=$PATH_URI&expiry=${expiryTime(10)}&reuse=$REUSE"
    println(queryParams)

    val encodedQueryParams = URLEncoder.encode(queryParams, Charsets.UTF_8.toString())
    println(encodedQueryParams)

    // ... rest of the code

Это его вывод:

pathURI=http://my.domain.net/*&expiry=1553938196&reuse=0
pathURI%3Dhttp%3A%2F%2Fmy.domain.net%2F*%26expiry%3D1553938196%26reuse%3D0

При сравнении второй строки выводов вы видите, что Kotlin / Java преобразовал =, тогда как Pythonне сделал.Кроме того, Kotlin / Java не переводил *, в то время как Python делает.Я хочу, чтобы Kotlin / Java генерировал вывод, как это делает Python.Остальная часть моего кода создает токен на основе этой информации.Следовательно, моя аутентификация не проходит.

Примечание: в моем файле Kotlin / Java, когда я заменяю

val encodedQueryParams = URLEncoder.encode(queryParams, Charsets.UTF_8.toString())

By

val encodedQueryParams = "pathURI=http%3A%2F%2Fmy.domain.net%2F%2A&expiry=1553937508&reuse=0"

, тогда мой код отдыха сгенерирует токен, который в точности совпадает с тем, что генерирует Python,Следовательно, это означает, что что-то не так с моим URLEncoder.encode.

1 Ответ

0 голосов
/ 30 марта 2019

Спасибо @ user207421.Я нашел в чем была моя ошибка и как мне это исправить.Итак, это эквивалентный код Котлина:

fun main(args: Array<String>) {
    val requestParams = HashMap<String, String>()
    requestParams["pathURI"] = PATH_URI
    requestParams["expiry"] = expiryTime(10)
    requestParams["reuse"] = REUSE.toString()

    val encodedQueryParams = requestParams.keys.stream()
        .map { key -> "$key=${encodeValue(requestParams[key].orEmpty())}" }
        .reduce { p1: String?, p2: String? -> "$p1&$p2" }
        .map { s -> "?$s" }
        .orElse("")
    println(encodedQueryParams)

    // ... rest of my code
}

fun encodeValue(value: String): String {
    return URLEncoder.encode(value, Charsets.UTF_8.toString())
}

Суть можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...