当前位置: 首页 > 知识库问答 >
问题:

是否可以将“默认内容类型”设置为“application/json;v=2.0”

公西岳
2023-03-14

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

我按照这个例子来创建我的头https://stackoverflow.com/a/10679340/196526,但是我也使用版本控制,关于版本控制的信息保存在内容类型中

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;
    }
}

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

异常消息:值的格式为application/json;v=2.0'无效。

因为v=2.0可能不是有效的MediaTypeWithQualityHeaderValue。

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

以下是我对Postman的完美查询:

共有1个答案

戎洛城
2023-03-14

使用此代码:

    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);
        }
    }

结果是这样的:

正如carlosfigueira所说:

内容类型是内容的标头,而不是请求的标头

因此,像您在这里所做的那样设置<code>Accept

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

这对你的目标没有帮助。

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

您确定要设置Content-Type标头吗?GET请求中包含内容是非常不常见的。如果您想向服务器发出信号表明您希望接收JSON v2响应,您应该在Accep标头中进行。即使是您在对问题的评论中引用的API版本控制文档也显示版本号可以在Accep标头或Content-Type标头中设置。当有内容时,您可能仍然可以使用“接受”标头来设置版本,您可以像这样作为默认操作:

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/");
...

导致:

 类似资料:
  • 我试图向另一个接受内容类型“application/json-patch+json”的API发出补丁rest请求。我正在使用Spring的webclient,但我无法让它工作。我不断得到“415不支持的媒体类型” 我试过下面的; 我也试过: 对于这两种情况,我看到以下错误; 它似乎变成了'application/x-www-form-urlencoded;charset=utf-8',是否可能对此

  • 我很好奇是否可以将iOS设置(例如位置/图片)重置为默认设置,这样用户每次都会被问到是否允许位置或相机使用。 目前,我正在尝试用Ionic/Cordova做这件事。 也许你们中有人知道怎么做,或者能告诉我这是不是可能的。

  • 问题内容: 我有一个映射有以下注释的控制器: 我返回了一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是唯一的。为什么未设置内容类型? 我的: 我的: 使用WildFly 8.1作为我的应用服务器。 问题答案: 要了解的第一件事是,在元素 仅用于限制请求处理程序的映射。 它什么也没做。 然后,假设您的方法的返回类型为,并带有注释,则将通过处理

  • 我有一个用以下注释映射的控制器: 我返回一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是,而是简单的。为什么没有设置内容类型? 我的: 我的: 使用Wildfly8.1作为我的应用服务器。

  • 例如,它是否是有效的ajax请求: 它有时被用作示例,或者软件可以在没有显式字符集的情况下中断。 rfc 4627 for application/json媒体类型表示不接受第6节中的任何参数: 可以这样解释,charset不应该与Application/json一起使用。 第3节建议无需指定字符集: 因为UTF-8,16,32编码可以从内容中感染。为什么说UTF-8是默认的?rfc中没有指定选择

  • 嗨,有人能帮我处理这个错误吗?当我使用邮递员发送邮件请求时,这里是我的控制器 这就是我使用postman发送json的方式 我正在尝试搜索如何修复它,但错误仍然存在 编辑:这是邮递员的标题 提前致谢