JSON вывод пуст, но только в браузере - PullRequest
0 голосов
/ 20 июня 2020

Это может быть одна из самых странных проблем, с которыми я столкнулся, и я не могу ее понять ...

У меня есть плагин WordPress, который действует как конечная точка API для мобильного приложения. На сайте этого клиента есть одна статья, которая нарушает кодировку вывода JSON. Когда я вызываю API через CURL, я получаю пустой результат, а когда я вызываю API через веб-браузер, я получаю белый экран. Но если я выведу закодированные данные JSON в файл, это сработает.

Вот все подробности, которые я могу придумать ...

1) Сервер NGINX w / PHP 7.0 (да, я знаю, его нужно обновить) . 2) Я не получаю ошибок в журналах NGINX или PHP, а json_last_error не возвращает ошибок.

3a) Вызов проблемы: https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345 3b) Фактический результат: https://landline.media/json-notworking.txt

4a) Пример рабочего вызова: https://landline.media/?unipress-api=get-article&article-id=23109&device-id=12345 4b) Фактический выход: https://landline.media/json-working.txt

Я настраиваю пара альтернативных выходов с вызовом API, для тестирования ...

print_r output (not json_encoded): https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&printr=true

Когда я отключил Object-> formatted_post_content , вызов json_encoded работает: https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&unset=true

Когда я просто выводю Object-> formatted_post_content, вызов json_encoded не работает: https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&formatted_post_content=true

Когда я просто выводю подстроку json_encoded Object-> formatted_post_content, вызов json_encoded работает (но только для определенного диапазона подстрок, и они даже перекрываются, что очень странно) ...

substr (0 , 9892): https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&str1=true

substr (9011, 8993): https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&str2=true

substr (17042, 10047): https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&str3=true

substr (21806, 9217): https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&str4=true

Вот где я перестал проверять диапазоны, потому что strlen - 134037 и я у меня нет времени разбираться в них :-D ..

Ладно, так что даже странно, если я использую любой из этих substr для замены исходного formatted_post_content и json кодирует весь объект, он по-прежнему не работает ... но я могу использовать меньший substr (), и он работает ... Я нашел только первый ... substr (0, 3175): https://landline.media/?unipress-api=get-article&article-id=19131&device-id=12345&substr=true

Я тоже пробовал ...

удаление всех невидимых символов из formatted_post_content preg_replace( '/[\x00-\x1F\x7F\xA0]/u', '', Object->formatted_post_content );.

вывод содержимого файла json -notworking.txt.

. .. ни то, ни другое не помогло.

FWIW, это код, с которым я тестировал ...

        function api_response( $response ) {

            header( 'HTTP/1.1 ' . $response['http_code'] . ' ' . $this->http_code_string( $response['http_code'] ) );
            header( 'Content-type: application/json' );

            if ( ! empty( $_GET['printr'] ) ) {

                print_r( $response['body'] );

            } else if ( !empty( $_GET['unset'] ) ) {

                unset( $response['body']->formatted_post_content );
                echo json_encode( $response['body'] );

            } else if ( !empty( $_GET['formatted_post_content'] ) ) {

                echo json_encode( $response['body']->formatted_post_content );

            } else if ( !empty( $_GET['str1'] ) ) {

                $response['body']->formatted_post_content = substr( $response['body']->formatted_post_content, 0, 9892 );
                echo json_encode( $response['body']->formatted_post_content );

            } else if ( !empty( $_GET['str2'] ) ) {

                $response['body']->formatted_post_content = substr( $response['body']->formatted_post_content, 9011, 8993 );
                echo json_encode( $response['body']->formatted_post_content );

            } else if ( !empty( $_GET['str3'] ) ) {

                $response['body']->formatted_post_content = substr( $response['body']->formatted_post_content, 17042, 10047 );
                echo json_encode( $response['body']->formatted_post_content );

            } else if ( !empty( $_GET['str4'] ) ) {

                $response['body']->formatted_post_content = substr( $response['body']->formatted_post_content, 21806, 9217 );
                echo json_encode( $response['body']->formatted_post_content );

            } else if ( ! empty( $_GET['substr'] ) ) {

                $response['body']->formatted_post_content = substr( $response['body']->formatted_post_content, 0, 3175 );
                echo json_encode( $response['body'] );

            } else {

                echo json_encode( $response['body'] );

            }
            exit;

        }

Если у кого-то есть идеи, я буду очень признателен. Спасибо!

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