如何使用 HttpClient 发布数据? (一个比实际有效的答案)

Posted

技术标签:

【中文标题】如何使用 HttpClient 发布数据? (一个比实际有效的答案)【英文标题】:How to post data using HttpClient? (an answer than actually works) 【发布时间】:2017-03-30 13:55:15 【问题描述】:

关于这个还有另一个问题,但它最终没有一个有效的解决方案,唯一的好答案,出于某种原因,不起作用,不适用于提出问题的人,也不适用于我.

这样的问题在这里: How to post data using HttpClient?

鉴于相应的声明,这是我到目前为止的代码:

调用与网络服务器连接的方法的方法:

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”它返回某些 json 对象.

这个网络服务器已经正常工作了(我用一些插件对其进行了测试,它应该可以正常工作)

此方法应该发送“markString”并接收回数据,以便我可以在应用程序中使用它。

我正在制作一个 Xamarin android 应用程序。

另外请记住,我根本没有任何连接问题,事实上,当我尝试使用 Web 客户端发送数据时,该应用程序正在发送数据,但我希望它使用 @987654325 发送它@。

问题

代码没有返回任何内容。任何要求提供信息、澄清、问题、建设性的 cmets 或任何可能导致答案的请求也将不胜感激。

提前致谢。

【问题讨论】:

请确保您不是 blocking on async code 在调用堆栈中的更高级。 男孩,¡你在哪里对!这是一个僵局问题,如果你将它转换为答案,我会给你正确的答案,这比两者都重要,我的发布的代码和那里的人的代码有效,但这并不是真正的问题,非常感谢。 还提供一个代码,说明您如何使用该方法。旁注:奇怪的是有一个名为 SendGetRequest 的方法来发送帖子请求:) @Evk 这是一个公平的请愿,我现在就足够了。 @Evk 是的,这是一个陈旧的名字,但我想我喜欢活到极限;)(更不用说把“GetDataAsync”这个名字放在天上。 ) 【参考方案1】:

大多数异步代码的死锁情况是由于blocking further up the call stack。

默认情况下,await 捕获“上下文”(在本例中为 UI 上下文),并在该上下文中继续执行。因此,如果您调用 async 方法和任务上的块(例如,GetAwaiter().GetResult()Wait()Result),则 UI 线程被阻塞,这会阻止 async 方法恢复和完成。

【讨论】:

【参考方案2】:
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;
    


【讨论】:

不,也不行,无论如何它都会返回null,谢谢你的尝试

以上是关于如何使用 HttpClient 发布数据? (一个比实际有效的答案)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HttpClient 发布数据? (一个比实际有效的答案)

如何使用HttpClient发布数据?

如何使用 HttpClient 将 JSON 数据发布到 Web API

如何使用 HttpClient 进行多线程操作?

如何使用异步发布并使用 HttpClient 等待

使用 HttpClient 时如何在 HttpContent 中设置大字符串?