首页 > 其他分享 >MAUI开发笔记(二)

MAUI开发笔记(二)

时间:2023-12-19 19:55:05浏览次数:27  
标签:string await Uri 笔记 client 开发 MAUI new response

今天试了一下,在MAUI上调用WEB API。经常一番努力,终于调用成功。不过这里面还是有很多的坑。

MAUI分了好几个平台,一般来说,最容易成功的是Windows平台。

坑1:HttpClient的方法

总体来说,其实是用HttpClient来调用。
但是HttpClient的方法使用上,也有坑。
最开始我使用的是下面的一些接口:

await _client.GetFromJsonAsync<TodoItem>($"Todo/{id}");
HttpResponseMessage response = await _client.PostAsJsonAsync("Todo", info);
HttpResponseMessage response = await _client.PutAsJsonAsync($"Todo/{info.Id}", info);

这些接口在Windows上执行没有问题的,但是跑Android虚拟机的时候,直接报错了。
应该是这些接口都是属于扩展接口,只支持Windows平台的。

所以最终的接口都换成了下面这种形式:

Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
HttpResponseMessage response = await _client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
    string content = await response.Content.ReadAsStringAsync();
    return JsonSerializer.Deserialize<List<TodoItem>>(content, _serializerOptions);
}

完整TodoService类代码:

using System.Diagnostics;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using TodoMaui.Models;

namespace TodoMaui.Services;

public class TodoService : ITodoService
{
    private HttpClient _client;
    private JsonSerializerOptions _serializerOptions;
    private IHttpsClientHandlerService _httpsClientHandlerService;

    public TodoService(IHttpsClientHandlerService service)
    {
#if DEBUG
        _httpsClientHandlerService = service;
        HttpMessageHandler handler = _httpsClientHandlerService.GetPlatformMessageHandler();
        if (handler != null)
            _client = new HttpClient(handler);
        else
            _client = new HttpClient();
#else
            _client = new HttpClient();
#endif
        _serializerOptions = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            WriteIndented = true
        };

        _client.BaseAddress = new Uri("http://192.168.126.149:5000/");
        _client.DefaultRequestHeaders.Accept.Clear();
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task<TodoItem> GetTodoItem(long id)
    {
        try
        {
            Uri uri = new Uri(string.Format(Constants.RestUrl, id));
            HttpResponseMessage response = await _client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                string content = await response.Content.ReadAsStringAsync();
                return JsonSerializer.Deserialize<TodoItem>(content, _serializerOptions);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }

        return null;
    }

    public async Task<List<TodoItem>> GetTodoItems()
    {
        try
        {
            Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
            HttpResponseMessage response = await _client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                string content = await response.Content.ReadAsStringAsync();
                return JsonSerializer.Deserialize<List<TodoItem>>(content, _serializerOptions);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }

        return null;
    }

