Это может быть одна из самых странных проблем, с которыми я столкнулся, и я не могу ее понять ...
У меня есть плагин 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;
}
Если у кого-то есть идеи, я буду очень признателен. Спасибо!