gpt4 book ai didi

c# - 是否可以将默认内容类型设置为 "application/json;v=2.0"

转载 作者:行者123 更新时间:2023-12-03 09:31:43 25 4
gpt4 key购买 nike

是否可以将默认内容类型设置为“application/json; v = 2.0”。我说默认值是因为我正在使用HttpClient类,并且使用DefaultRequestHeaders将代理设置为默认值。

我按照此示例创建了头https://stackoverflow.com/a/10679340/196526,但我也使用版本控制,有关版本控制的信息保存在ContenT-Type中

public class BankAccountProxy
{
public void SetToken()
{
Client = new HttpClient();
Client.BaseAddress = new Uri(System.Configuration.ConfigurationManager.AppSettings["ApiRoute"]);
Client.DefaultRequestHeaders.Accept.Clear();
Client.DefaultRequestHeaders.Add("Token", ApiInformations.ApiToken);
Client.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue($"application/json;v=2.0"));
}

public async Task<IEnumerable<BankAccount>> Get()
{
HttpResponseMessage response = await Client.GetAsync($"/api/BankAccount/");
response.EnsureSuccessStatusCode();
IEnumerable<BankAccount> bankAccount;
bankAccount = await response.Content.ReadAsAsync<IEnumerable<BankAccount>>();
return bankAccount;
}
}

当我运行此代码时,我得到一个

Exception message: The format of value 'application/json;v=2.0' is invalid.



由于v = 2.0,可能不是有效的MediaTypeWithQualityHeaderValue。

我要确保我始终在Content-Type header 值中发送版本信息。如何初始化?我该如何告诉我的代码,我的默认内容类型不是质量 header ,而是有效的 header 。

有关信息,这是我对Postman的完美查询:

enter image description here

最佳答案

TL; DR

使用此代码:

    class Program
{
static async Task Main(string[] args)
{
try
{
var client = new HttpClient { BaseAddress = new Uri("https://contenttypev2.free.beeceptor.com") }; // interceptor
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Token", "SOME_TOKEN"); // simplified

var response = await client.GetJson2Async("/api/BankAccount/");
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsStringAsync(); // simplified
Console.WriteLine(data);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
finally
{
Console.ReadLine();
}
}
}

class Json2Content : StringContent
{
public Json2Content(string content) : this(content, Encoding.Default) { }

public Json2Content(string content, Encoding encoding) : base(content, encoding)
{
this.Headers.Clear();
this.Headers.ContentType = new MediaTypeHeaderValue("application/json");
this.Headers.ContentType.Parameters.Add(new NameValueHeaderValue("v", "2.0"));
if (!encoding.Equals(Encoding.Default)) this.Headers.ContentType.CharSet = encoding.HeaderName;
}
}

static class Json2Extensions
{
public static Task<HttpResponseMessage> GetJson2Async(this HttpClient client, string requestUri, string content = "", Encoding encoding = default)
{
var request = new HttpRequestMessage(HttpMethod.Get, requestUri) { Content = new Json2Content(content, encoding ?? Encoding.Default) };
return client.SendAsync(request);
}
}

结果如下:

enter image description here

解释

carlosfigueira所述:

The content type is a header of the content, not of the request



因此,像在这里一样设置 Accept header :

Client.DefaultRequestHeaders
.Accept
.Add(new MediaTypeWithQualityHeaderValue($"application/json;v=2.0"));

对您的目标无济于事。

为了简化JSON v2内容类型的使用,您可以使用上面的包装器类以及提供的扩展方法。

笔记

您确定要设置 Content-Type header 吗?在GET请求中包含内容很少见。
如果要向服务器发送信号,表示希望 接收 JSON v2响应,则应在 Accept header 中进行操作。甚至您在问题注释中引用的 API versioning document都表明可以在 Accept header 或 Content-Type header 中设置版本号。如果有内容,您仍然可以使用'Accept' header 设置版本,您可以将其作为默认设置,如下所示:

var client = new HttpClient { BaseAddress = new Uri("https://contenttypev2.free.beeceptor.com") }; // interceptor
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Token", "SOME_TOKEN"); // simplified
client.DefaultRequestHeaders.Accept.Clear();
var json2MediaType = new MediaTypeWithQualityHeaderValue("application/json");
json2MediaType.Parameters.Clear();
json2MediaType.Parameters.Add(new NameValueHeaderValue("v", "2.0"));
client.DefaultRequestHeaders.Accept.Add(json2MediaType);

var response = await client.GetAsync("/api/BankAccount/");
...

结果是:

enter image description here

关于c# - 是否可以将默认内容类型设置为 "application/json;v=2.0",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55644730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com