Lee Ames
Lee Ames

Reputation: 349

API Get requires Content-Type application/json;charset=UTF-8 - Issue with Http Client

I am working with an API service that requires Content-Type to be set to application/json;charset=UTF-8.

If I make a request without the charset=UTF-8 I get a 406 - Not Acceptable.

I can make a call through Postman setting the Content-Type as required, but if I use my .Net Http Client I get the error:

System.FormatException: 'The format of value 'application/json;charset=UTF-8' is invalid.'

Is there anyway I can work around this validation and force the Http Client to accept the value?

UPDATE:

Here is my latest attempt,it still throws the error.

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

UPDATE: Content-Type is indeed an invalid header. The API Developers removed it at our request.

Upvotes: 12

Views: 43441

Answers (6)

Ashwin Rajaram
Ashwin Rajaram

Reputation: 116

Not sure if still relevant, but I recently ran into this same issue and was able to solve by setting the header in the following way:

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

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

Upvotes: 1

Iurie Marchitan
Iurie Marchitan

Reputation: 251

Try to set the property:

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

Upvotes: 17

veez101
veez101

Reputation: 1

I only added the authentication header to it and it worked for me. AuthToken is either a string variable or the token itself. I left out the content type header and it just works. Below is the code; Response is a string that has to be serialized to a 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);
}

Upvotes: 0

William
William

Reputation: 134

Try adding double quotes around UTF-8, like this:

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

EDIT:

Ok, try something like this. It's working for me locally with a WebApi I already had handy. Notice there is a header specification for what content-type will be ACCEPTED, and then there is a header for what content-type will be SENT with the request. For this example, both of them are 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();               
        }
    }

Upvotes: 0

user2268070
user2268070

Reputation: 1

Try creating a client helper class like:

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;

Upvotes: -1

Roman Marusyk
Roman Marusyk

Reputation: 24579

Try this one

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

Upvotes: 6

Related Questions