--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

Есть специалисты по php? нужна помощь.

Нужен совет (поиск решения проблемы. не для купли-продажи)
177
25
С друзьями на NN.RU
В социальных сетях
Поделиться
Решил я получать данные через javascript напрямую с сервера.
Поднял на левом порту (допустим 8080) сервер nodejs, который по запросу на определённый урл отдаёт данные в json. Проверил: в браузере открывается, всё работает.

Пишу html-страницу, вставляю код клиента - не выходит каменный цветок. Статус = 0.
Гуглю. Этот статус возникает, когда идёт ?междоменный запрос? - то есть запрос к другому домену.
Выясняю, что в понятие ?домена? у браузера входит протокол (http и https - разные протоколы) и порт... Упс...

Ладно, думаю, отдам данные через php-страничку. Пишу echo json_encode($data); - открывается в браузере, но как-то не так, без кодировки (utf-8).

Пытаюсь передать данные в тестовую страничку - не взлетает. Мучаюсь, мучаюсь...
Затем решаю попробовать. В nginx прописываю на этот урл редирект на левый порт через proxy_pass - всё взлетает, данные получены.

И всё бы хорошо, но есть мнение, что реальный сайт будет крутиться на https и поднимать на хостинге nodejs не самая хорошая идея.

В общем вопрос: как правильно передать данные в json с помощью php?
Заранее спасибо.

P.S. Есть мнение, что php-страница некорректно передаёт заголовки. Точнее, она их вообще не передаёт.
T-U
16.07.2018
Афраний писал(а)
Пишу html-страницу, вставляю код клиента - не выходит каменный цветок. Статус = 0.

Начнем с того, что в html нет кодов ответа 0.
А у тебя, похоже, обычный тайм-аут ответа
stackoverflow.com/questions/19858251/what-does-http-status-code-0-mean

гугли, что у тебя с запросом не так.
URL проверь, мало ли )
номер порта не забыл добавить?
При чём тут html, если внутри него js-скрипт? урл проверен, номер порта не нужен (он по дефолту).

Код ответа возвращает это:

request.onerror = function() {
alert('Error! RS='+request.readyState+' status='+request.status);
}

И да, фокус с редиректом показал, что в коде клиента ошибок нет. Главное - отдать данные с сервера в правильном формате.
T-U
16.07.2018
Афраний писал(а)
При чём тут html, если внутри него js-скрипт?

В http нет кода ответа 0.
В СТАНДАРТНОМ http нет.

А при использовании javscript-функции XMLHttpRequest она вполне может вернуть такой код.
И да, проблема решена подсовыванием правильного урла. Вопрос теперь в том, чтобы делать правильный урл без костылей.
T-U
16.07.2018
Афраний писал(а)
В СТАНДАРТНОМ http нет.

Шо есть "нестандартный http"? в каком rfc оно описано?

Афраний писал(а)
А при использовании javscript-функции XMLHttpRequest она вполне может вернуть такой код.

Это не код http-ответа, это статус функции, выполняющей запрос.

Афраний писал(а)
И да, проблема решена подсовыванием правильного урла.

Что и требовалось доказать.
Это статус ОТВЕТА функции. Если всё нормально, то код ответа 200.
Что по странной случайности совпадает с типовым кодом html

Просто 0 как бы намекает на нетиповой ответ и подсказывает, где лежат грабли.

Гугл подсказывает, что можно выполнять междоменные запросы, если пропатчить браузер.
...но если делаешь сайт, то каждому клиенту браузер патчить не будешь, правильно?
T-U
16.07.2018
Афраний писал(а)
Это статус ОТВЕТА функции

Блин. Статус ответа функции и статус самого http-ответа - это РАЗНЫЕ статусы (коды). Иногда по случайности они совпадают. Но не более.
Не буду спорить, изучайте:
developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/status

The read-only XMLHttpRequest.status property returns the numerical status code of the response of the XMLHttpRequest. status will be an unsigned short. Before the request is complete, the value of status will be 0. It is worth noting that browsers report a status of 0 in case of XMLHttpRequest errors too.

The status codes returned are the standard HTTP status codes. For example, status 200 denotes a successful request. If the server response doesn't explicitly specify a status code, XMLHttpRequest.status will assume the default value of 200.
Ну так и пиши понятней, я тоже удивился что за код ответа 0.
Так я и написал, что этот код функция возвращает, если браузер берёт данные не из того домена, не с того порта или не по тому протоколу.

Если js-код размещён в файле, к которому идёт обращение по урлу: http: // testsite/ test. html (пробелы убрать),
то и XMLHttpRequest должен брать данные по https (не https), с testsite, с порта по умолчанию.
http: // testsite:8080 /data не прокатывает
а вот http: // testsite /data.php - работает на ура.

