006.MAUI HTTP异步类封装

android端内部默认是静止明文进行http网络请求的,要想解锁这些限制请参考005篇的内容(有详细示例),本篇主要是进阶对http类进行封装.

1. 同步 vs 异步

  • 同步(Synchronous)

    :任务按顺序执行,前一个任务完成后才会执行下一个

  • 异步(Asynchronous)

    :任务可以非阻塞地启动,主线程可以继续执行其他操作

关键点

  • async

    修饰方法,表示该方法包含异步操作

  • await

    关键字用于等待异步操作完成

  • 异步方法返回TaskTask<T>


public async Task<int> CalculateSumAsync()
{
    int value1 = await GetValueAsync(10); // 异步获取第一个值
    int value2 = await GetValueAsync(20); // 异步获取第二个值,两个异步是同时进的 
    return value1 + value2; // 返回两个值的和
}
public async Task<int> GetValueAsync(int value)
{    await Task.Delay(500); // 模拟异步操作
     return value;
}

一,在maui项目中创建一个http处理类

http请求原则上只使用异步方法进行发起请求,避免系统卡死得异常,

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;

namespace MauiApp2
{
    public class Rest_HTTP
    {
        private HttpClient _httpClient;

        public Rest_HTTP()
        {
            _httpClient = new HttpClient() { };//http依赖注入
        }
        /// <summary>
        /// GET请求
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public async Task<string> Get(string uri)
        {
            var response = await _httpClient.GetAsync(uri);//异步方法get string类型请求

            var data = await response.Content.ReadAsStringAsync();//读取响应内容

            return data;
        }
        /// <summary>
        /// post请求
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public async Task Post(string uri)
        {
            using StringContent jsonContent = new(JsonSerializer.Serialize(new
            {
                id = 2,
                name = "LED2",
                content = "OFF"
            }),
            Encoding.UTF8, "application/json");

            using HttpResponseMessage response = await _httpClient.PostAsync(uri, jsonContent);
            var jsonResponse = await response.Content.ReadAsStringAsync();
            //Console.WriteLine($"{jsonResponse}\n");
        }
        /// <summary>
        /// put请求(修改)
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public async Task Put(string uri)
        {
            using StringContent jsonContent = new(JsonSerializer.Serialize(new 
            { 
                id = 3,
                name = "LED3", 
                content = "ON" 
            }), Encoding.UTF8, "application/json");
            using HttpResponseMessage response = await _httpClient.PutAsync(uri, jsonContent); 
            var jsonResponse = await response.Content.ReadAsStringAsync();
        }
        /// <summary>
        /// delete请求(删除)
        /// </summary>
        /// <param name="uri"></param>
        /// <returns></returns>
        public async Task Delete(string uri) 
        {
            using HttpResponseMessage response = await _httpClient.DeleteAsync(uri); 
            var jsonResponse = await response.Content.ReadAsStringAsync(); 
        }
    }
}

需要注意的是,这个类的json数据都是与我自己写的服务器对应的,实际使用中需要去匹配你自己后台服务器的数据格式,否则会出现格式异常等问题

二.界面写四个按键,用来测试http四种常规网络请求

三.按键事件异步改写调用

在按键事件void方法前加 async使事件变为异步

四种方法调用了增删改查,测试都成功,具体的上传参数需要与服务器一致

(括号内url填你自己的后台服务器)

using MauiApp2.Views;

namespace MauiApp2
{
    public partial class MainPage : ContentPage
    {
        Rest_HTTP rest = new Rest_HTTP();//创建http封装的对象

        public MainPage()
        {
            InitializeComponent();
        }


        private async void OnCounterClicked(object sender, EventArgs e)
        {
            //await 加在方法前作为异步的返回调用
            CounterBtn.Text = await rest.Get("http://159.75.139.159:80/api/test/0");//GET请求
        }

        private async void GETJSON_Clicked(object sender, EventArgs e)
        {
            await rest.Post("http://159.75.139.159:80/api/ESP32/");//post请求 

        }

        private async void PUTBTU_Clicked(object sender, EventArgs e)
        {
            await rest.Put("http://159.75.139.159:80/api/ESP32/3");//put请求 
        }

        private async void deletebtu_Clicked(object sender, EventArgs e)
        {
            await rest.Delete("http://159.75.139.159:80/api/ESP32/2");//删除请求
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值