如何使用HttpClient发布数据?(一个真正起作用的答案)
如何使用HttpClient发布数据?(一个真正起作用的答案)
有一个关于这个问题的问题,但是最后没有一个有效的解决方案,而且唯一的好答案,出于某种原因,对提问者和我都不起作用。
这个问题在这里:
根据相关的解释,这是我目前的代码:
调用与Web服务器连接的方法:
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>(); //. . . DO SOMETHING ELSE . . . }
与Web服务器连接的方法:
public async static TaskSendGetRequest (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 ("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 (json); } catch(Exception ex) { Console.WriteLine("Error: "+ex.ToString()); return default(T); } }
你可能已经猜到了,但我正在尝试制作一个方法,将一些数据(通过POST)发送到一个Web服务器,该服务器接收到数据,并根据"markString"返回某些JSON对象。
这个Web服务器已经正常工作(我用一些插件测试过,它的功能正常)
这个方法应该发送"markString"并接收数据,然后我可以在应用程序中使用它。
我正在制作一个Xamarin Android应用程序。
还要记住,我没有任何连接问题,事实上,当我尝试使用Web客户端进行数据发送时,该应用程序发送数据的方式非常好,但我希望它使用HttpClient
发送。
问题:
代码没有返回任何内容。非常感谢您提供任何关于信息、澄清、问题、建设性评论或任何可能导致答案的内容。
提前致谢。
问题的出现是由于使用HttpClient发送POST请求时返回的数据为空,无论是否使用FormUrlEncodedContent或StringContent作为请求内容。
解决方法是使用以下代码来发送POST请求并获取响应数据:
void Main() { var test = SendPostRequest("http://www.google.com", "OperationType", "eaf7d94356e7fd39935547f6f15e1c4c234245e4"); test.Dump(); } public async static Task<string> SendPostRequest(string url, string key, string value) { try { var uri = new Uri(url); HttpClient client = new HttpClient(); // 构建请求内容 var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>(key, value) }); // 发送POST请求 HttpResponseMessage response = await client.PostAsync(uri, content); // 读取响应数据 var json = await response.Content.ReadAsStringAsync(); return json; } catch (System.Exception ex) { Console.WriteLine("Error: " + ex.ToString()); return string.Empty; } }
问题的原因是:在使用异步代码时,大多数死锁场景是由于在调用栈上方阻塞。
解决方法是:默认情况下,await
会捕获一个“上下文”(在这种情况下,是UI上下文),并在该上下文中恢复执行。因此,如果调用一个async
方法并在任务上阻塞(例如GetAwaiter().GetResult()
、Wait()
或Result
),那么UI线程将被阻塞,这将阻止async
方法的继续恢复和完成。
以下是如何使用HttpClient发送POST请求的代码示例:
using System; using System.Net.Http; using System.Threading.Tasks; public class Program { public static async Task Main() { using (HttpClient client = new HttpClient()) { // 创建要发送的数据 var data = new StringContent("Your data"); // 发送POST请求 HttpResponseMessage response = await client.PostAsync("http://example.com/api", data); // 确保响应成功 response.EnsureSuccessStatusCode(); // 读取响应内容 string result = await response.Content.ReadAsStringAsync(); // 打印响应结果 Console.WriteLine(result); } } }
以上代码演示了如何使用HttpClient发送POST请求。首先,我们使用HttpClient类创建一个客户端实例。然后,我们创建要发送的数据,并将其作为参数传递给PostAsync方法。该方法将发送POST请求并返回一个HttpResponseMessage对象。我们可以使用EnsureSuccessStatusCode方法确保响应成功,然后使用ReadAsStringAsync方法读取响应内容。最后,我们打印出响应结果。
这个解决方案适用于使用HttpClient发送POST请求的情况,并且避免了由于阻塞上下文而导致的死锁问题。