Отправка запроса и получение ответа

Последнее обновление: 17.05.2016

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

  • В зависимости от подхода содержимое заголовка content-type в AJAX-запросе может отличаться. По умолчанию при отправке формы через AJAX в jQuery для этого заголовка применяется значение application/x-www-form-urlencoded. Это значение используется для стандартного запроса POST.

    А при применении подхода REST API тот заголовок должен иметь значение application/json, если мы отправляем данные в формате JSON

  • Также в зависимости от подхода может отличаться содержимое формы. При отправке данных методом POST данные сериализуются в обычный объект JavaScript, который представляет набор пар ключ/значение. А при взаимодействии через JSON в REST API данные формы сериализуются в формат JSON.

    Поэтому в зависимости от подхода мы будем использовать разные функции Knockout для сериализации объектов.

Рассмотрим простейший пример взаимодействия Knockout с сервером. Для этого нам прежде всего надо определить некоторый функционал на стороне сервера с использованием одной из серверных технологий, который будет принимать и возвращать клиентскому коду некоторые данные.

Пусть сервер получает две строки (условно логин и пароль), инвертирует их задом наперед и возвращает клиенту.

Если мы на сервере работаем с PHP, то мы могли бы определить такой скрипт:

<?php

if(!isset($_POST['login']) || !isset($_POST['password'])) 
	header('HTTP/1.1 500 Internal Server Error');

$login = strrev($_POST['login']);
$password = strrev($_POST['password']);
$data = array("login"=>$login, "password"=>$password);
header('Content-Type: application/json');
echo json_encode($data);
?>

Если технологией стороны сервера является ASP.NET MVC 5, то мы могли бы определить в контроллере следующий метод для обработки запроса:

[HttpPost]
public JsonResult PostData(string login, string password)
{
    Response.AppendHeader("Access-Control-Allow-Origin", "*");
    login = new string( login.Reverse().ToArray<Char>());
    password = new string(password.Reverse().ToArray<Char>());
    return Json(new { login, password });
}

И теперь чтобы обращаться к серверу, определим следующий код клиентской стороны:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Работа с сервером в KnockoutJS</title>
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/knockout/knockout-3.4.0.js"></script>
</head>
<body>
<form data-bind="submit: submitHandler, with: user">
    <input type="text" name="login" data-bind="textInput: login" />
    <input type="text" name="password" data-bind="textInput: password" />
    <button type="submit">Отправить</button>
</form>
<p data-bind="text: ko.toJSON(user)"></p>
<script type="text/javascript">
function AppViewModel(){
	
	self=this;
	self.user = {
		login: ko.observable("login"),
		password: ko.observable("password")
	};
	self.submitHandler = function() {
		var userInfo = ko.toJS(self.user);
		$.ajax({
			//url: 'http://localhost:52321/home/postdata',
			url: 'http://localhost:8080/postdata.php',
			data: userInfo,
			type: 'POST',
			contentType: 'application/x-www-form-urlencoded'
		}).success(self.successHandler).error(self.errorHandler);
	};
	self.successHandler = function(data) {
		self.user.login(data.login);
		self.user.password(data.password);
		alert("Success!");
	};
	self.errorHandler = function() {
		alert("Error!");
	};
};
ko.applyBindings(new AppViewModel());
</script>
</body>
</html>

Здесь все основные данные инкапсулированы в свойстве self.user, к которым на форме установлена привязка. А обработчик отправки формы submitHandler выполняет с помощью jQuery ajax-запрос к серверу и обрабатывает полученные от сервера данные.

Как видно, в данном случае используется стандартный запрос POST. Заголовок contentType имеет значение application/x-www-form-urlencoded. А для сериализации отправляемых данных применяется функция ko.toJS().

В результате после нажатия на кнопку на сервер отправятся введенные в поля формы данные? и затем эти поля отобразят уже инвертированные значения:

Отправка на сервер в Knockout
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850