Проблема преобразования Unicode при использовании шлюза API - PullRequest
0 голосов
/ 07 апреля 2020

Следующий URL-адрес работает, как ожидается, и возвращает значение "ноль".

https://zga2tn1wgd.execute-api.us-east-1.amazonaws.com/mycall?url=https: //mr.wikipedia.org/s/4jp4

Но на той же странице со строкой Unicode вместо строки ASCII выдается ошибка:

"errorMessage": "'ascii' codec can't encode characters in position 10-20: ordinal not in range(128)", "errorType": "UnicodeEncodeError"

Как мне кодировать символы Unicode при передаче строки в шлюз API?

https://zga2tn1wgd.execute-api.us-east-1.amazonaws.com/mycall?url=https: //mr.wikipedia.org/wiki/%E0%A4%95%E0%A4%BF%E0%A4%B6%E0%A5%8B%E0%A4%B0%E0%A4%BE%E0 % A4% B5% E0% A4% B8% E0% A5% 8D% E0% A4% A5% E0% A4% BE


Я использую следующую закладку для создания упомянутого URL выше ...

javascript:(function(){location.href='https://z3nt6lcj40.execute-api.us-east-1.amazonaws.com/mycall?url='+encodeURIComponent(location.href);})();

1 Ответ

2 голосов
/ 16 апреля 2020

В вашей лямбда-функции есть строка, которая цитирует URL

url1 = urllib.parse.unquote(url)

с

'https://zga2tn1wgd.execute-api.us-east-1.amazonaws.com/mycall?url=https://mr.wikipedia.org/wiki/%E0%A4%95%E0%A4%BF%E0%A4%B6%E0%A5%8B%E0%A4%B0%E0%A4%BE%E0%A4%B5%E0%A4%B8%E0%A5%8D%E0%A4%A5%E0%A4%BE'

до

'https://zga2tn1wgd.execute-api.us-east-1.amazonaws.com/mycall?url=https://mr.wikipedia.org/wiki/किशोरावस्था'

Части, отличные от US-ASCII вышеупомянутые результаты должны быть закодированы перед выполнением запроса. Это в компоненте запроса.

Рекомендуется разделять URI на его компоненты при кодировании , чтобы не изменять его семантику.

Вот еще несколько вещей для сделать перед отправкой запроса на URL.

url1 = urllib.parse.unquote(url)
urlparts = urllib.parse.urlparse(url1)
querypart = urllib.parse.parse_qs(urlparts.query)
querypart_enc = urllib.parse.urlencode(querypart)

# Rebuild URL with escaped query part
url1 = urllib.parse.urlunparse((
     urlparts.scheme, urlparts.netloc, 
     urlparts.path, urlparts.params,
     querypart_enc, urlparts.fragment
))
...