简体   繁体   English

C# HttpClient Post 使用 Json Object 失败

[英]C# HttpClient Post using Json Object is failing

Problem Statement:问题陈述:

I'm trying to post the data to the test url in C# using JSON data is failing, but when i try the same thing in Postman it succeeds. I'm trying to post the data to the test url in C# using JSON data is failing, but when i try the same thing in Postman it succeeds.

C# Code snippet C# 代码片段

            string uploadPath = @"https://api.test.com/test";
            string jsonData = "{ \"message\":\"ERROR: ABCDEXY: Price\"," +
            "\"source\":\"BYODB\"," +
            "\"tag\":[\"ABXT\",\"I232-F103\"],\"ID\":\"{76573406E8}\"}";

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Authorization", "apiKey " + "7cbafstad-677654c4-8765fgt-95deb");
                var content= new StringContent(jsonData, Encoding.UTF8, "application/json");
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                HttpResponseMessage response = client.PostAsync(uploadPath, content).Result;
                var responseBody = response.Content.ReadAsStringAsync().Result;
                if (response.IsSuccessStatusCode)
                {
                    var sucessRes = JsonConvert.DeserializeObject<dynamic>(responseBody);
                    //Print Success Msg
                }
                else
                {
                    var failureRes = JsonConvert.DeserializeObject<dynamic>(responseBody);
                    //Print Failure Msg
                }
            }

Exception Details:异常详情:

For Response Object, i'm receiving:对于响应 Object,我收到:

response = {StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Transfer-Encoding: chunked
  Connection: keep-alive
  X-Response-Time: 0.001
  X-Request-ID: 4514d1b-1a3f-4277-9997-2813cd9d28ed
 X-Rat...

For Response Body, i'm receiving:对于响应正文,我收到:

{"message":"Invalid JSON","took":0.001,"requestId":"4514d1b-1a3f-4277-9997-2813cd9d28ed"}

When i try to invoke this through postman,it is succeeding:当我尝试通过 postman 调用它时,它成功了:

What i'm doing wrong in my C# JSON Post..?我在 C# JSON 帖子中做错了什么?

The best approach is to use an actual object and let NewtonsoftJson take care of the serialization.最好的方法是使用实际的 object 并让 NewtonsoftJson 负责序列化。

You will need two nuget packages for this:为此,您将需要两个 nuget 包:

  1. Microsoft.AspNet.WebApi.Client Microsoft.AspNet.WebApi.Client
  2. Newtonsoft.Json Newtonsoft.Json

The code looks like this:代码如下所示:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace Custom.ApiClient
{
    internal static class WebApiManager
    {
        //private const string _requestHeaderBearer = "Bearer";
        private const string _responseFormat = "application/json";

        private static readonly HttpClient _client;

        static WebApiManager()
        {

            // Setup the client.
            _client = new HttpClient { BaseAddress = new Uri("api url goes here"), Timeout = new TimeSpan(0, 0, 0, 0, -1) };

            _client.DefaultRequestHeaders.Accept.Clear();
            _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(_responseFormat));

            // Add the API Bearer token identifier for this application.
            //_client.DefaultRequestHeaders.Add(RequestHeaderBearer, ConfigHelper.ApiBearerToken);       
        }
        public static async Task<T> Post<T>(object requestObject)
        {//the request object is the object being sent as instance of a class
            var response = _client.PostAsJsonAsync("api extra path and query params go here", requestObject);

            return await ProcessResponse<T>(response);
        }
        private static async Task<T> ProcessResponse<T>(Task<HttpResponseMessage> responseTask)
        {//T represents the respose you expect from this call
            var httpResponse = await responseTask;

            if(!httpResponse.IsSuccessStatusCode)
                throw new HttpRequestException(httpResponse.ToString());

            var dataResult = await httpResponse.Content.ReadAsAsync<T>();

            return dataResult;
        }
    }
}

To use this code you need to do something like this:要使用此代码,您需要执行以下操作:

var myObject = new Object_I_Want_To_Send();
//set some properties here

var response = await WebApiManager.Post<MyResponse>(myObject);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM