当我使用PostAsync发送数据时,服务器返回400错误

问题描述:

我正在使用以下方法发布到Web服务。当我使用它时,我经常会遇到400错误。如果我用我通过在使用,虽然在Posty相同的数据,该服务返回预期的数据当我使用PostAsync发送数据时,服务器返回400错误

public static async Task<T> SendData<T>(string apiToUse, params string[] data) 
    { 
     var url = string.Format("{0}/{1}", Constants.BaseTestUrl, apiToUse); 

     dynamic t; 

     var kvp = new Dictionary<string, string>(); 

     for (var i = 0; i < data.Length; i += 2) 
     { 
      kvp.Add(data[i], data[i + 1]); 
     } 

     var dta = new FormUrlEncodedContent(kvp); 
     dta.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data"); 

     using (var client = new HttpClient()) 
     { 
      var result = client.PostAsync(url, dta).Result; 
      //result.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data"); 
      var rv = result.Content.ReadAsStringAsync().Result; 
      t = JsonConvert.DeserializeObject<T>(rv); 
     } 

     return t; 
    } 

在我的测试例子,我进入帕拉姆的String []数据的两个键和两个值。

我能看到的唯一不同之处在于,在点击发送(我也在这里完成)之前,我已经定义了Content-Type。

这让我有点疯狂,所以任何指针都会被赞赏。

+0

你检查了目标网址是否正确?我认为HttpClient在其构造函数中需要一个基地址,然后在其方法上使用相对地址。 –

+0

400中的HTTP响应代码意味着您的请求有问题。如果不知道您要发布的服务以及期望的服务,那么我们可以推荐的内容并不多。检查您尝试使用的API的文档,并确保您的请求格式正确。 – TZHX

很难提供一个完整的答案,而不完全知道请求应该如何。你可以尝试/如下调整代码:

var kvp = string.Empty; 

for (var i = 0; i < data.Length; i += 2) 
{ 
    kvp += string.Format("{0}={1}; ", data[i], data[i+1]); 
} 

// remove last ';' character 
kvp = kvp.TrimEnd(new char[] { ' ', ';' }); 

var dta = new MultipartFormDataContent(); 
dta.Add(new StringContent(kvp)); 

的变化在于使用MultipartFormDataContent符合要求的格式。显然,这段代码只是为了测试。额外的验证和内容创建(kvp)应在投入生产之前完成。