Данные API, возвращающие символы Unicode в консоли - PullRequest
0 голосов
/ 21 мая 2018

Я столкнулся с довольно запутанной проблемой с последних двух дней.Я работаю над системой управления документами, которая использует API, который извлекает данные из SOLR.Объем данных составляет около 15 МБ, и в них заносятся записи более 4000+ документов.У API есть ответ в этом формате -

{
    "documents": [
        {
            id: 123,
            some_field: "abcd",
            some_other_field: "abcdef"
        },
        {
            id: 124,
            some_field: "abcd1",
            some_other_field: "abcdef1"
        }
    ]
}

Все отлично работает в браузере.Если я попадаю на конечную точку в браузере Chrome или Firefox, это дает мне правильный вывод, и я могу видеть вывод JSON.

Тем не менее, если я попытаюсь использовать одну и ту же конечную точку API с помощью кода Java или JS - код ответа - 200, но на выходе в консоли (Terminal или Eclipse) отображаются символы Unicode, такие как \u0089 \u0078 U+0080, - все выходные данныепроисходит таким образом, и, поскольку API получает более 4000 записей, консоль вроде как заполняется всеми этими символами Юникода.

Единственное различие, которое я вижу между запросами, сделанными из браузера иКод в том, что в браузере я вижу Content-Encoding : gzip, хотя я не могу найти этот заголовок из кода, который я написал.Например, в коде JS, через Chakram framework, я могу проверить

expect(response).to.be.encoded.with.gzip

, упомянутый здесь .Тем не менее, это возвращает ошибку, указывающую expected undefined to match gzip

Что мне здесь не хватает?Связано ли это с кодированием / декодированием или с чем-то совершенно другим?

Редактировать 1: Заголовки ответа, как показано на вкладке Network в Chrome:

cache-control: max-age=0, private, must-revalidate, max-age=315360000
content-encoding: gzip
content-type: application/json; charset=utf-8
date: Tue, 22 May 2018 06:07:26 GMT
etag: "a07eb7c1eef4ab97699afc8d61fb9c5d"
expires: Fri, 19 May 2028 06:07:26 GMT
p3p: CP="NON CUR OTPi OUR NOR UNI"
server: Apache
Set-Cookie : some_cookie
status: 200 OK
strict-transport-security: 
transfer-encoding: chunked
vary: Accept-Encoding
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
x-request-id: abceefr4-1234-acds-100b-d2bef2413r47
x-runtime: 3.213943
x-ua-compatible: chrome=1
x-xss-protection: 1; mode=block

Заголовки запроса, как видно изNetwork вкладка Chrome

Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Cookie: some_cookie
Host: abcd.bcd.com
IV_USER: demouser123
IV_USER_L: demouser123
MAIL: demouser@f.com
PERSON_ID: 123
Referer: http://abcd.bcd.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36
X-CSRF-TOKEN: some_csrf_token

Редактировать 2: тесты, которые я использую

describe('Hits required API',()=>{

    before(()=>{
        return chakram.wait(api_response = chakram.get(url,options));
    });

    it('displayes response',()=>{
        return api_response.then((t_resp)=>{
            console.log(JSON.stringify(t_resp));
            expect(t_resp).to.have.header('Content-Encoding','gzip');
        });
    });

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Попробуйте с помощью console.dir отобразить ваши значения

describe('Hits required API',()=>{

    before(()=>{
        return chakram.wait(api_response = chakram.get(url,options));
    });

    it('displayes response',()=>{
        return api_response.then((t_resp)=>{

            console.dir(t_resp, { depth: null });

        });
    });

Console.dir

0 голосов
/ 03 июня 2018

Это не имеет ничего общего с кодировкой.Веб-сервер в целом сжимает gzip для экономии полосы пропускания, поскольку его избыточно передавать весь файл размером 15 МБ, как это описано в этой статье для получения дополнительной информации о gZip и его работе (https://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/).Так что, где это пошло не так, и как это работает в Chrome, довольно просто. Chrome имеет встроенный синтаксический анализатор Unicode (даже HTML-анализатор) в своем devTools, который может показать вам проанализированный контент, а не отображать извилистый текст (то же самое можно увидеть в ответе).вкладка рядом с вкладкой предварительного просмотра).почему вы видите странный текст в том, что вы запихиваете ответ, в котором не будет специального символа, если он есть console.log(JSON.stringify(t_resp));.Вы не можете использовать что-то вроде console.log("response", t_resp); без строкового преобразования в терминале, так как терминал не имеет JSON или анализатора Unicode, он просто печатает в тексте.попробуйте удалить эту консоль, так как процесс записи 15-мегабайтного файла является дорогостоящим процессом.

Edit 1: - , если вы все еще хотите вывести на консоль здесь, что нужно сделать.Поскольку NODE не может декодировать gzip по умолчанию напрямую (не с chakram, это просто платформа для тестирования API), вы можете использовать zlib для этого.Пожалуйста, найдите пример фрагмента

    const zlib = require('zlib');

describe('Hits required API',()=>{

    before(()=>{
        return chakram.wait(api_response = chakram.get(url,options));
    });

    it('displayes response',()=>{
        return api_response.then((t_resp)=>{
            zlib.gunzip(t_resp, function(err, dezipped) {
                console.log(dezipped);
            });
        });
    });
...