2

我遵循了 HttpClient 示例,但无法弄清楚如何发布带有 2 个参数的方法。

以下是我尝试过的,但它返回错误的网关错误:

        private async void Scenario3Start_Click(object sender, RoutedEventArgs e)
    {
        if (!TryUpdateBaseAddress())
        {
            return;
        }

        Scenario3Reset();
        Scenario3OutputText.Text += "In progress";

       string resourceAddress =  "http://music.api.com/api/search_tracks";
        try
        {
            MultipartFormDataContent form = new MultipartFormDataContent();
        //    form.Add(new StringContent(Scenario3PostText.Text), "data");
            form.Add(new StringContent("Beautiful"), "track");
            form.Add(new StringContent("Enimem"), "artist");

            HttpResponseMessage response = await httpClient.PostAsync(resourceAddress, form);
        }
        catch (HttpRequestException hre)
        {
            Scenario3OutputText.Text = hre.ToString();
        }
        catch (Exception ex)
        {
            // For debugging
            Scenario3OutputText.Text = ex.ToString();
        }
    }

我浏览了整个互联网,但找不到任何显示如何执行 http post 方法的工作示例或文档。任何材料或样品都会对我有很大帮助。

4

2 回答 2

1

我更喜欢采用以下方法,将 POST 数据设置到请求内容正文中。必须调试它要容易得多!

使用您发布到的 URL 创建 HttpClient 对象:

string oauthUrl = "https://accounts.google.com/o/oauth2/token";
HttpClient theAuthClient = new HttpClient();

使用 Post 方法将您的请求发送到您的 url

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, oauthUrl); 

使用以 POST 数据格式显式设置的参数创建一个内容字符串,并在请求中进行设置:

string content = "track=beautiful" +
  "&artist=eminem"+
  "&rating=explicit";

request.Method = HttpMethod.Post;
request.Content = new StreamContent(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(content)));
request.Content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

发送请求并得到响应:

try
{                
    HttpResponseMessage response = await theAuthClient.SendAsync(request);
    handleResponse(response);
}
catch (HttpRequestException hre)
{

}            

一旦请求返回,您的处理程序将被调用,并将从您的 POST 中获得响应数据。以下示例显示了一个处理程序,您可以在其中设置断点以查看响应内容是什么,此时您可以解析它或对它做任何您需要做的事情。

public async void handleResponse(HttpResponseMessage response)
{
    string content = await response.Content.ReadAsStringAsync();

    if (content != null)
    {
        // put your breakpoint here and poke around in the data
    }
}
于 2012-11-20T16:51:48.230 回答
1

尝试使用 FormUrlEncodedContent 而不是 MultipartFormDataContent:

var content = new FormUrlEncodedContent(
    new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("track", "Beautiful"),
        new KeyValuePair<string, string>("artist", "Enimem")
    }
);
于 2012-04-27T18:50:18.137 回答