Search code examples
c#apihttpautomation

The body I am send through as a POST request gives me a bad request, where am I going wrong using HTTP.NET


The body I am send through as a POST request gives me a bad request, where am I going wrong using HTTP.NET.

Here is my code, I've tried deserializing the json body and I have also tried reading it from a file but still get bad request, am I missing something

            string accessKeyId = "<KEY>";
            string secretAccessKey = "<KEY>";
            var clientSecurity = new ClientSecurity(new SignatureVersionFactory());
            var url = GetCreateSchedulingJobUrl(@"C:\Users\me\Desktop\test.txt");

            var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, url);
            //httpRequestMessage.Headers.Accept.Add("Content-Type", "application/json");
            //httpRequestMessage.Headers.Accept.Add(new 
            MediaTypeWithQualityHeaderValue("application/json"));
            using var client = new HttpClient();
             
            var body = File.ReadAllText(@"C:\Users\me\Desktop\test.txt");
            var content = JsonConvert.SerializeObject(body);
            httpRequestMessage.Content = new StringContent(content);
            httpRequestMessage.Content.Headers.ContentType = new 
            MediaTypeHeaderValue("application/json");
            clientSecurity.SignRequestAsync(httpRequestMessage, accessKeyId, 
            secretAccessKey, SigningAlgorithms.S3S);
            var response = client.SendAsync(httpRequestMessage).Result;
            int statusCode = (int)response.StatusCode;
            string statusMsg = response.Content.ReadAsStringAsync().Result;

I have also tried:

                var body = @"{
                                " + "\n" +
                             @"    ""name"": ""Some name""
                             " + "\n" +
                             @"}";
                var content = JsonConvert.SerializeObject(body);
                request.Content = new StringContent(content);
                request.Content.Headers.ContentType = new 
                MediaTypeHeaderValue("application/json");
                response = httpClient.PostAsync(webUrl,request.Content).Result;

BUT still get bad request, are there alternative ways of doing this?


Solution

  • Do this and try again

    var content = File.ReadAllText(@"C:\Users\me\Desktop\test.txt");
    // var content = JsonConvert.SerializeObject(body);
    

    If it works tidy up afterwards.

    JsonSerialize() serializes objects to JSON strings. You are reading in a JSON string (an already serialized representation of an object) and then serializing it again. Have a look at this...

    public class Obj
    {
      public string name;
    }
    :
      var obj = new Obj { name = "value" };
      var json1 = JsonConvert.SerializeObject(obj);
      var json2 = "{ \"name\":\"value\" }";
      var json3 = JsonConvert.SerializeObject(json1);
      Console.WriteLine($"json1:{json1}");
      Console.WriteLine($"json2:{json2}");
      Console.WriteLine($"json3:{json3}");
    

    which produces

    json1:{"name":"value"}
    json2:{ "name":"value" }
    json3:"{\"name\":\"value\"}"
    
          <- plain old string ->