使用HttpClient调用身份服务器获取Token时出现415 Unsupported Media Type错误
使用HttpClient获取Token出现415错误,RestClient却正常的原因及修复
用HttpClient从身份服务器获取Token时遇到415 Unsupported Media Type错误,但换成RestClient却能正常运行,这是怎么回事?
HttpClient 错误代码
HttpClient _client = new HttpClient(); string clientId = "clientid"; string issuer = "https://ourrdomain/token"; string secretKey = "secret"; var byteArray = System.Text.Encoding.ASCII.GetBytes(clientId + ":" + secretKey); var httpRequestMessage = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri(issuer), Headers = { { HttpRequestHeader.Authorization.ToString(), "Basic " + Convert.ToBase64String(byteArray) }, { HttpRequestHeader.ContentType.ToString(), "application/x-www-form-urlencoded" }, { HttpRequestHeader.CacheControl.ToString(), "no-cache" }, { "grant_type", "client_credentials" } } }; var response = _client.SendAsync(httpRequestMessage).Result;
RestClient 正常代码
var request = new RestRequest(); var client = new RestClient(issuer); string clientId = "clientid"; string issuer = "https://ourrdomain/token"; string secretKey = "secret"; var byteArray = System.Text.Encoding.ASCII.GetBytes(clientId + ":" + secretKey); request.Method = Method.Post; request.AddHeader("cache-control", "no-cache"); request.AddHeader("content-type", "application/x-www-form-urlencoded"); request.AddHeader("Authorization", "Basic " + Convert.ToBase64String(byteArray)); request.AddParameter("grant_type", "client_credentials"); var response2 = client.Execute(request);
问题根源
- 参数位置错误:HttpClient代码里把
grant_type放在了请求头(Headers)中,但application/x-www-form-urlencoded类型的请求,参数必须放在请求体里,身份服务器期望从请求体读取grant_type参数,因此会因请求内容格式不匹配返回415错误。 - ContentType设置方式错误:直接在Headers里添加
Content-Type头不符合HttpClient的规范,正确做法是通过请求的Content属性设置,直接添加的头可能被忽略或导致格式冲突。
RestClient的AddParameter方法默认会将参数编码为application/x-www-form-urlencoded格式并放入请求体,同时自动处理Content-Type头,因此能正常请求。
修正后的HttpClient代码
HttpClient _client = new HttpClient(); string clientId = "clientid"; string issuer = "https://ourrdomain/token"; string secretKey = "secret"; var byteArray = System.Text.Encoding.ASCII.GetBytes($"{clientId}:{secretKey}"); // 设置认证头 _client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); // 设置缓存控制头 _client.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue { NoCache = true }; // 构造form-urlencoded格式的请求体 var formData = new Dictionary<string, string> { { "grant_type", "client_credentials" } }; var content = new FormUrlEncodedContent(formData); var response = _client.PostAsync(issuer, content).Result;
内容的提问来源于stack exchange,提问作者RDeveloper
相关产品推荐
相关产品推荐

