如何使用HttpClient发布数据?(一个真正起作用的答案)

32 浏览
0 Comments

如何使用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 Task SendGetRequest(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发送。

问题:

代码没有返回任何内容。非常感谢您提供任何关于信息、澄清、问题、建设性评论或任何可能导致答案的内容。

提前致谢。

0
0 Comments

问题的出现是由于使用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;
    }
}

0
0 Comments

问题的原因是:在使用异步代码时,大多数死锁场景是由于在调用栈上方阻塞。

解决方法是:默认情况下,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请求的情况,并且避免了由于阻塞上下文而导致的死锁问题。

0