2016-08-11 2 views
1

Я пытаюсь вернуть шестнадцатеричную строку в качестве ответа от моей AWS Lambda. Когда он доходит до клиента, данные, похоже, будут изменены.Данные, измененные в AWS API Gateway Response body

  • данных:
    FF FF FF 21 f9 04 01 00 00 01 00 2c 00 00 00 00
    01 00 01 00 00 08 04 00 03 04 04 00 3b

  • Hexadecimal Excaped данных (переданных данных):

    \ x47 \ x49 \ x46 \ x38 \ x39 \ x61 \ x01 \ x00 \ x01 \ x00 \ x80 \ x00 \ x00 \ x00 \ x00 \ x00 " " \ xff \ xff \ xff \ x21 \ xf9 \ x04 \ x01 \ x00 \ x00 \ x01 \ x00 \ x2c \ x00 \ x00 \ x00 \ x00 " " \ x01 \ x00 \ x01 \ x00 \ x0 \ x08 \ x04 \ x00 \ x03 \ x04 \ x04 \ x00 \ x3b

  • Прием данных
    47 49 46 38 39 61 01 00 01 00 c2 80 00 00 00 00
    00 c3 бф c3 бф c3 бф 21 c3 b9 04 01 00 00 01 00
    2с 00 00 00 00 01 00 01 00 00 08 04 00 03 04 04
    00 3b

    Как это исправить?

ответ

2

Последний раз я проверил это было не очень явным в документе, но API шлюз действительно сделан для JSON (или аналогичный) и поддержки двоичного является «на дорожной карте», но явно не кажется, приоритет. Он преобразует все, что он отправляет в utf-8.

Сравнивая точно исходные данные с полученными одним вы можете увидеть:

47 49 46 38 39 61 01 00 01 00 80 00 00 00 00 00 ff ff ff 21 f9 04 01 00 00 01 00 2c 00 00 00 00 01 00 01 00 00 08 04 00 03 04 04 00 3b 
47 49 46 38 39 61 01 00 01 00 c2 80 00 00 00 00 00 c3 bf c3 bf c3 bf 21 c3 b9 04 01 00 00 01 00 2c 00 00 00 00 01 00 01 00 00 08 04 00 03 04 04 00 3b 

Все под 0x7F в порядке, так как точка Юникода кода совпадает с закодированными байтами (U + 0047 -> 47) , но для 0x80 или более возникает проблема: U + 0080 -> c2 80, U + 00FF -> c3 bf и т. д.

В последнее время у нас была аналогичная проблема: двоичные данные были повреждены и больше при отправке через шлюз, чем при прямом доступе к нашему серверу. Это связано с тем, что многие байты заменяются специальным «символом замены» Unicode, ака 'U + FFFD' aka '0xEF 0xBF 0xBD'.

Как исправить? Мы просто перестали использовать Gateway, но если вы можете позволить своим данным быть больше, вы можете закодировать base64.