在我开始之前,我想说我已经搜索了解决这个问题的方法,但要么不理解它们(我是新手)或者它们不起作用。
我想要做的是将JSON数据发送到localhost:8000上的REST API,格式如下:
{
"username" : "myusername",
"password" : "mypass"
}
然后,我期待一个包含字符串标记的响应,如下所示,
{
"token" : "rgh2ghgdsfds"
}
如何发送json数据然后从响应中解析令牌? 我已经看到了这样做的同步方法,但由于某种原因,它们不起作用(或者仅仅因为我不知道它在哪个命名空间)。如果您采用异步方式执行此操作,请告诉我它是如何工作的?
提前致谢。
答案 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();
}