Перейти к содержимому

Как отправить данные на сервер html

  • автор:

Отправка данных html-формы в веб-API ASP.NET: данные с кодом формы

В этой статье показано, как отправлять данные form-urlencoded в контроллер веб-API.

  • Обзор HTML-форм
  • Отправка сложных типов
  • Отправка данных формы с помощью AJAX
  • Отправка простых типов

Обзор HTML-форм

Html-формы используют get или POST для отправки данных на сервер. Атрибут method элемента формы предоставляет метод HTTP:

По умолчанию используется метод GET. Если форма использует GET, данные формы кодируются в URI в виде строки запроса. Если в форме используется POST, данные формы помещаются в текст запроса. Для данных POSTed атрибут enctype задает формат текста запроса:

enctype Описание
application/x-www-form-urlencoded Данные формы кодируются в виде пар «имя-значение», аналогично строке запроса URI. Это формат по умолчанию для POST.
multipart/form-data Данные формы кодируются как составное сообщение MIME. Используйте этот формат при отправке файла на сервер.

В части 1 этой статьи рассматривается формат x-www-form-urlencoded. Часть 2 описывает многокомпонентный MIME.

Отправка сложных типов

Как правило, отправляется сложный тип, состоящий из значений, взятых из нескольких элементов управления формы. Рассмотрим следующую модель, представляющую обновление состояния:

namespace FormEncode.Models < using System; using System.ComponentModel.DataAnnotations; public class Update < [Required] [MaxLength(140)] public string Status < get; set; >public DateTime Date < get; set; >> > 

Ниже приведен контроллер веб-API, который принимает Update объект через POST.

namespace FormEncode.Controllers < using FormEncode.Models; using System; using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http; public class UpdatesController : ApiController < static readonly Dictionaryupdates = new Dictionary(); [HttpPost] [ActionName("Complex")] public HttpResponseMessage PostComplex(Update update) < if (ModelState.IsValid && update != null) < // Convert any HTML markup in the status text. update.Status = HttpUtility.HtmlEncode(update.Status); // Assign a new ID. var updates[id] = update; // Create a 201 response. var response = new HttpResponseMessage(HttpStatusCode.Created) < Content = new StringContent(update.Status) >; response.Headers.Location = new Uri(Url.Link("DefaultApi", new < action = "status", >)); return response; > else < return Request.CreateResponse(HttpStatusCode.BadRequest); >> [HttpGet] public Update Status(Guid id) < Update update; if (updates.TryGetValue(id, out update)) < return update; >else < throw new HttpResponseException(HttpStatusCode.NotFound); >> > > 

Этот контроллер использует маршрутизацию на основе действий, поэтому шаблон маршрута — api///. Клиент будет отправлять данные в «/api/updates/complex».

Теперь давайте напишем HTML-форму, чтобы пользователи отправили обновление состояния.

Complex Type

Обратите внимание, что атрибут действия в форме является универсальным кодом ресурса (URI) действия контроллера. Ниже приведена форма с некоторыми значениями, введенными в:

Снимок экрана: форма сложного типа H T M L с полем

Когда пользователь нажимает кнопку Отправить, браузер отправляет HTTP-запрос, аналогичный следующему:

POST http://localhost:38899/api/updates/complex HTTP/1.1 Accept: text/html, application/xhtml+xml, */* User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) Content-Type: application/x-www-form-urlencoded Content-Length: 47 status=Shopping+at+the+mall.&date=6%2F15%2F2012 

Обратите внимание, что текст запроса содержит данные формы, отформатированные в виде пар «имя-значение». Веб-API автоматически преобразует пары «имя-значение» в экземпляр Update класса .

Отправка данных формы с помощью AJAX

Когда пользователь отправляет форму, браузер переходит с текущей страницы и отображает текст ответного сообщения. Это нормально, если ответ представляет собой HTML-страницу. Однако при использовании веб-API текст ответа обычно либо пуст, либо содержит структурированные данные, такие как JSON. В этом случае имеет смысл отправить данные формы с помощью запроса AJAX, чтобы страница ранее обрабатывала ответ.

В следующем коде показано, как публиковать данные формы с помощью jQuery.

  

Функция jQuery submit заменяет действие формы новой функцией. Это переопределяет поведение по умолчанию кнопки Отправить. Функция serialize сериализует данные формы в пары «имя-значение». Чтобы отправить данные формы на сервер, вызовите . $.post()

По завершении .success() запроса обработчик или .error() выводит пользователю соответствующее сообщение.

Снимок экрана: форма сложного типа H T M L с ошибкой локального узла, отображаемой для пользователя полужирным шрифтом.

