none
使用Windows.Web.Http命名空间下的HttpClient如何使用post方法,将数据提交到服务器? RRS feed

  • 问题

  • 我的做法如下,将需要上传的参数放在HttpMultipartFormDataContent中,但是服务器无法接收到参数p1、p2,收到的都是null,请问哪位知道如何将参数post到服务器?
              
    Dictionary<string, string> dic = new Dictionary<string, string>();
    dic.Add("p1", "v1");
    dic.Add("p2","v2");
    
    HttpMultipartFormDataContent form = new HttpMultipartFormDataContent();
    foreach (var parm in dic)
    {
         form.Add(new HttpStringContent(dic.Value), dic.Key);
    }
    
    try
    {
        HttpClient httpClient = new HttpClient();
        HttpResponseMessage response = await httpClient.PostAsync(new Uri(uri), form);
    
        return await response.Content.ReadAsStringAsync();
    }
    catch (Exception ex)
    {
                    
    }

    2014年7月24日 3:51

答案

  • 你好 Nomooo,

    我这里做了一下测试,当然用的网站是w3school的一个测试页面: http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post, 他post的地址我写在下面代码里面:

                string uri = "http://www.w3schools.com/jquery/demo_test_post.asp";
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add("name", "myName");
                dic.Add("city", "myCity");
    
                HttpFormUrlEncodedContent content = new HttpFormUrlEncodedContent(dic);
    
    
                //HttpContent content = new FormUrlEncodedContent(dic);
                
               // FormUrlEncodedContent a
    
                try
                {
                    HttpClient httpClient = new HttpClient();
                    HttpResponseMessage response = await httpClient.PostAsync(new Uri(uri), content);
    
    
                    var k = await response.Content.ReadAsStringAsync();
    
                    //return await response.Content.ReadAsStringAsync();
                }
                catch (Exception ex)
                {
    
                }

    从这段代码来说,我使用的是 HttpFormUrlEncodedContent 而不是你使用的HttpMultipartFormDataContent , 他们的区别在于请求时候的文件头。建议你使用一些流量监测工具来检测你的数据包。

    当我使用HttpFromUrlEncodedContent的时候,我捕捉到的数据格式为:

    而当我使用HttpMultipartFormDataContent的时候,我捕捉到的数据为:

    相信你可以很容易的看到区别了吧,后者会为数据添加很多数据头信息,导致你的Http Post不能正常获取值。

    --Jame


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月25日 7:06
    版主

全部回复

  • 你好 Nomooo,

    我这里做了一下测试,当然用的网站是w3school的一个测试页面: http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_ajax_post, 他post的地址我写在下面代码里面:

                string uri = "http://www.w3schools.com/jquery/demo_test_post.asp";
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add("name", "myName");
                dic.Add("city", "myCity");
    
                HttpFormUrlEncodedContent content = new HttpFormUrlEncodedContent(dic);
    
    
                //HttpContent content = new FormUrlEncodedContent(dic);
                
               // FormUrlEncodedContent a
    
                try
                {
                    HttpClient httpClient = new HttpClient();
                    HttpResponseMessage response = await httpClient.PostAsync(new Uri(uri), content);
    
    
                    var k = await response.Content.ReadAsStringAsync();
    
                    //return await response.Content.ReadAsStringAsync();
                }
                catch (Exception ex)
                {
    
                }

    从这段代码来说,我使用的是 HttpFormUrlEncodedContent 而不是你使用的HttpMultipartFormDataContent , 他们的区别在于请求时候的文件头。建议你使用一些流量监测工具来检测你的数据包。

    当我使用HttpFromUrlEncodedContent的时候,我捕捉到的数据格式为:

    而当我使用HttpMultipartFormDataContent的时候,我捕捉到的数据为:

    相信你可以很容易的看到区别了吧,后者会为数据添加很多数据头信息,导致你的Http Post不能正常获取值。

    --Jame


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月25日 7:06
    版主
  • 所以从某种程度上来说,你需要首先看清楚你的Post页面接受的是什么样的值,然后才可以进行Post操作。

    具体请参考:How to connect to an HTTP server using Windows.Web.Http

    里面详细列出来Windows Store App支持的所有类型:

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月25日 7:08
    版主
  • Jame 能不能介绍一些调试数据包的流量监测工具呀///
    2014年7月25日 8:55
  • hi Jamles Hez

      谢谢你的回复,的确是这样的改成HttpFormUrlEncodedContent 服务端就可以收到数据了。

    2014年7月25日 9:35
  • @Simon, 我使用的流量工具是:Fiddler。 http://www.telerik.com/fiddler (这是一个三方的工具)


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.



    2014年7月25日 9:41
    版主
  • 谢谢Jamles,这个我以前用过,但好像不太会用,研究中。。。。
    2014年7月25日 9:45