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

时间:2016-04-06 17:45:25

标签: c# xamarin xamarin.forms

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

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

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

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

{
    "token" : "rgh2ghgdsfds"
}

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

提前致谢。

3 个答案:

答案 0 :(得分:13)

我使用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资源。例如,如果您的AccountController采用Login方法,那么您将使用"/foo/login"之类的内容而不是"/Account/Login"

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

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

答案 1 :(得分:7)

使用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作为返回类型。如果你这样做,并且在方法中抛出任何异常,异常将不会冒出来并且它将被取消处理;这将导致应用程序爆炸。最佳做法是在我们进入事件或类似事件时使用无效。在这些情况下,请确保正确处理所有可能的异常。

上述示例也使用HttpClient中的System.Net.HttpClient。某些PCL配置文件不包括此内容。在这些情况下,您需要添加Microsoft's HttpClient library from Nuget。我还使用JSON.Net (Newtonsoft.Json)来使用用户名和密码序列化对象。

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

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

答案 2 :(得分:0)

尝试此代码。

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();
            }