【问题标题】:Send HTTP Post request in Xamarin Forms C#在 Xamarin Forms C# 中发送 HTTP Post 请求
【发布时间】:2016-04-06 17:45:25
【问题描述】:

在开始之前,我想说我已经用谷歌搜索过这个问题的解决方案,但要么不理解它们(我是新手),要么它们不起作用。

我想要做的是将 JSON 数据发送到 localhost:8000 上的 REST API,格式如下:

{
    "username" : "myusername",
    "password" : "mypass"
}

然后,我希望得到一个包含字符串标记的响应,如下所示,

{
    "token" : "rgh2ghgdsfds"
}

如何发送 json 数据,然后从响应中解析令牌? 我见过这样做的同步方法,但由于某种原因,它们不起作用(或者仅仅是因为我不知道它在哪个命名空间中)。如果您应用异步方式来执行此操作,您能否向我解释一下它是如何工作的?

提前致谢。

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    我使用HttpClient。一个简单的例子:

    var client = new HttpClient();
    client.BaseAddress = new Uri("localhost:8080");
    
    string jsonData = @"{""username"" : ""myusername"", ""password"" : ""mypassword""}"
    
    var content = new StringContent (jsonData, Encoding.UTF8, "application/json");
    HttpResponseMessage response = await client.PostAsync("/foo/login", content);
    
    // this result string should be something like: "{"token":"rgh2ghgdsfds"}"
    var result = await response.Content.ReadAsStringAsync();
    

    "/foo/login" 需要指向您的 HTTP 资源。例如,如果您有一个带有Login 方法的AccountController,那么您可以使用"/Account/Login" 之类的东西来代替"/foo/login"

    一般来说,为了处理序列化和反序列化,我建议使用像Json.Net 这样的工具。

    关于它如何工作的问题,这里有很多事情要做。如果您对 async/await 的工作原理有疑问,那么我建议您阅读 Asynchronous Programming with Async and Await on MSDN

    【讨论】:

    • 因为它是一个异步函数,因为它使用等待,所以我将函数签名更改为什么伤口?我目前有: private void authLogin(string user, string pass)
    • 只需在方法签名中添加一个异步:private async void authLogin(string user, string pass)
    • 请不要让它无效,如果抛出异常,它将无法处理并且应用程序会崩溃。
    • 啊,是的,我至少会返回 Task 或 Task,T 是对您的程序有意义的任何类型。看起来像Cheesebaron updated his answer
    • @JacobShanley 您应该只将async void 用于事件处理程序。在其他情况下,将 async Task<T> T 设为返回类型,或者将 async Task 设为该方法不应返回任何内容。
    【解决方案2】:

    使用 HttpClient 应该相当容易。

    这样的事情可能会奏效。但是,您可能需要以某种方式代理来自设备/模拟器的数据才能到达您的服务器。

    var client = new HttpClient();
    var content = new StringContent(
        JsonConvert.SerializeObject(new { username = "myusername", password = "mypass" }));
    var result = await client.PostAsync("localhost:8080", content).ConfigureAwait(false);
    if (result.IsSuccessStatusCode)
    {
        var tokenJson = await result.Content.ReadAsStringAsync();
    }
    

    此代码可能会进入具有以下签名的方法:

    private async Task<string> Login(string username, string password)
    {
        // code
    }
    

    注意使用void 而不是Task 作为返回类型。如果你这样做并且在方法内部抛出任何异常,则异常不会冒泡并且不会被处理;这将导致应用程序崩溃。最佳做法是仅在我们处于事件或类似事件中时使用 void。在这些情况下,请确保正确处理所有可能的异常。

    同样,上面的示例使用来自System.Net.HttpClientHttpClient。一些 PCL 配置文件不包括该配置文件。在这些情况下,您需要添加Microsoft's HttpClient library from Nuget。我还使用JSON.Net (Newtonsoft.Json) 用用户名和密码序列化对象。

    我还要注意,不建议像这样以明文形式发送用户名和密码,否则应该这样做。

    编辑:如果您在大多数版本上使用 .NET Standard,则不再需要从 NuGet 安装 System.Net.HttpClient,因为它已经随附。

    【讨论】:

    • HttpClient 来自哪个命名空间?
    • System.Net.HttpClient
    【解决方案3】:

    试试这个代码。

    HttpClient httpClient = new HttpClient();
    
                httpClient.BaseAddress = new Uri(APIAddress); // Insert your API URL Address here.
                string serializedObject = JsonConvert.SerializeObject(data);
                HttpContent contentPost = new StringContent(serializedObject, Encoding.UTF8, "application/json");
                try
                {
                    HttpResponseMessage response = await httpClient.PostAsync(ControllerWithMethod, contentPost);
                    return response;
                }
                catch (TaskCanceledException ex)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    return new HttpResponseMessage();
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2013-11-13
      相关资源
      最近更新 更多