API Get请求要求Content-Type为application/json;charset=UTF-8——Http客户端问题

12

我正在使用一个需要将Content-Type设置为application/json;charset=UTF-8的API服务。

如果我发送请求时包含charset=UTF-8,我会收到406 - Not Acceptable的错误。

我可以通过Postman设置所需的Content-Type进行调用,但如果我使用我的.Net Http Client,我会得到以下错误:

System.FormatException: '值“application/json;charset=UTF-8”的格式无效。'

我是否有办法绕过此验证并强制Http Client接受该值?

更新:

这是我的最新尝试,它仍然会抛出错误。

Body.Headers.ContentType = new MediaTypeHeaderValue("application/json;charset=UTF-8");

更新:Content-Type确实是一个无效的头信息。 API开发人员按照我们的要求将其删除了。


请问您能否展示一下设置httpclient的Content-Type的代码? - Roman Marusyk
1
@RomanMarusyk 没问题,我刚刚在上面添加了。谢谢! - Lee Ames
1
仅供记录:为application/json指定字符集确实是没有意义的。我会将其报告为错误。 - Julian Reschke
@JulianReschke,这正是我怀疑的。您知道我在哪里可以找到文档与API开发人员分享,以说服他们删除该要求吗?我认为这违反了某个标准。 - Lee Ames
我一直在寻找有关标准的文档,以查看Content-Type的正确语法。我找到了这个链接,表明带有字符集的Content-Type应该是有效的。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type 然而,当我尝试添加值:text/html; charset=utf-8(来自链接),我得到相同的无效错误。System.FormatException:'值"text/html; charset=utf-8"的格式无效。' 我肯定需要一些澄清。 - Lee Ames
显示剩余2条评论
6个回答

14

尝试设置属性:

 new MediaTypeHeaderValue("application/json")
        {
            CharSet = Encoding.UTF8.WebName
        }; 

5

试试这个

HttpClient httpClient= new HttpClient();
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");

1
我试过了这个方法,但返回值是false,说明没有添加头信息。此外,当我检查客户端对象时,我发现它没有被添加到头信息列表中。不过还是谢谢你的建议。 - Lee Ames
1
@Neo 是的,对我来说,是在旧的asp.net(不是Core)中。你遇到什么问题了吗? - Roman Marusyk

1

不确定是否仍然相关,但我最近遇到了同样的问题,并通过以下方式设置标头来解决:

string str = $"application/vnd.fmsstandard.com.Vehicles.v2.1+json; charset=UTF-8";

client.DefaultRequestHeaders.Add("Accept", str);

最好在此之前执行client.DefaultRequestHeaders.Accept.Clear(),但除此之外,这应该是被接受的答案。编辑:不用理会,原帖作者谈论的是内容类型而不是接受头。 - Epicycle

0

我只是添加了身份验证头部,然后它就对我起作用了。 AuthToken 可以是字符串变量或令牌本身。我省略了内容类型头部,它也可以正常工作。以下是代码;Response 是一个字符串,必须序列化为 Jobject

{
    String Response = null;
    HttpClient client = new HttpClient(CertByPass());
    client.Timeout = TimeSpan.FromMinutes(5);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(AuthToken);
    Response = await client.GetStringAsync(url);
}

0
尝试在UTF-8周围添加双引号,像这样:

Body.Headers.ContentType = new MediaTypeHeaderValue("application/json;charset=\"UTF-8\"");

编辑:

好的,尝试这样做。我用我本地已经准备好的 WebApi 工作正常。请注意,有一个头部规范指定将被接受的内容类型,然后有一个头部指定将与请求一起发送的内容类型。对于此示例,两者都是 JSON:

public static async Task<string> HttpClient(string url) 
    {
        using(HttpClient client = new HttpClient()) 
        {
            client.BaseAddress = new Uri(url);

            client.DefaultRequestHeaders
                  .Accept
                  .Add(new MediaTypeWithQualityHeaderValue("application/json")); // ACCEPT header


            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "");
            request.Content = new StringContent("{\"id\" : 1}",
                                Encoding.UTF8,  
                                "application/json"); // REQUEST header


            HttpResponseMessage response = await client.SendAsync(request);
            response.EnsureSuccessStatusCode();

            return await response.Content.ReadAsStringAsync();               
        }
    }

我得到了和之前一样的验证错误。但是我很感谢您的建议! - Lee Ames

-1
尝试创建一个客户端帮助类,例如:
HttpClient client = new HttpClient();       
client.BaseAddress = new Uri(whatever  your url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
return client;

2
OP说:“如果请求中没有charset=UTF-8,我会收到406 - Not Acceptable的错误。” - Roman Marusyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接