1

我有以下代码向外部端点发出 HTTP 请求,这会抛出一个 422 状态代码,它是不可处理的实体。当使用 Postman 直接调用外部 URL 时,相同的请求负载可以正常工作。

using (HttpClient httpClient = new HttpClient())
{
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            var Json = JsonConvert.SerializeObject(loanRequest, new JsonSerializerSettings
            {
                ContractResolver = new DefaultContractResolver
                {
                    IgnoreSerializableAttribute = false
                }
            });
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "externalEndPointURL");

            request.Content = new StringContent(Json,Encoding.UTF8,"application/json");//CONTENT-TYPE header
            HttpContent httpContent = new StringContent(Json, Encoding.UTF8, "application/json");
            httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            httpClient.DefaultRequestHeaders.TryAddWithoutValidation("content-type", "application/json; charset=utf-8");
            httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}");
            await httpClient.SendAsync(request).ContinueWith(task => {

                Console.WriteLine($"Response {task.Result}");
            });
}

//请求负载

{
    "Merchant": "GAP",
    "Lender": "BEN",
    "RateType": "VAR",
    "RepaymentType": "PI",
    "PropertyUsage": "INV",
    "CustomerRate": 0.0429,
    "LoanTerm": 20,
    "BorrowingAmount": 600000,
    "RateTerm": null
}

编辑

下面是两个请求头的比较。

工作的那个 错误

4

2 回答 2

1

试试这个,如果它不起作用,什么都不会起作用

var baseUri= @"http://localhost:554";
var api = "/api/..";
    
using HttpClient client = new HttpClient { BaseAddress = new Uri(baseUri) };

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
    
var json = JsonConvert.SerializeObject(loanRequest);    
    
var content = new StringContent(json, UTF8Encoding.UTF8, "application/json");

var response = await client.PostAsync(uri, content);

if (response.IsSuccessStatusCode)
{
    var stringData = await response.Content.ReadAsStringAsync();
    var result = JsonConvert.DeserializeObject<object>(stringData);
}

更新

你发布的 Json 有

"PropertyUsage": "INV",

但是 LoanRequestDTO 没有这个属性。由于您使用的是 API 控制器,因此它会自动验证输入并立即返回错误,而不会触发操作。我想知道如何在序列化过程中创建这个额外的属性。也许你没有更多的属性?

于 2022-01-08T22:28:34.480 回答
0

检查邮递员发送的标头(通过单击标头选项卡中的“隐藏”按钮以获取请求或在发送请求后在邮递员控制台中)。尝试添加您的请求中缺少的内容。很多时候网站都很挑剔,User-Agent所以我会先从那个开始:

httpClient.DefaultRequestHeaders
    .TryAddWithoutValidation(HeaderNames.UserAgent,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36")

附言

同样普遍的共识是重用HttpClient更好,所以除非这是一次性的 - 尝试在请求之间共享客户端。

于 2022-01-08T21:56:58.357 回答