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

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

Одним из наиболее распространенных форматов передачи данных является формат JSON. Рассмотрим, как мы можем посылать и получить данные json в приложении на ASP.NET Core.

Отправка JSON. Метод WriteAsJsonAsync

Для отправки 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 с помощью WriteAsJson в ASP.NET Core и Visual Basic .NET

Но также для отправки 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. Метод ReadFromJsonAsync

Для получения из запроса данных в формате JSON в классе HttpRequest определен метод ReadFromJsonAsync(). Он позволяет сериализовать данные в объект определенного типа.

Например, создадим в проекте папку html, в которой определим новый файл index.html.

Отправка объекта json на сервер ASP.NET Core в Visual Basic .NET

В файле 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})

При получении этого сообщения оно выводится на веб-страницу.

ReadFromJsonAsync и чтение данных json в ASP.NET Core и Visual Basic .NET
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850