Отправка простых типов

В предыдущих разделах мы отправили сложный тип, который веб-API десериализировал в экземпляр класса модели. Вы также можете отправлять простые типы, такие как строка.

Перед отправкой простого типа рекомендуется упаковать значение в сложный тип. Это дает преимущества проверки модели на стороне сервера и упрощает расширение модели при необходимости.

Основные действия по отправке простого типа одинаковы, но есть два незначительных отличия. Во-первых, в контроллере необходимо украсить имя параметра атрибутом FromBody .

[HttpPost] [ActionName("Simple")] public HttpResponseMessage PostSimple([FromBody] string value) < if (value != null) < Update update = new Update() < Status = HttpUtility.HtmlEncode(value), Date = DateTime.UtcNow >; var updates[id] = update; var response = new HttpResponseMessage(HttpStatusCode.Created) < Content = new StringContent(update.Status) >; response.Headers.Location = new Uri(Url.Link("DefaultApi", new < action = "status", >)); return response; > else

По умолчанию веб-API пытается получить простые типы из URI запроса. Атрибут FromBody сообщает веб-API, что нужно считывать значение из текста запроса.

Веб-API считывает текст ответа не более одного раза, поэтому только один параметр действия может поступать из текста запроса. Если необходимо получить несколько значений из текста запроса, определите сложный тип.

Во-вторых, клиенту необходимо отправить значение в следующем формате:

=value 

В частности, часть имени пары «имя-значение» должна быть пустой для простого типа. Не все браузеры поддерживают это для HTML-форм, но этот формат создается в скрипте следующим образом:

$.post('api/updates/simple', < "": $('#status1').val() >); 

Ниже приведен пример формы:

Simple Type

Ниже приведен скрипт для отправки значения формы. Единственное отличие от предыдущего сценария заключается в том, что аргумент передается в функцию post .

$('#form2').submit(function () < var jqxhr = $.post('api/updates/simple', < "": $('#status1').val() >) .success(function () < var loc = jqxhr.getResponseHeader('Location'); var a = $('', < href: loc, text: loc >); $('#message').html(a); >) .error(function () < $('#message').html("Error posting the update."); >); return false; >); 

Для отправки массива простых типов можно использовать тот же подход:

$.post('api/updates/postlist', < "": ["update one", "update two", "update three"] >); 

Отправка данных на сервер

Подскажите, как сделать так, чтобы форма, которую заполняет участник отравлялась на e-mail администратора?

Отслеживать
задан 12 сен 2011 в 4:43
145 1 1 золотой знак 4 4 серебряных знака 20 20 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

mail.php

if(isset($_POST['mess']))< //проверки на правильность данных $admin_mail = '[email protected]'; $subj = 'Новое сообщение'; $mess = htmlspecialchars($_POST['mess']); $headers = 'From: [email protected]' . PHP_EOL; $headers .= 'Content-type: text/plain; charset=utf-8' . PHP_EOL; if(mail($admin_mail, $subj, $mess, $headers)) < //сообщение было выслано >else < //ошибка при отправке >> 

Отслеживать
ответ дан 12 сен 2011 в 6:42
14.7k 1 1 золотой знак 26 26 серебряных знаков 48 48 бронзовых знаков

 @e-mail">

Отслеживать
ответ дан 12 сен 2011 в 5:28
Monstrs-Inc Monstrs-Inc
232 1 1 золотой знак 4 4 серебряных знака 14 14 бронзовых знаков

  • html
  • mysql
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.26.3951

Как отправлять запросы на сервер, при этом не перезагружая страницу

Ниже приведены несколько примеров, для которых может быть полезна отправка запросов на сервер без перезагрузки страницы:

  1. Динамическое обновление содержимого страницы: например, приложения вроде Facebook и Twitter обновляют содержимое ленты новостей без перезагрузки страницы, используя AJAX.
  2. Проверка допустимости формы: AJAX может использоваться для отправки данных формы на сервер для проверки их корректности, без перезагрузки страницы.
  3. Поиск: AJAX может использоваться для предоставления результата поиска на основе параметров, введенных пользователем, без перезагрузки страницы.
  4. Добавление товаров в корзину: AJAX может использоваться для добавления товаров в корзину без перезагрузки страницы.
  5. Динамическое создание элементов на странице: AJAX может использоваться для создания элементов на странице на основе данных, полученных с сервера, без перезагрузки страницы.

Подключение js jquery

Для того, чтобы подключить js jquery к вашей HTML воспользоваться кодом ,который нужно вставить в теге :

Написание первого ALAX запроса