Но данные нужны в правильном формате, о чём и вопрос был.
T-U
16.07.2018
Афраний писал(а)
Не буду спорить, изучайте:

И? В каком месте это меня опровергает?
А меня? Функция стандартные html-коды возвращает?
А 0 возвращает при нетиповых ситуациях.

Это не случайное совпадение, такое поведение задумано разработчиком.
А спорить о нюансах, интерпретациях и трактовках можно долго... И к терминологии придираться.

Я же сказал: эта проблема уже решена, осталось убрать костыли.
Спасибо, разобрался. Дело было в пробелах после запятых

Массив [0, "текст1", 1 и так далее не воспринимался.
А nodejs отдавал его в правильном формате.

Финт ушами.
1. Прямо из браузера (из данных nodejs) берём массив и напрямую вставляем его в php

Вуаля!
$data='[0,"текст1",1...]';
echo $data;
// именно так, без всяких json_encode

И всё, клиент данные получает и выводит!
nodejs ради того чтобы отдавать json на ajax запросы лишняя сущность.

Лучше всё же использовать json_encode, если данные динамические, иначе может случайно в строке попасться неэкранированный специальный символ (банально кавычка, например) и все сломается.
Так о том и речь. Не хочу я nodejs запускать, хочу получать динамические данные прямо из php-скрипта.
Учусь, как это правильно делать.

А с json_encode пока не получается. Он кавычки бекслешем экранирует. И данные в свои кавычки берёт.
Ещё и юникод кодировал, пока я флаг JSON_UNESCAPED_UNICODE не выставил.

Зато чистые данные отправляются и кушаются на ура. А спецсимволы...
Проще на них проверку сделать, чтобы валидность данных гарантировать.
А с json_encode пока не получается. Он кавычки
бекслешем экранирует

И правильно делает.

Ты можешь коротко объяснить какие входные данные и откуда и какой нужен результат, чтобы поток мыслей не парсить?
Пока я просто пытаюсь передать массив.
Код сервера и клиента --->
Картинки не отвечают на вопрос. Данные в $regions откуда берутся? Почему они в коде так вот статикой, а не читаются из БД, например?

C json_encode всё просто:
$data = array(″Москва″, ″Санкт-Петербург″, ″Нижний Новгород″);
$json = json_encode($data);

ХЗ как тут можно проблемы получить.
Вариант для современных версий РНР:

$data = [″Москва″, ″Санкт-Петербург″, ″Нижний Новгород″]; // как в javascript
$json = json_encode($data);


Дальше просто echo $json;
BrainFucker писал(а)
Картинки не отвечают на вопрос. Данные в $regions откуда берутся? Почему они в коде так вот статикой, а не читаются из БД, например?
Потому что из БД их брать не проблема, а я сейчас изучаю саму технологию передачи этих данных.

Меняю echo $regions;
на echo json_encode(regions);
получаю: --->
У тебя $regions по прежнему как здесь является строкой, а не массивом? cstor.nn2.ru/forum/data/forum/files/2018-07/209671973-code-server.jpg

Ну и Content-Type конечно тоже надо выставить соответствующий, я не стал подробно расписывать.
JSON_UNESCAPED_UNICODE можно включать, можно нет, это не важно.
Спасибо, помогло!
Я как-то не учёл, что массив для js - это строка в php.
Убрал кавычки (сделал $regions массивом) - и всё взлетело.

Данные в браузере, конечно, выглядят криво, но главное - что их клиент понимает.
Просто надо понимать что json это сериализация данных в строку. То есть представление объектов (массивов) в виде строки. Это аналог того что выдаёт PHP функция serialize(), только в другом формате, который понимает javascript.
Именно этого я и пытался добиться. Спасибо!

Теперь можно писать свои виджеты на js и обновлять в них данные без перезагрузки страницы.
Вот как выглядят данные в браузере и вот как выглядит результат --->
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов
Материнские платы на запчасти и не только

Материнские платы на запчасти и не только Материнские платы и другие комплектующие Отправка в регионы после оплаты. Транспортной...
Цена: 3 000 руб.

Дорого куплю новые картриджи от лазерных и струйных

РЕАЛЬНО Дорого куплю новые картриджи от лазерных и струйных принтеров и копиров (НР, Canon, Samsung, Xerox, OCE и др.) всех моделей....
Цена: 7 777 руб.

Принтер лазерный Avision AP30A

Avision AP30A лазерный принтер черно-белая печать формат A4, 33 стр/мин, 128 Мб, дуплекс, лоток 250 листов и многоцелевой лоток с...
Цена: 9 900 руб.

Продаю факс (ы) Panasonic– FT932/982

Продаю факс (ы) Panasonic– FT932/982: термоперенос, термобумага, А4
Цена: 350 руб.