    public async Task<TodoItem> AddTodoItem(TodoItem item)
    {
        try
        {
            string json = JsonSerializer.Serialize<TodoItem>(item, _serializerOptions);
            StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

            Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
            HttpResponseMessage response = await _client.PostAsync(uri, content);
            if (response.IsSuccessStatusCode)
            {
                json = await response.Content.ReadAsStringAsync();
                return JsonSerializer.Deserialize<TodoItem>(json, _serializerOptions);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }

        return null;
    }

    public async Task UpdateTodoItem(TodoItem item)
    {
        try
        {
            string json = JsonSerializer.Serialize<TodoItem>(item, _serializerOptions);
            StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

            Uri uri = new Uri(string.Format(Constants.RestUrl, item.Id));
            HttpResponseMessage response = await _client.PutAsync(uri, content);
            response.EnsureSuccessStatusCode();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

    public async Task DeleteTodoItem(long id)
    {
        try
        {
            Uri uri = new Uri(string.Format(Constants.RestUrl, id));
            HttpResponseMessage response = await _client.DeleteAsync(uri);
            response.EnsureSuccessStatusCode();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }
}

坑2:Android权限

因为用到了联网的功能,需要添加权限。我的AndroidManifest.xml文件内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
	<application android:allowBackup="true" android:icon="@mipmap/appicon" android:supportsRtl="true"></application>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
	<uses-sdk />
</manifest>

好久没玩Android系统了,忘了这货还有权限的设置。关键提示太不明显了。

坑3:禁用Http协议

Android默认是禁用HTTP协议的,如果要启用,要设置一下。我懒得去设置,就直接把WEB API改成HTTPS协议了。

标签:string,await,Uri,笔记,client,开发,MAUI,new,response
From: https://www.cnblogs.com/wzwyc/p/17914566.html

相关文章

  • 软件测试/测试开发|Ubuntu虚拟机打不开Ubuntu software
    前言在我们安装完Ubuntu虚拟机之后,我们可以在虚拟机上安装我们所需的软件,比如我们经常会用到的pycharm和vscode等软件,都可以在Ubuntu的UbuntuSoftware中进行安装,但是在进行安装时,可能会出现打不开UbuntuSoftware的情况,本文就来介绍一下解决打不开这个软件市场的问题的方法。方案......
  • 经历过秋招的失败后,Android开发该如何准备好春招?
    经历过秋招的失败后,Android开发该如何准备好春招?虽然春招相对秋招来说火爆程度略低,但仍然具有一定的难度。除了秋招失利的同学外,十二月份考研和考公结束后,一部分考研失败的同学也会参与春招。此外,还有许多年底毕业的海归也会加入春季招聘队伍。因此,我们不可忽视春招,更应该重视起来......
  • 阅读笔记7
    《代码大全》2介绍了软件构建的本质和复杂性。软件开发既是一门艺术,又是一门工程学科,需要在实践中不断改进。接着讲述了在软件构建之前的前期准备活动,包括需求分析、定义解决方案和设计架构等,说明软件开发过程中对需求的分析和解决方案的设计是至关重要的环节。在软件质量和编码实......
  • 刷题笔记
    1.有效的括号_20题目描述思路利用栈。按顺序遍历,遇到左括号直接入栈;遇到右括号,则与栈顶元素进行匹配,如果栈顶元素为空或者与栈顶元素不匹配,则返回false。遍历结束如果栈非空,则说明还有左括号未被匹配,返回false。复杂度时间复杂度O(n):遍历一遍字符串。空间复杂的O(n):栈使......
  • mysql笔记
    MySQL数据库B站资源网盘资源sql数据库提取码:mmmmDB、DBMS、SQL的关系DB:Database,数据库,数据库在硬盘上以文件的形式存在。DBMS:DatabaseManagementSystem,数据库管理系统,如:MySQL,Oracle,DB2,Sybase,SqlServer等。SQL:StructureQueryLanguage,结构化查询语言,是一门标准通用的......
  • 阅读笔记6
    永远以解决问题为导向,而不是仅仅完成任务。从最低级的写好一个功能,到给具体的需求排优先级,甚至到明确真正的需求,到调整开发节奏,一切都由实际的需求和开发能力决定,最终的目的只有一个,那就是解决真正的问题;把程序员当人看,不仅仅是把其他同事当人看,也要把自己当人看。人是会出错的,团......
  • 阅读笔记5
    《代码大全2》的前两章主要介绍了软件构建的基本概念、原则和流程,使我理解和应用代码的意义和方法产生了深刻的影响。在第一章中,作者强调了代码的重要性,并指出编程的目标是生成可执行代码。并通过一系列实例阐述了编程过程中的关键要素,如可读性、可维护性和可测试性。在第二章中......
  • 秦疆的Java课程笔记:78 异常 捕获和抛出异常
    异常处理五个关键词:try,catch,finally,throw,throws写一个会出错的代码:publicclassTest1{publicstaticvoidmain(String[]args){inta=1;intb=0;System.out.println(a/b);}}====运行报错====Exceptionint......
  • 【笔记】2023.12.19:题目选讲
    笔记2023.12.19:题目选讲不会的题目没在这里展现。一共14道题。gym103371IOrganizingColoredSheets猜结论:两个同一行的sharp的间隙的\(\min\)是\(W\)上界,同一列的sharp的间隙的\(\min\)是\(H\)上界,然后相乘。这是假的,是答案上界,过不去样例二。每个\(H\)对......
  • Gemini 自曝中文用百度文心一言训练丨 RTE 开发者日报 Vol.109
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的**观点**」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表......