Explorar o código

асинхронные http-запросы

Евгений Колесников %!s(int64=2) %!d(string=hai) anos
pai
achega
4ab5f3a5de

+ 2 - 2
articles/api_asp_net_core.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./api_auth.md)
+[Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md) | [Содержание](../readme.md#разработка-своего-api) | [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./api_auth.md)
 
 # API. REST API. Создание сервера ASP.NET Core.
 
@@ -711,4 +711,4 @@ param1 = 1, param2 = 2, pageNum = 10, pageLen =
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./api_auth.md)
+[Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md) | [Содержание](../readme.md#разработка-своего-api) | [Авторизация и аутентификация. Методы авторизации. Basic-авторизация.](./api_auth.md)

+ 2 - 2
articles/api_auth.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[API. REST API. Создание сервера ASP.NET Core. Swagger.](./api_asp_net_core.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [HTTP запросы в C#. Получение списка материалов выбранного продукта](./cs_http.md)
+[API. REST API. Создание сервера ASP.NET Core. Swagger.](./api_asp_net_core.md) | [Содержание](../readme.md#разработка-своего-api) | [HTTP запросы в C#. Получение списка материалов выбранного продукта](./cs_http.md)
 
 # Аутентификация и авторизация
 
@@ -316,4 +316,4 @@ usernamePasswordString = admin:password
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[API. REST API. Создание сервера ASP.NET Core. Swagger.](./api_asp_net_core.md) | [Содержание](../readme.md#тема-515-разработка-своего-api) | [HTTP запросы в C#. Получение списка материалов выбранного продукта](./cs_http.md)
+[API. REST API. Создание сервера ASP.NET Core. Swagger.](./api_asp_net_core.md) | [Содержание](../readme.md#разработка-своего-api) | [HTTP запросы в C#. Получение списка материалов выбранного продукта](./cs_http.md)

+ 2 - 2
articles/cs_coloring2.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Создание, изменение продукции](./cs_edit_product2.md)
+[Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md) | [Содержание](../readme.md#c-и-mysql) | [Создание, изменение продукции](./cs_edit_product2.md)
 
 # Подсветка элементов по условию. Массовая смена цены продукции.
 
@@ -324,4 +324,4 @@ public string costChangeButtonVisible {
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Создание, изменение продукции](./cs_edit_product2.md)
+[Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md) | [Содержание](../readme.md#c-и-mysql) | [Создание, изменение продукции](./cs_edit_product2.md)

+ 2 - 2
articles/cs_edit_product2.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Подсветка элементов по условию. Дополнительные выборки.Массовая смена цены продукции.](./cs_pagination2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md)
+[Подсветка элементов по условию. Дополнительные выборки.Массовая смена цены продукции.](./cs_pagination2.md) | [Содержание](../readme.md#c-и-mysql) | [Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md)
 
 # Добавление/редактирование продукции
 
@@ -400,4 +400,4 @@ private void DeleteProductButton_Click(object sender, RoutedEventArgs e)
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Подсветка элементов по условию. Дополнительные выборки.Массовая смена цены продукции.](./cs_pagination2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md)
+[Подсветка элементов по условию. Дополнительные выборки.Массовая смена цены продукции.](./cs_pagination2.md) | [Содержание](../readme.md#c-и-mysql) | [Вывод списка материалов продукта. CRUD материалов продукта](./cs_product_material.md)

+ 26 - 20
articles/cs_http.md

@@ -1,3 +1,7 @@
+Предыдущая лекция |  | Следующая лекция
+:----------------:|:----------:|:----------------:
+[Аутентификация и авторизация](./api_auth.md) | [Содержание](../readme.md#разработка-своего-api) | 
+
 # HTTP запросы в C#. Получение списка материалов выбранного продукта
 
 Возвращаемся к проекту на C#.
@@ -44,11 +48,11 @@ client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basi
 
 >[Асинхронность в C#](./cs_async_await.md)
 
-Я для облегчения вашей работы нарисовал синхронную реализацию:
+Я для облегчения вашей работы нарисовал реализацию:
 
 ```cs
 // в параметрах URL
-private string GetBody(string url){
+private Task<string> GetBody(string url){
     var basic = Convert.ToBase64String(
         ASCIIEncoding.ASCII.GetBytes("esmirnov:111103"));
         
@@ -56,10 +60,12 @@ private string GetBody(string url){
 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", basic);
 
-    return client.GetStringAsync(url).Result;
+    return client.GetStringAsync(url);
 }
 ```
 
+Метод *GetStringAsync* возвращает объект `Task<string>`, т.е. задачу, которая выполняется в отдельном потоке и по завершении вернёт строку (тело ответа)
+
 ## GET-запрос. Разбор JSON ответа.
 
 Для работы с JSON нужно установить **NuGet** пакет `Newtonsoft.Json` и использовать метод десериализации объекта:
@@ -74,30 +80,29 @@ materialList = JsonConvert.DeserializeObject<Material[]>("тут ответ ва
 Весь метод получения списка материалов помещается в 3 строки:
 
 ```cs
-private void GetMaterials()
+private async void GetMaterials()
 {
-    var resp = GetBody($"http://localhost:8080/material/{currentProduct.Id}");
-    materialList = JsonConvert.DeserializeObject<Material[]>(resp);
+    var resp = await GetBody(
+        $"http://localhost:8080/material/{currentProduct.Id}");
+
+    materialList = JsonConvert
+        .DeserializeObject<Material[]>(resp);
+
     Invalidate("materialList");
 }
 ```
 
+Так как метод *GetBody* возвращает задачу (**Task**), то мы ставим перед ним ключевое слово **await**, то есть ждём завершения задачи, а сам метод помечаем как асинхронный (**async**), чтобы система знала, что этот метод асинхронный.
+
 ## Удаление записей
 
 Для вызова http-метода `DELETE` используется метод *DeleteAsync*:
 
 ```cs
-var basic = Convert.ToBase64String(
-            ASCIIEncoding.ASCII.GetBytes("esmirnov:111103"));
-
-var client = new HttpClient();
-
-client.DefaultRequestHeaders.Authorization = 
-    new AuthenticationHeaderValue("Basic", basic);
+// тут, как в GetBody, создайте клиента и задайте заголовок
 
 client.DeleteAsync(
-    $"http://localhost:8080/material/{productId}/{materialId}")
-    .Result;
+    $"http://localhost:8080/material/{productId}/{materialId}");
 ```
 
 При работе с таблицей **ProductMaterial** не забываем, что у нас составной первичный ключ и нужны идентификаторы и продукта и материала.
@@ -114,9 +119,11 @@ client.DeleteAsync(
     // и указано его количество
 
     // сначала запихиваем объект в JSON-строку. 
-    var jsonString = JsonConvert.SerializeObject(new {
-        MaterialId = Id выбранного материала,
-        Count = количество});
+    var jsonString = JsonConvert.SerializeObject(
+        new {
+            MaterialId = Id выбранного материала,
+            Count = количество
+        });
 
     // создаём контент для http-запроса
     var json = new StringContent(
@@ -133,6 +140,5 @@ client.DeleteAsync(
 
     var result = client.PostAsync(
         $"http://localhost:8080/material/{currentProduct.Id}", 
-        json)
-        .Result;
+        json);
     ```

+ 2 - 2
articles/cs_layout2.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Создание подключения к БД MySQL. Получение данных с сервера.](./cs_mysql_connection3.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md)
+[Создание подключения к БД MySQL. Получение данных с сервера.](./cs_mysql_connection3.md) | [Содержание](../readme.md#c-и-mysql) | [Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md)
 
 # Вывод данных согласно макету (ListBox, Image).
 
@@ -299,4 +299,4 @@ foreach (var item in ProductMaterials)
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Создание подключения к БД MySQL. Получение данных с сервера.](./cs_mysql_connection3.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md)
+[Создание подключения к БД MySQL. Получение данных с сервера.](./cs_mysql_connection3.md) | [Содержание](../readme.md#c-и-mysql) | [Пагинация, сортировка, фильтрация, поиск](./cs_pagination2.md)

+ 2 - 2
articles/cs_mysql_connection3.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Хранимые процедуры. Триггеры.](./sql_trigger.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Вывод данных согласно макету (ListBox, Image). Вывод данных плиткой.](./cs_layout2.md)
+[Хранимые процедуры. Триггеры.](./sql_trigger.md) | [Содержание](../readme.md#c-и-mysql) | [Вывод данных согласно макету (ListBox, Image). Вывод данных плиткой.](./cs_layout2.md)
 
 # Создание подключения к БД MySQL. Получение данных с сервера.
 
@@ -297,4 +297,4 @@ public partial class MainWindow : Window
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Хранимые процедуры. Триггеры.](./sql_trigger.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Вывод данных согласно макету (ListBox, Image). Вывод данных плиткой.](./cs_layout2.md)
+[Хранимые процедуры. Триггеры.](./sql_trigger.md) | [Содержание](../readme.md#c-и-mysql) | [Вывод данных согласно макету (ListBox, Image). Вывод данных плиткой.](./cs_layout2.md)

+ 2 - 2
articles/cs_pagination2.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Вывод данных согласно макету (ListBox, Image)](./cs_layout2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Подсветка элементов по условию. Дополнительные выборки.](./cs_coloring2.md)
+[Вывод данных согласно макету (ListBox, Image)](./cs_layout2.md) | [Содержание](../readme.md#c-и-mysql) | [Подсветка элементов по условию. Дополнительные выборки.](./cs_coloring2.md)
 
 # Продолжаем реализовывать макет
 
@@ -377,4 +377,4 @@ public IEnumerable<Product> productList {
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Вывод данных согласно макету (ListBox, Image)](./cs_layout2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [Подсветка элементов по условию. Дополнительные выборки.](./cs_coloring2.md)
+[Вывод данных согласно макету (ListBox, Image)](./cs_layout2.md) | [Содержание](../readme.md#c-и-mysql) | [Подсветка элементов по условию. Дополнительные выборки.](./cs_coloring2.md)

+ 2 - 2
articles/cs_product_material.md

@@ -1,6 +1,6 @@
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Создание, изменение, удаление продукции](./cs_edit_product2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [API. REST API. Создание сервера ASP.NET Core.](./api_asp_net_core.md)
+[Создание, изменение, удаление продукции](./cs_edit_product2.md) | [Содержание](../readme.md#c-и-mysql) | [API. REST API. Создание сервера ASP.NET Core.](./api_asp_net_core.md)
 
 # Вывод списка материалов продукта. CRUD материалов продукта
 
@@ -158,4 +158,4 @@ private void DeleteMaterialTextBlock_MouseDown(object sender, MouseButtonEventAr
 
 Предыдущая лекция |  | Следующая лекция
 :----------------:|:----------:|:----------------:
-[Создание, изменение, удаление продукции](./cs_edit_product2.md) | [Содержание](../readme.md#тема-514-c-и-mysql) | [API. REST API. Создание сервера ASP.NET Core.](./api_asp_net_core.md)
+[Создание, изменение, удаление продукции](./cs_edit_product2.md) | [Содержание](../readme.md#c-и-mysql) | [API. REST API. Создание сервера ASP.NET Core.](./api_asp_net_core.md)