Одним из наиболее распространенных форматов передачи данных является формат JSON. Рассмотрим, как мы можем посылать и получить данные json в приложении на ASP.NET Core.
Для отправки json можно воспользоваться методом WriteAsJson()/WriteAsJsonAsync() объекта HttpResponse. Этот метод позволяет сериализовать переданные в него объекты в формат JSON и автоматически для заголовка "content-type" устанавливает значение "application/json; charset=utf-8":
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task Dim tom = New Person("Tom", 22) Await context.Response.WriteAsJsonAsync(tom) End Function) app.Run() End Sub Public Class Person Sub New(name As String, age As Integer) Me.Name = name Me.Age = age End Sub Public Property Name() As String Public Property Age() As Integer End Class End Module
Здесь определен класс Person, который представляет условного пользователя. В нем определены свойства Name (имя) и Age (возраст), и через конструктор класс получает значения для этих свойств. И в данном случае при получении запроса клиенту в ответ отправляется объект этого класса Person:
Но также для отправки json можно было бы использовать и стандартный метод WriteAsync()
:
app.Run(Async Function(context As HttpContext) As Task Dim response = context.Response response.Headers.ContentType = "application/json; charset=utf-8" Await response.WriteAsync("{'name':'Tom', 'age':37}") End Function)
Для получения из запроса данных в формате JSON в классе HttpRequest определен метод ReadFromJsonAsync(). Он позволяет сериализовать данные в объект определенного типа.
Например, создадим в проекте папку html, в которой определим новый файл index.html.
В файле index.html определим следующий код:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <h2>User form</h2> <div id="message"></div> <div> <p>Name: <br /> <input name="userName" id="userName" /> </p> <p>Age: <br /> <input name="userAge" id="userAge" type="number" /> </p> <button id="sendBtn">Send</button> </div> <script> document.getElementById("sendBtn").addEventListener("click", send); async function send() { const response = await fetch("/api/user", { method: "POST", headers: { "Accept": "application/json", "Content-Type": "application/json" }, body: JSON.stringify({ name: document.getElementById("userName").value, age: document.getElementById("userAge").value }) }); const message = await response.json(); document.getElementById("message").innerText = message.text; } </script> </body> </html>
Здесь по нажатию на кнопку с помощью функции fetch() по адресу "/api/user" будет отправляться объект со свойствами name и age,
значения для которых берутся из полей формы. В ответ от сервера веб-страница также получает объект в формате json, в котором имеется свойство text
-
свойство, которое хранит сообщение от сервера.
Теперь в файле Program.vb определим код для получения данных, отправляемых веб-страницей:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Run(Async Function(context As HttpContext) As Task Dim response = context.Response Dim request = context.Request If request.Path.Value = "/api/user" Then Dim responseText = "Некорректные данные" ' содержание сообщения по умолчанию If request.HasJsonContentType() Then ' если запрос содержим данные json Try Dim somePerson = Await request.ReadFromJsonAsync(Of Person)() ' получаем объект Person responseText = $"Name: {somePerson.Name} Age: {somePerson.Age}" Catch ex As Exception responseText = ex.Message End Try End If Await response.WriteAsJsonAsync(New With {.Text = responseText}) Else response.ContentType = "text/html; charset=utf-8" Await response.SendFileAsync("html/index.html") End If End Function) app.Run() End Sub Public Class Person Sub New(name As String, age As Integer) Me.Name = name Me.Age = age End Sub Public Property Name() As String Public Property Age() As Integer End Class End Module
В данном случае, если обращение идет по адресу "/api/user", то получаем данные в формате json. При обращениях по другим адресам просто посылаем веб-страницу index.html.
Стоит отметить, что если данные запроса не представляют объект JSON, то вызов метода ReadFromJsonAsync()
выльется в ошибку. И в этом случае предпочтительно
проверять на наличие json в запросе с помощью метода HasJsonContentType() он возвращает true
, если клиент прислал json.
If request.HasJsonContentType() Then ' если запрос содержим данные json ............... End If
Метод ReadFromJsonAsync() десериализует полученные данные в объект определенного типа - в данном случае данные конвертируются в объект типа Person. Если в запросе отправляются данные с ключами, которые называются также, как и свойства класса Person, то инфраструктура ASP.NET Core может автоматически связать данные json со свойствами класса Person и соответственно сформировать объект этого класса.
Однако может быть ситуация, когда методу не удастся связать данные запроса со свойствами класса Person, и в этом случае метод сгенерирует исключение. Поэтому при получении данных мы отлавливаем это исключение:
Try Dim somePerson = Await request.ReadFromJsonAsync(Of Person)() ' получаем объект Person responseText = $"Name: {somePerson.Name} Age: {somePerson.Age}" Catch ex As Exception responseText = ex.Message End Try
Если привязка данных запроса и свойств Person прошла успешно, если переменная somePerson представляет тип Person, то мы можем обратиться к его свойствам и получить отправленные данные:
responseText = $"Name: {somePerson.Name} Age: {somePerson.Age}"
И затем в ответ посылаем анонимный объект, который также сериализуется в json с некоторым сообщением, которое хранится в свойстве text.
Await response.WriteAsJsonAsync(New With {.Text = responseText})
При получении этого сообщения оно выводится на веб-страницу.