Чтобы отправить ALAX запрос , нужно вставить следующий js код на страницу:

$.ajax(< type: "POST", // Метод запроса url: "/musik/like/1", // url запроса data: < // Параметры для запроса 'id': id, >, success: function(response) < // Код который выполнится для удачного запроса console.log(response); >, error: function(response) < // Код который выполнится при ошибке запроса console.log(response); >>);

Это и весь код для выполнения асинхронного запроса ,который вставляется в тег или в раннее подключенный js файл

CSRFTOKEN

CSRF токен (Cross-Site Request Forgery) — это механизм защиты от атак подделки межсайтовых запросов.

Когда пользователь взаимодействует с веб-приложением, браузер отправляет запросы на сервер, включая все куки, сохраненные в браузере для этого домена. Если злоумышленник создаст поддельный запрос на сайт, который будет содержать вредоносный код, и если пользователь случайно выполнит этот запрос, то браузер отправит запрос с куками, и сервер примет его как запрос от подлинного пользователя.

CSRF токен решает эту проблему, добавляя уникальный токен к каждому запросу, который проверяется на сервере. Таким образом, если запрос не содержит действительного CSRF токена, сервер отклонит его. Это позволяет защитить веб-приложение от атак подделки межсайтовых запросов.

Тот, кто работает с Python Django, знает, что для отправки POST запросов нужен CSRF токен, поэтому нужно получить этот токен и вставить его в параметры запроса.

Функция для получения токена:

function getCookie(name) < /*"Эта функция для получения куки по имени" */ var cookieValue = null; if (document.cookie && document.cookie !== '') < var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) < var cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) < cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; >> > return cookieValue; > 

Присваиваем переменной csrftoken значение CSRFTOKEN

var csrftoken = getCookie('csrftoken');
  1. Затем мы используем $.ajaxSetup() для определения функции обратного вызова beforeSend , которая вызывается перед отправкой каждого асинхронного запроса. В этой функции мы проверяем, не является ли запрос типом GET , HEAD , OPTIONS или TRACE , и не является ли запрос пересечением доменов, и если нет, то мы устанавливаем заголовок X-CSRFToken в значение токена CSRF.
$.ajaxSetup( >

Передаем параметры в запрос ALAX

data: < 'X-CSRFToken': csrftoken>,
function getCookie(name) < var cookieValue = null; if (document.cookie && document.cookie !== '') < var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) < var cookie = cookies[i].trim(); // Найти имя куки, начинающееся с переданного имени if (cookie.substring(0, name.length + 1) === (name + '=')) < cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; >> > return cookieValue; > function like(id) < var csrftoken = getCookie('csrftoken'); $.ajaxSetup(> >); $.ajax(< type: "POST", // Метод запроса url: "/musik/like/1", // url запроса data: < // Параметры для запроса 'id': id, 'X-CSRFToken': csrftoken >, success: function(response) < // Код который выполнится для удачного запроса console.log(response); >, error: function(response) < // Код который выполнится при ошибке запроса console.log(response); >>); >

Обработчик на сервере

Обработчик асинхронного запроса и обычного ничем не отличаются, кроме возвращаемого объета.Так ,например обычный обработчик возвращает шаблон HTML,то обработчик асинхронного запроса должен возвращать json объект.Пример написан на Python Django.

def home(request): return render(request, 'main/home.html') #Возвращает обькт render (шаблон)
def like_musik(request, id): if request.method == "POST": #Логика функции return JsonResponse()#Возвращаем Json объект

Заключение

В ходе этой статьи мы узнали о технологии AJAX и научились при помощи него отправлять асинхронные запросы.

HTML: Отправка формы

Последним шагом в создании формы является добавление кнопки для отправки результата на сервер. Для этого, используя парный тег , создадим кнопку отправки:

 

После нажатия на кнопку «Отправить», данные будут переданы обработчику, который указан в атрибуте action (если не указан, то данные отправятся на эту же страницу). После отправки данных страница будет перезагружена.

Теперь, используя элементы форм из прошлых уроков, создадим форму с разными полями.

Форма поиска

Введите ваш запрос

Если вы нажмёте на кнопку «Искать», то страница перезагрузится и данные должны будут уйти в обработчик на эту же страницу. Так как обработчика нет, то никаких видимых результатов, кроме перезагрузки страницы, не произойдёт.

Задание

Создайте форму, у которой файл с обработчиком данных лежит по адресу /people . Внутри формы расположите следующие элементы:

  • 2 текстовых поля
  • Список с возможностью множественного выбора
  • Кнопку «Отправить»

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

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

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *