.NET MAUI 如何进行 RESTful API POST 并获取响应

问题描述 投票:0回答:1

这是一个 RESTful API 问题,我对这个主题缺乏经验和知识,可能会迫使我使用糟糕的术语/说一些愚蠢的东西,所以我提前道歉。

我想做什么

用户输入用户名和密码。我使用 RESTful API 来获取帐户信息,并将用户名作为参数之一。如果我从 GET 中取回信息,则表明该用户存在。然后我可以查看密码(这是我取回的信息的一部分)。如果它与用户输入的内容匹配,那就太好了。我们继续使用 Android 应用程序。

这不是问题。

问题是为了执行 GET,我需要一个“access_token”,一个长字符串。为了获取这个字符串,我需要执行一个 POST 来创建这个“access_token”资源并将其返回给我。

我可以找到一些关于如何执行此操作的代码示例和解释,但我找不到完整的代码示例和解释。例如,此图像来自 Microsoft 演示视频(大约 25 分钟):

这看起来正是我所需要的!除了一个问题:我不知道这行代码的含义/作用:

message.Content = JsonContent.Create<Part>(part);

这并不完全正确。我可以谷歌“JsonContent.Create”以及下一个人,但我不知道如何创建类型为

Part
的对象或如何提出参数“part”(我什至不知道知道它是什么)。坦率地说,我读到的有关
HttpRequestMessage
JsonContent
的文档有点超出我的理解范围,并且缺乏实际的代码示例。

我可以在 Postman 上运行 POST

我假设上面代码中的对象

Part
是某个类,其中包含 POST 所需的参数。

我还假设当我在 Postman 上运行 POST 时可以找到这些参数(这是一位同事给我的)。当我在 Postman 上运行 POST 时,有几个部分,对吧?

URI、参数、授权、标头、正文等......以及响应。在这种情况下,唯一具有值的部分是 URI(当然)、标头和正文。

标题
我认为标头中的值是特定于 Postman 的,所以我可能不需要将这些添加到某个名为“Part”的对象(或我需要做的任何事情):

身体
这里需要很多价值。如果我取消选中任何这些值,当我运行 POST 时,我会得到 ol'

400 Bad Request
响应:

回复
这是来自 POST 的回复。这就是我想要从上面发布的 C# 代码片段中得到的

HttpResponseMessage

说了这么多,我的问题是什么?

我是否正确假设我需要在我的毛伊岛项目中创建一些对象/类来代表上面Body图片中的信息?就像,这就是我需要放在这里的东西?

如果答案是“是”,是否有地方可以通过代码示例逐步解释我需要做什么?希望标题中包含“针对初学者”或“针对傻瓜”或“针对金毛猎犬”之类的字样? (很难过分强调我知道的有多么少。)

如果答案是“否”,那么......好吧,我需要学习如何在毛伊岛发布帖子并获得回复,但我找不到任何地方可以解释如何做到这一点。

c# rest maui dotnet-httpclient
1个回答
0
投票

您可能会发现更多使用 Xamarin 的工作示例,或者只是简单的 C#,一般来说原理是相似的。

您的 REST API 以 JSON 格式传递数据,因此最简单的事情就是为您传递和接收的数据创建类。 借助 Newtonsoft.Json 包(将其安装在您的解决方案中),您可以在传递或接收数据时轻松序列化和反序列化您的类。

因此,对于您的登录参数和响应,您可以得到:

public class LoginParams
{
    /// <summary>
    /// Unique user reference
    /// </summary>
    [JsonProperty("username")]
    [MaxLength(20)]
    public string UserReference { get; set; }

    /// <summary>
    /// Password used by user
    /// </summary>
    [JsonProperty("password")]
    public string Password { get; set; }
}

还有一个回复:

public class LoginResponse
{
    /// <summary>
    ///     Authorization token for a successful login
    /// </summary>
    [JsonProperty("access_token")]
    [SoapAttribute(AttributeName = "Token")]
    public string AuthorizationToken { get; set; }  

    [JsonProperty("expires_in")]
    public string LifeSpan {get;set;}

    [JsonProperty("token_type")]
    public string TokenType {get;set;}

    /// <summary>
    ///     Token to be used for authorization token refresh
    /// </summary>
    [JsonProperty("refresh_token")]
    [SoapAttribute(AttributeName = "RefreshToken")]
    public string RefreshToken { get; set; }  
}

然后你会得到类似的东西:

        var httpClient = new HttpClient();
        var loginParams = new LoginParams() { UserReference = userReference, Password = password };
        var content = new StringContent(JsonConvert.SerializeObject(loginParams),Encoding.UTF8, "application/json");

        HttpResponseMessage  response = await httpClient.PostAsync($@"ServerURL}/auth/login", content);

        var responseContent = await response.Content.ReadAsStringAsync();
        if (response.StatusCode != HttpStatusCode.OK)
                return new DataServiceResponse<IUserAuthorization>(response.StatusCode, null);

        var authorization = JsonConvert.DeserializeObject<LoginResponse>(responseContent);

这不是完全准备好的代码,它只是一个指针,API 调用周围没有

try ... catch
块,您可能希望更好地处理异步性质,特别是对于错误情况。

除了 NewtonSoft,您可能还希望查看其他 nuget 软件包,它们可以帮助您简化此操作。

© www.soinside.com 2019 - 2024. All rights reserved.