在Xamarin Forms C#中发送HTTP Post请求

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

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

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

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

 { "token" : "rgh2ghgdsfds" } 

如何发送json数据然后从响应中解析令牌? 我已经看到了这样做的同步方法,但由于某种原因,它们不起作用(或者仅仅因为我不知道它在哪个命名空间)。 如果您采用异步方式执行此操作,请告诉我它是如何工作的?

提前致谢。

我使用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" "/Account/Login"

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

关于它是如何工作的问题,这里有很多事情要做。 如果您对async / await的工作原理有疑问,我建议您阅读Async上的异步编程并在MSDN上等待

使用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 Login(string username, string password) { // code } 

注意使用void而不是Task作为返回类型。 如果你这样做,并且在方法中抛出任何exception,exception将不会冒出来并且它将被取消处理; 这将导致应用程序爆炸。 最佳做法是在我们进入活动或类似活动时使用无效。 在这些情况下,请确保正确处理所有可能的exception。

上面的例子也使用System.Net.HttpClient HttpClient 。 一些PCL配置文件不包括此。 在这些情况下,您需要从Nuget添加Microsoft的HttpClient库 。 我还使用JSON.Net(Newtonsoft.Json)来使用用户名和密码序列化对象。

我还要注意,实际上不建议以明文forms发送用户名和密码,不应该这样做。

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