HttpClient 添加“api-version=1.0”以接受标头

问题描述 投票:0回答:2

我正在使用 .NET6 并已将版本控制添加到我的 ASP Web API。

我不想在 url mysite.com/api/v1/controller 中包含版本号,而是想将 api-version 添加到 Accept 标头或作为单独的自定义标头。

到目前为止我所尝试的只会产生错误,任何帮助将不胜感激。

[HttpPost]
public async Task<ServiceResponse<DataResponseDto>> Login(DataDto bodyParams)
{

    try {
    
        HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(bodyParams), Encoding.UTF8, $"application/json");

        var httpClient = _httpClient.CreateClient("MyAPI");
        

        // The various Accept headers I have tried
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json; api-version=1.0"));
        httpClient.DefaultRequestHeaders.Add("Accept", "application/json; api-version=1.0");
        

        var response = await httpClient.PostAsync("Data/Send", httpContent);

        response.EnsureSuccessStatusCode();                                         // Throws an exception if not 200 OK

        var stream = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<ServiceResponse<DataResponseDto>>(stream);

        return result;

    }  
    catch (Exception ex)
    {

        // logger and stuff

        return result;
    }
}

不幸的是,我总是得到的响应是“值的格式‘application/json;api-version=1.0’无效。”我觉得还可以。我在邮递员中尝试了这个请求并且它有效。

然后我尝试添加自己的自定义标题

httpClient.DefaultRequestHeaders.Add("api-version", "1.0");

然而,响应是“响应状态代码不表示成功:415(不支持的媒体类型)。”

Ay 帮助在标头中发送我的 API 版本将不胜感激。这个网上资料不多,大部分搜索结果都是发送HTTP版本或者自己写自定义版本控制。

谢谢。

http-headers asp.net-core-webapi httpclient .net-6.0
2个回答
0
投票

这一行有问题:

httpClient.DefaultRequestHeaders.Add("Accept", "application/json; api-version=1.0");

相反,尝试:

  httpClient.DefaultRequestHeaders.Add("Accept", "application/json;");
  httpClient.DefaultRequestHeaders.Add("api-version", "1.0");

0
投票

我第一次尝试时错过了“.Parse()”。

httpClient.DefaultRequestHeaders.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json; api-version=2.0"));
© www.soinside.com 2019 - 2024. All rights reserved.