C# 在Xamarin表单C中发送HTTP Post请求#
在我开始之前,我想说的是,我已经在谷歌上搜索了这个问题的解决方案,但要么不理解它们(我是一个新手),要么它们不起作用 我要做的是将JSON数据发送到localhost:8000上的REST API,格式如下: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数据,然后从响应中解析令牌?
{
"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
。