У меня проблемы с получением сценария Python для передачи данных Unicode через вызов RESTful http.
У меня есть скрипт, который считывает данные с веб-сайта X с использованием интерфейса REST, а затем помещает их на веб-сайт Y с помощью интерфейса REST. Обе системы с открытым исходным кодом и работают на наших серверах. Сайт X использует PHP, Apache и PostgreSQL. Сайт Y - это Java, Tomcat и PostgreSQL. Сценарий, выполняющий обработку, в настоящее время находится на Python.
В общем, скрипт работает очень хорошо. У нас действительно есть несколько международных пользователей, и при попытке обработать пользователя с символами юникода в его имени вещи ломаются. Оригинальная версия скрипта считывает данные JSON в Python. Данные были автоматически преобразованы в Unicode. Я почти уверен, что до этого момента все работало нормально. Для вывода данных я использовал subprocess.Popen () для вызова curl. Это работает для обычной ASCII, но Unicode был искажен где-то в пути. Я нигде не получил сообщение об ошибке, но при просмотре результатов на сайте B оно больше не корректно закодировано.
Я знаю, что Unicode поддерживается для этих полей, потому что я могу обработать запрос, используя Firefox, который правильно добавляет данные на сайт B.
Следующей идеей было не использовать curl, а просто делать все на Python. Я экспериментировал, передавая вручную созданную строку Unicode в urllib Python, чтобы сделать вызов REST, но я получил ошибку от urllib.urlopen ():
UnicodeEncodeError: 'ascii' codec can't encode characters in position 103-105: ordinal not in range(128)
Есть идеи, как заставить это работать? Я бы предпочел не переписывать слишком много, но если бы существовал другой язык сценариев, который был бы более подходящим, я бы тоже не стал слышать об этом.
Вот мой тестовый скрипт Python:
import urllib
uni = u"abc_\u03a0\u03a3\u03a9"
post = u"xdat%3Auser.login=unitest&"
post += u"xdat%3Auser.primary_password=nauihe4r93nf83jshhd83&"
post += u"xdat%3Auser.firstname=" + uni + "&"
post += u"xdat%3Auser.lastname=" + uni ;
url = u"http://localhost:8081/xnat/app/action/XDATRegisterUser"
data = urllib.urlopen(url,post).read()