如何使用 HttpClient 获取 post 数据? (一个比实际有效的答案)
How to post data using HttpClient? (an answer than actually works)
关于这个还有另一个问题,但它最后没有一个有效的解决方案,唯一好的答案,出于某种原因,不起作用,不适合问它的人,不适合我也是。
这个问题在这里:
给出相应的声明,这是我目前的代码:
方法调用与网络服务器连接的方法:
private void Button_Click(object sender, System.EventArgs e)
{
//. . . DO SOMETHING . . .
PopulateListView();
//. . . DO SOMETHING ELSE . . .
}
private void PopulateListView()
{
//. . . DO SOMETHING . . .
list = await "http://web.server.url".GetRequest<List<User>>();
//. . . DO SOMETHING ELSE . . .
}
与网络服务器连接的方法:
public async static Task<T> SendGetRequest<T>(this string url)
{
try
{
var uri = new Uri(url);
HttpClient client = new HttpClient();
//Preparing to have something to read
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("OperationType", "eaf7d94356e7fd39935547f6f15e1c4c234245e4")
});
HttpResponseMessage response = await client.PostAsync(uri, formContent);
#region - - Envio anterior (NO FUNCIONO, SIN USO) - -
//var stringContent = new StringContent("markString");
//var sending = await client.PostAsync(url, stringContent);
//MainActivity.ConsoleData = await client.PostAsync(url, stringContent);
#endregion
//Reading data
//var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
MainActivity.ConsoleData = json.ToString();
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
}
catch(Exception ex)
{
Console.WriteLine("Error: "+ex.ToString());
return default(T);
}
}
你可能猜到了,但我正在尝试制作一种方法,将一些名为 "markString" 的数据(通过 POST)发送到网络服务器,而不是接收它,并且取决于"markString"它returns某些json对象。
这个网络服务器已经正常工作了(我用一些插件测试了它,它工作正常)
此方法应该发送 "markString" 并接收回数据,这样我就可以在应用程序中使用它了。
我正在制作 Xamarin Android 应用程序。
还记得我根本没有任何连接问题,事实上,当我尝试使用网络客户端发送数据时,应用程序正在发送数据,但我希望它使用HttpClient
.
问题
代码未返回任何内容。任何信息、澄清、问题、建设性评论或任何可以导致答案的请求也将不胜感激。
提前致谢。
void Main()
{
var test = SendGetRequest("http://www.google.com");
test.Dump();
}
public async static Task<string> SendGetRequest(string url)
{
try
{
var uri = new Uri(url);
HttpClient client = new HttpClient();
//Preparing to have something to read
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("OperationType", "eaf7d94356e7fd39935547f6f15e1c4c234245e4")
});
HttpResponseMessage response = await client.PostAsync(uri, formContent);
#region - - Envio anterior (NO FUNCIONO, SIN USO) - -
//var stringContent = new StringContent("markString");
//var sending = await client.PostAsync(url, stringContent);
//MainActivity.ConsoleData = await client.PostAsync(url, stringContent);
#endregion
//Reading data
//var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
return json;
}
catch (System.Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
return string.Empty;
}
}
大多数异步代码死锁情况都是由于 blocking further up the call stack。
默认情况下 await
捕获 "context"(在本例中为 UI 上下文),并在该上下文中继续执行。因此,如果您在任务上调用 async
方法和块(例如,GetAwaiter().GetResult()
、Wait()
或 Result
),则 UI 线程是被阻止,这会阻止 async
方法恢复和完成。
关于这个还有另一个问题,但它最后没有一个有效的解决方案,唯一好的答案,出于某种原因,不起作用,不适合问它的人,不适合我也是。
这个问题在这里:
给出相应的声明,这是我目前的代码:
方法调用与网络服务器连接的方法:
private void Button_Click(object sender, System.EventArgs e)
{
//. . . DO SOMETHING . . .
PopulateListView();
//. . . DO SOMETHING ELSE . . .
}
private void PopulateListView()
{
//. . . DO SOMETHING . . .
list = await "http://web.server.url".GetRequest<List<User>>();
//. . . DO SOMETHING ELSE . . .
}
与网络服务器连接的方法:
public async static Task<T> SendGetRequest<T>(this string url)
{
try
{
var uri = new Uri(url);
HttpClient client = new HttpClient();
//Preparing to have something to read
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("OperationType", "eaf7d94356e7fd39935547f6f15e1c4c234245e4")
});
HttpResponseMessage response = await client.PostAsync(uri, formContent);
#region - - Envio anterior (NO FUNCIONO, SIN USO) - -
//var stringContent = new StringContent("markString");
//var sending = await client.PostAsync(url, stringContent);
//MainActivity.ConsoleData = await client.PostAsync(url, stringContent);
#endregion
//Reading data
//var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
MainActivity.ConsoleData = json.ToString();
return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
}
catch(Exception ex)
{
Console.WriteLine("Error: "+ex.ToString());
return default(T);
}
}
你可能猜到了,但我正在尝试制作一种方法,将一些名为 "markString" 的数据(通过 POST)发送到网络服务器,而不是接收它,并且取决于"markString"它returns某些json对象。
这个网络服务器已经正常工作了(我用一些插件测试了它,它工作正常)
此方法应该发送 "markString" 并接收回数据,这样我就可以在应用程序中使用它了。
我正在制作 Xamarin Android 应用程序。
还记得我根本没有任何连接问题,事实上,当我尝试使用网络客户端发送数据时,应用程序正在发送数据,但我希望它使用HttpClient
.
问题
代码未返回任何内容。任何信息、澄清、问题、建设性评论或任何可以导致答案的请求也将不胜感激。
提前致谢。
void Main()
{
var test = SendGetRequest("http://www.google.com");
test.Dump();
}
public async static Task<string> SendGetRequest(string url)
{
try
{
var uri = new Uri(url);
HttpClient client = new HttpClient();
//Preparing to have something to read
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("OperationType", "eaf7d94356e7fd39935547f6f15e1c4c234245e4")
});
HttpResponseMessage response = await client.PostAsync(uri, formContent);
#region - - Envio anterior (NO FUNCIONO, SIN USO) - -
//var stringContent = new StringContent("markString");
//var sending = await client.PostAsync(url, stringContent);
//MainActivity.ConsoleData = await client.PostAsync(url, stringContent);
#endregion
//Reading data
//var response = await client.GetAsync(url);
var json = await response.Content.ReadAsStringAsync();
return json;
}
catch (System.Exception ex)
{
Console.WriteLine("Error: " + ex.ToString());
return string.Empty;
}
}
大多数异步代码死锁情况都是由于 blocking further up the call stack。
默认情况下 await
捕获 "context"(在本例中为 UI 上下文),并在该上下文中继续执行。因此,如果您在任务上调用 async
方法和块(例如,GetAwaiter().GetResult()
、Wait()
或 Result
),则 UI 线程是被阻止,这会阻止 async
方法恢复和完成。