C# 在Xamarin表单C中发送HTTP Post请求#

C# 在Xamarin表单C中发送HTTP Post请求#,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,在我开始之前,我想说的是,我已经在谷歌上搜索了这个问题的解决方案,但要么不理解它们(我是一个新手),要么它们不起作用 我要做的是将JSON数据发送到localhost:8000上的REST API,格式如下: { "username" : "myusername", "password" : "mypass" } 然后,我期望得到一个包含字符串标记的响应,如下所示 { "token" : "rgh2ghgdsfds" } 如何发送json数据,然后从响应中解析令牌?

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

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

{
    "username" : "myusername",
    "password" : "mypass"
}
然后,我期望得到一个包含字符串标记的响应,如下所示

{
    "token" : "rgh2ghgdsfds"
}
如何发送json数据,然后从响应中解析令牌? 我见过这样做的同步方法,但出于某种原因,它们不起作用(或者仅仅因为我不知道它在什么名称空间中)。如果你采用异步方式,你能给我解释一下它是如何工作的吗


提前感谢。

使用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.HttpClient
中的
HttpClient
。某些PCL配置文件不包括该内容。在这些情况下,您需要添加。我还使用来序列化带有用户名和密码的对象

我还想指出的是,像这样以明文形式发送用户名和密码并不是真正的建议,应该以其他方式进行


编辑:如果在大多数版本上使用.NET标准,则不再需要从NuGet安装System.NET.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”

不过,一般来说,要处理序列化和反序列化,我建议使用类似的工具

至于它是如何工作的,这里有很多问题。如果您对async/await的工作原理有疑问,那么我建议您阅读此代码

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

HttpClient来自哪个名称空间?System.Net.HttpClients因为它是一个异步函数,当它使用wait时,我将函数签名更改为什么?我目前有:private-void-authLogin(string-user,string-pass)只需在方法签名中添加一个异步:private-async-void-authLogin(string-user,string-pass)请不要使其无效,如果出现异常,它将无法处理,应用程序将崩溃。啊,是的,我至少会返回任务或任务,在这里,做任何类型的人都没有意义。看起来@JacobShanley您应该只对事件处理程序使用
async void
。在其他情况下,将其
async Task
T作为返回类型,或者如果该方法不应返回任何内容,则将其设置为
async Task