.NET中使用HttpClient调用Gmail Batch API遇400错误求助
排查.NET HttpClient调用Gmail Batch API返回400错误的问题
使用Postman调用Gmail Batch API可正常获取结果,但通过.NET的HttpClient调用时,即便access token和boundary与Postman完全一致,仍返回400 Bad Request错误,错误响应如下:
{ "error": { "code": 400, "message": "Failed to parse batch request, error: Failed in parsing HTTP headers: (1 bytes redacted). Received batch body: (0) bytes redacted", "status": "INVALID_ARGUMENT" } }
问题原因
错误出在手动构建multipart请求内容的方式上:MultipartContent组件会自动处理boundary分隔符和请求结构,而代码中手动添加的--stackoverflow标记、结尾的--stackoverflow--,会导致HttpClient生成的请求体出现重复的boundary结构,最终不符合Gmail Batch API的解析规则。
修正后的代码
HttpClient httpClient = new HttpClient(); var uri = "https://www.googleapis.com/batch/gmail/v1"; var access_token = "[google access token]"; // 替换为你的access token httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", access_token); // 移除手动添加的Host头,HttpClient会自动处理 var multipartContent = new MultipartContent("mixed", "stackoverflow"); // 请求1:构建完整的HTTP请求内容 var request1Content = new StringContent( "GET /gmail/v1/users/me/messages/18ca8a5d1dc95d09?format=metadata HTTP/1.1\r\n\r\n", Encoding.UTF8, "application/http" ); multipartContent.Add(request1Content); // 请求2:构建完整的HTTP请求内容 var request2Content = new StringContent( "GET /gmail/v1/users/me/messages/18c94521fefc62d3?format=metadata HTTP/1.1\r\n\r\n", Encoding.UTF8, "application/http" ); multipartContent.Add(request2Content); var result = await httpClient.PostAsync(uri, multipartContent); using var reader = new StreamReader(await result.Content.ReadAsStreamAsync()); var json = await reader.ReadToEndAsync(); Console.WriteLine(json);
关键修改点
- 移除所有手动添加的boundary分隔符(
--stackoverflow、--stackoverflow--),MultipartContent会自动生成正确的分隔结构 - 每个子请求的内容需指定
application/http媒体类型,且要符合HTTP请求格式(包含HTTP版本,结尾添加空行) - 无需手动添加Host请求头,HttpClient会自动处理
内容的提问来源于stack exchange,提问作者devhong
相关产品推荐
相关产品推荐

