android端内部默认是静止明文进行http网络请求的,要想解锁这些限制请参考005篇的内容(有详细示例),本篇主要是进阶对http类进行封装.
1. 同步 vs 异步
- 同步(Synchronous)
:任务按顺序执行,前一个任务完成后才会执行下一个
- 异步(Asynchronous)
:任务可以非阻塞地启动,主线程可以继续执行其他操作
关键点:
async修饰方法,表示该方法包含异步操作
await关键字用于等待异步操作完成
-
异步方法返回
Task或Task<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");//删除请求
}
}
}

678

被折叠的 条评论
为什么被折叠?



