- Протокол HTTP и работа с заголовками
- Как работает HTTP
- Работа с заголовками в PHP
- Получение тела запроса
- Получение заголовков запроса
- Добавление/изменение заголовков ответа
- Управление телом ответа
- Параметры запроса
- Из чего состоит URI
- Параметры запроса — как внешние переменные
- Получение параметров запроса
- Формирование URI с параметрами запроса
- Html how to get ajax response in php
- How to return PHP response to HTML page using AJAX
- How to get the response data in ajax call
- Why does AJAX GET response from PHP have HTML tags?
- How to output the response HTML data by a jQuery AJAX request?
Протокол HTTP и работа с заголовками
Весь современный веб построен на модели взаимодействия клиента и сервера. Как она работает:
- браузер пользователя (клиент) отправляет на сервер запрос с адресом сайта (URL);
- сервер получает запрос и отдаёт клиенту запрошенный контент.
Для реализации процесса используется универсальный протокол HTTP.
Как работает HTTP
Программировать на PHP можно и без знания протокола HTTP. Но для решения ряда задач нужно знать, как именно работает веб-сервер. Ведь PHP — это в первую очередь серверный язык программирования.
👉🏼 Протокол HTTP очень прост и состоит из двух частей:
Сначала идёт список заголовков, затем пустая строка, после неё (если есть) тело запроса/ответа.
И клиент, и сервер могут посылать друг другу заголовки и тело ответа. У клиента доступные заголовки будут одни, у сервера — другие. Рассмотрим, как выглядит работа по протоколу HTTP, когда пользователь хочет загрузить главную страницу социальной сети «ВКонтакте».
- Браузер пользователя устанавливает соединение с сервером vk.com и отправляет следующий запрос:
- Сервер принимает запрос и отправляет ответ:
- Браузер принимает ответ и показывает готовую страницу.
Нам интересен самый первый шаг, где браузер инициирует запрос к серверу vk.com.
Здесь определяется несколько важных параметров:
GET — это метод (глагол), который применяется для доступа к указанной странице. GET используется очень часто, потому что говорит серверу о том, что клиент хочет прочитать указанный документ. Есть и другие методы, один из них мы рассмотрим уже в следующем разделе.
После метода идёт указание на адрес страницы — URI (универсальный идентификатор ресурса). Мы запрашиваем главную страницу сайта, поэтому используется просто слэш — / . В конце строки указана версия протокола, почти всегда это будет HTTP/1.1 .
После строки с указанием основных параметров следует перечисление заголовков. Они передают серверу дополнительную полезную информацию: название и версию браузера, язык, кодировку, параметры кэширования и так далее.
Среди заголовков, которые передаются при каждом запросе, есть один обязательный и самый важный — это заголовок Host . Он определяет адрес домена, который запрашивает браузер клиента.
Сервер, получив запрос, ищет у себя сайт с доменом из заголовка Host , а также указанную страницу. Если запрошенный сайт и страница найдены, клиенту отправляется ответ: HTTP/1.1 200 OK . Такой ответ означает, что документ найден и будет отправлен клиенту.
👉 Общая структура стартовой строки ответа:
HTTP/Версия Код состояния Пояснение
Больше всего здесь интересен именно код состояния, он же код ответа сервера. В этом примере код ответа — 200, что означает: сервер работает, документ найден и будет передан клиенту.
Не всегда всё идёт гладко.
Например, запрошенный документ отсутствует или сервер перегружен. В таком случае клиент не получит контент, а код ответа будет отличным от 200.
- 404 — если сервер доступен, но запрошенный документ не найден;
- 503 — если сервер не может обрабатывать запросы по техническим причинам.
Спецификация HTTP 1.1 определяет 40 различных кодов HTTP.
После стартовой строки следуют заголовки, а затем тело ответа.
Работа с заголовками в PHP
В PHP есть все возможности для взаимодействия с HTTP:
- Получение тела запроса;
- Получение заголовков запроса;
- Добавление/изменение заголовков ответа;
- Управление телом ответа.
Получение тела запроса
Тело запроса — это информация, которую передал браузер при запросе страницы. Но тело запроса присутствует только, если браузер запросил страницу методом POST . Дело в том, что POST — это метод, специально предназначенный для отправки данных на сайт. Чаще всего метод POST браузер задействует в момент отправки формы. В этом случае телом запроса будет содержимое формы.
В PHP-сценарии все данные отправленной формы будут доступны в специальном массиве $_POST . Более подробно об этом написано в следующей главе, посвящённой формам.
Получение заголовков запроса
Напомним ещё раз, что заголовки запроса — это метаинформация, отправленная браузером при запросе сценария.
PHP автоматически извлекает такие заголовки и помещает их в специальный массив — $_SERVER . Стоит отметить, что в этом массиве, помимо заголовков, есть и другая информация. Значения заголовков запроса находятся под ключами, которые начинаются с HTTP_ . Подробно всё содержимое этого массива описано в официальной документации.
Пример, как получить предыдущую страницу, с которой перешёл пользователь:
Добавление/изменение заголовков ответа
В PHP-сценарии можно управлять всеми заголовками ответа, которые попадут к пользователю вместе с контентом страницы. Это возможно, потому что PHP работает на стороне веб-сервера и имеет с ним очень тесную интеграцию. Вот примеры сценариев, когда пригодится управление заголовками ответа:
- Кэширование;
- Переадресация пользователя;
- Установка cookies;
- Отправка файлов;
- Передача дополнительной информации браузеру.
Заголовки ответа нужны для выполнения множества важных задач.
В PHP есть функция для отправки или смены заголовков: header() .
Она принимает имя и значение заголовка и добавляет его в список из всех заголовков, которые уйдут в браузер пользователя после окончания работы сценария.
Например, так выполняется перенаправление пользователя на другую страницу:
За переадресацию отвечает заголовок с именем Location , а через двоеточие задаётся значение — адрес страницы для перехода.
Важное замечание по использованию заголовков
Есть одно ограничение: заголовки нельзя отправлять, если пользователю к этому моменту уже отправили любой контент. То есть если показать что-то на экране, например, через функцию print() , то после этого заголовки поменять уже не получится.
Управление телом ответа
Всё, что PHP выводит на экран, является содержимым ответа. Иными словами, вызовы функций print , echo или показ текста через шорт-теги являются телом ответа, которое попадает в браузер пользователю.
Параметры запроса
Мы привыкли, что на нашем сайте каждый PHP-сценарий отвечает за одну страницу. Посетитель сайта вводит в адресную строку путь, который состоит из имени домена и имени PHP-сценария. Например, так: http://weather-diary.ru/day.php .
Но как быть, если одна страница должна показывать разную информацию?
На сайте дневника наблюдений за погодой мы сделали отдельную страницу, чтобы показывать на ней информацию о погоде из истории за один конкретный день. То есть страница одна, но показывает разные данные, в зависимости от выбранного дня.
Также пользователи хотят добавить в закладки адреса страниц с нужными им днями. Получается, что, имея только один сценарий, сделать страницу, способную показывать дневник погоды за любой день невозможно? Вовсе нет!
Из чего состоит URI
URI — это уникальный идентификатор ресурса. Ресурс в нашем случае — это полный путь до страницы сайта. И вот как может выглядеть ресурс для показа погоды за конкретный день:
Разберём, из чего состоит этот URI.
Здесь есть имя домена: weather-diary.ru .
Затем идёт имя сценария: day.php .
А всё, что идёт после — это параметры запроса.
Параметры запроса — это как бы дополнительные атрибуты адреса страницы. Они отделяются от имени страницы знаком запроса. В примере выше параметр запроса только один: date=2017-10-30.
Имя этого параметра: date , значение: 2017-10-15 .
Параметров запроса может быть несколько, тогда они разделяются знаком амперсанда: ?date=2017-10-15&tscale=celsius .
В примере выше указывается два аргумента: дата и единица измерения температуры.
Параметры запроса — как внешние переменные
Теперь в адресе страницы используются параметры запроса, но какая нам от этого польза? Она состоит в том, что если имя страницы вызывает к исполнению соответствующий PHP-сценарий, то параметры запроса превращаются в специальные внешние переменные в этом сценарии. То есть если в адресе присутствуют такие параметры, то их легко получить внутри кода сценария и выполнить с ними какие-нибудь действия. Например, показать погоду за конкретный день в выбранных единицах измерения.
Получение параметров запроса
Если есть внешние переменные, то как их прочитать?
Все параметры запроса находятся в специальном, ассоциативном массиве $_GET , а значит, сценарий, вызванный с таким адресом: day.php?date=2017-10-15&tscale=celsius будет иметь в этом массиве два значения с ключами date и scale .
Запрос на получение данных за выбранный день выглядит так:
В первой строчке примера выше мы получаем значение параметра date , а если он отсутствует, то используем текущую дату в качестве выбранного дня.
Никогда не полагайтесь на существование параметра в массиве $_GET и делайте проверку либо функцией isset() , либо как в этом примере.
В этом задании вы сможете потренироваться использовать $_GET .
Формирование URI с параметрами запроса
Иногда нужно совершить обратную операцию: сформировать адрес страницы, включив туда нужные параметры запроса из массива.
Скажем, на странице погодного дневника надо поставить ссылку на следующий и предыдущий день. Нужно также сохранить выбранную единицу измерений. То есть необходимо сохранить текущие параметры запроса, поменять значение одного из них (день), и сформировать новую ссылку.
Вот как это можно сделать:
Здесь мы использовали две функции:
- basename(__FILE__) — получает имя текущего сценария;
- http_build_query() — преобразует ассоциативный массив в строку запроса.
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Html how to get ajax response in php
Solution: Your PHP script that return data to the ajax call should be treated pretty much like a subroutine and not a web page. That means you cannot or whatever you want; you should collect your data in an array or object and then only once output that like: Solution 3: Echo the content inside results.php page.
How to return PHP response to HTML page using AJAX
Try using a more flexible jQuery ajax. I use this version if ajax because I can change it to get and post very easily. I have tested this method and it works with your form:
This may be because you are handling your form based on the behavior of a button. You should be listening for the onSubmit event of the form and preventing that from firing.
$("#register-form").submit( function( e ) < e.preventDefault(); $.post( $("#register-form").attr("action"), $("#register-form :input").serializeArray(), function(signup_data)< $("#signup-test").html(signup_data); >); clearInput(); >);
I solved it with the following script, hope it would help someone. The problem with all the scripts which I tried is, they don’t have XMLHttpRequest permission to POST data and get the data back from PHP(server side in my case).
So, XMLHttpRequest is a must for Ajax to Get or Post data «CROSS_DOMAIN».
function signup()< var firstname = document.getElementById("firstname").value; var lastname = document.getElementById("lastname").value; var uname = document.getElementById("uname").value; var email = document.getElementById("email").value; var email_repeat = document.getElementById("email_repeat").value; var password = document.getElementById("password").value; if (fname == "") < document.getElementById("fname").style.background = "rgba(244,67,54,0.45)"; document.getElementById("fnamestatus").innerHTML = "2-25
"; > else if (email != email_repeat) < document.getElementById("email").style.background = "rgba(244,67,54,0.45)"; document.getElementById("email_repeat").style.background = "rgba(244,67,54,0.45)"; alert("Your email fields do not match"); >else < var signup_ajax = new XMLHttpRequest(); signup_ajax.open("POST", "URL which you want to post data", true); signup_ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); signup_ajax.onreadystatechange = function () < if (signup_ajax.readyState == 4 && signup_ajax.status == 200) < if (signup_ajax.responseText = "Success")< alert("Account created"); >else if (signup_ajax.responseText = "Try again.") < window.scrollTo(0,0); alert("Try again."); >> > signup_ajax.send("fname=" +fname+ "&lname=" +lname+ "&uname=" +uname+ "&email=" +email+ "&email_repeat=" +email_repeat+ "&password=" +password ); > >
PHP(I’m just posting the basic php, you can always add as may validations as you need) :
if(isset($_POST["uname"])) < $fname = @$_POST['firstname']; $lname = @$_POST['lastname']; $uname = @$_POST['uname']; $email = @$_POST['email']; $email_repeat = @$_POST['email_repeat']; $password = @$_POST['password']; //Sign-Up form validation if($_POST) < $squery = mysql_query("INSERT INTO users VALUES ('','$uname','$fname','$lname','$email','$password')" ); echo 'Sucess'; >else echo 'Try again.'; >
Only change what I did to my HTML Form is :
How to return a variable in an ajax response?, To get the file name back to the script, simply echo it out in php! I would use JSON as a wrapper for your response, so that you can send back multiple
How to get the response data in ajax call
$name=$_REQUEST['fname']; $email=$_REQUEST['email']; echo $name." ".$email;
You are setting the dataType to json so you must ensure that you only return valid json.
That means you cannot echo or print whatever you want; you should collect your data in an array or object and then only once output that like:
echo json_encode($your_data);
Echo the content inside results.php page.
echo "two fields $first_field , $second_field successfully inserted. " ;
This content results as an ajax response and stores in the data variable .
How to get the value of Ajax response in jQuery, response is an array with an object. Just use the regular ways to access the elements/properties of those data types. – Andreas
Why does AJAX GET response from PHP have HTML tags?
Your PHP script that return data to the ajax call should be treated pretty much like a subroutine and not a web page. If you have HTML in that script, it will also be sent back to the browser as part of the total response.
So amend the script to this i.e. remove all the HTML you had in it
"test"); echo (json_encode($response); ?>
Unable to get response from php return in ajax request, I am trying to access the output from php code to jquery ajax. But I donot know why It is returning me whole page html including the result.
How to output the response HTML data by a jQuery AJAX request?
You can use the success also
The syntax for complete is
$.ajax(< url: 'php/addToShoppingCart.php', type: 'POST', dataType: 'html', data: content, >).complete(function (data) < $('#shop section table tbody').append(data); >);
Why am I getting HTML response from jquery ajax call, Check the Network tab in your Developer Console, and look at the response tab of the request to find out exactly what it’s returning. · You’re