使用HttpClient调用API报错:Cannot send a content-body with this verb-type
问题分析与解决
错误原因
- "Cannot send a content-body with this verb-type":HttpClient严格遵循HTTP规范,GET请求的语义本身不允许携带请求体,你给GET请求设置
request.Content的操作违反了这一规范,因此抛出该错误。Postman没有严格限制这类不符合规范的请求,所以能正常运行。 - 415 Unsupported Media Type:注释掉
content.Headers.ContentType后,请求头中缺少了API要求的Content-Type: application/json,导致API无法识别请求格式,返回415错误。
修正方案
移除所有与请求体相关的代码,直接将Content-Type添加到请求头中(使用TryAddWithoutValidation绕过HttpClient的规范校验,因为你的API特殊要求GET请求携带这个头)。
修正后的代码:
try { // 建议复用HttpClient实例,避免频繁创建销毁导致Socket资源耗尽 var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, "https://connect1.uat.westpac.co.nz/fxrates/v1/forexratesheet/v2"); request.Headers.Add("X-IBM-Client-Id", "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx"); request.Headers.Add("X-IBM-Client-Secret", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); request.Headers.Add("accept", "application/json"); // 直接添加Content-Type请求头,绕过HttpClient的规范校验 request.Headers.TryAddWithoutValidation("Content-Type", "application/json"); var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); this.txtResult.Text = await response.Content.ReadAsStringAsync(); } catch (Exception ex) { this.txtResult.Text = ex.Message; }
额外注意
- 长期来看,建议复用
HttpClient实例,不要每次请求都新建,否则会造成Socket资源浪费。 - 该API的设计不符合标准HTTP语义(GET请求不应要求Content-Type或请求体),如果有条件可以咨询API提供者,确认是否有更规范的调用方式。
内容的提问来源于stack exchange,提问作者Matt frost
相关产品推荐
相关产品推荐

