HttpClient post 调用适用于 postman 但不适用于 C#
HttpClient post call works on postman but not C#
正如标题所说,我的 post-call 在 postman 中有效,但在 c# 中无效。无论我尝试什么,它在我的 C# 代码中根本不起作用。
这是我的代码:
internal async Task<(string, int)> GetJsonFileFromApiCall(string query)
{
var _client = new HttpClient();
var apiUrl = "https://wf19vv0nsf-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%20(lite)%203.27.0%3Binstantsearch.js%202.10.2%3BMagento2%20integration%20(1.12.1)%3BJS%20Helper%202.26.0&x-algolia-application-id=WF19VV0NSF&x-algolia-api-key=MDdmNjA0Mjc1YzRkZjI4MWMwZmQyMDI4MDc5NDY4ZjlkYzJmOTVmMWY5Yjc3MGFkNDRiODA4YjU0MDVlM2Q1YnRhZ0ZpbHRlcnM9";
var load = new { Requests = new { IndexName = "magento2_tcg_productiondefault_products", Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D" } };
var message = await _client.PostAsync(apiUrl, GetStringContent(load));
message.EnsureSuccessStatusCode();
var jToken = JObject.Parse(await message.Content.ReadAsStringAsync());
//temp return
return ("", 1);
}
private static StringContent GetStringContent<T>(T load)
{
var serializeObject = JsonConvert.SerializeObject(load, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
return new StringContent(serializeObject, Encoding.UTF8, "application/json");
}
这是我的 Postman 截图:
需要注意的一件事是 post 请求在进行 post 调用时接收表单数据。
查看下面代码中的注释也包括错误..
internal async Task<(string, int)> GetJsonFileFromApiCall(string query)
{
var _client = new HttpClient();
var apiUrl = "https://wf19vv0nsf-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%20(lite)%203.27.0%3Binstantsearch.js%202.10.2%3BMagento2%20integration%20(1.12.1)%3BJS%20Helper%202.26.0&x-algolia-application-id=WF19VV0NSF&x-algolia-api-key=MDdmNjA0Mjc1YzRkZjI4MWMwZmQyMDI4MDc5NDY4ZjlkYzJmOTVmMWY5Yjc3MGFkNDRiODA4YjU0MDVlM2Q1YnRhZ0ZpbHRlcnM9";
var load = new
{
Requests = new
{
IndexName = "magento2_tcg_productiondefault_products",
Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__
%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_
rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD
.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D"
}
};
//insepct this..... im sure this is probably not what you think it is.
//worth double checking
var resultS = GetStringContent(load); //inspect the result value.
var message = await _client.PostAsync(apiUrl, resultS);
message.EnsureSuccessStatusCode();
var jToken = JObject.Parse(await message.Content.ReadAsStringAsync());
//temp return
return ("", 1);
}
private static StringContent GetStringContent<T>(T load)
{
var serializeObject = JsonConvert.SerializeObject(load, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
return new StringContent(serializeObject, Encoding.UTF8, "application/json");
}
在你的邮递员请求中,你的 post-body 的 requests
属性 是一个数组
{
"requests": [{...}]
}
而在您的 C# 代码中,它是一个对象
var load = new {
Requests = new { ... }
}
所以服务器可能无法从您的请求中获取所需的数据。将 requests
属性 创建为 List<object>
或 object[]
,因此它将被序列化为数组
var load = new {
Requests = new List<object>{new {...}}
}
我认为你应该更改这行代码
var load = new { Requests = new { IndexName = "magento2_tcg_productiondefault_products", Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D" } };
为此:
var load = new { Requests = new[] {new { IndexName = "magento2_tcg_productiondefault_products", Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D" }} };
正如标题所说,我的 post-call 在 postman 中有效,但在 c# 中无效。无论我尝试什么,它在我的 C# 代码中根本不起作用。
这是我的代码:
internal async Task<(string, int)> GetJsonFileFromApiCall(string query)
{
var _client = new HttpClient();
var apiUrl = "https://wf19vv0nsf-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%20(lite)%203.27.0%3Binstantsearch.js%202.10.2%3BMagento2%20integration%20(1.12.1)%3BJS%20Helper%202.26.0&x-algolia-application-id=WF19VV0NSF&x-algolia-api-key=MDdmNjA0Mjc1YzRkZjI4MWMwZmQyMDI4MDc5NDY4ZjlkYzJmOTVmMWY5Yjc3MGFkNDRiODA4YjU0MDVlM2Q1YnRhZ0ZpbHRlcnM9";
var load = new { Requests = new { IndexName = "magento2_tcg_productiondefault_products", Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D" } };
var message = await _client.PostAsync(apiUrl, GetStringContent(load));
message.EnsureSuccessStatusCode();
var jToken = JObject.Parse(await message.Content.ReadAsStringAsync());
//temp return
return ("", 1);
}
private static StringContent GetStringContent<T>(T load)
{
var serializeObject = JsonConvert.SerializeObject(load, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
return new StringContent(serializeObject, Encoding.UTF8, "application/json");
}
这是我的 Postman 截图:
需要注意的一件事是 post 请求在进行 post 调用时接收表单数据。
查看下面代码中的注释也包括错误..
internal async Task<(string, int)> GetJsonFileFromApiCall(string query)
{
var _client = new HttpClient();
var apiUrl = "https://wf19vv0nsf-dsn.algolia.net/1/indexes/*/queries?x-algolia-agent=Algolia%20for%20vanilla%20JavaScript%20(lite)%203.27.0%3Binstantsearch.js%202.10.2%3BMagento2%20integration%20(1.12.1)%3BJS%20Helper%202.26.0&x-algolia-application-id=WF19VV0NSF&x-algolia-api-key=MDdmNjA0Mjc1YzRkZjI4MWMwZmQyMDI4MDc5NDY4ZjlkYzJmOTVmMWY5Yjc3MGFkNDRiODA4YjU0MDVlM2Q1YnRhZ0ZpbHRlcnM9";
var load = new
{
Requests = new
{
IndexName = "magento2_tcg_productiondefault_products",
Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__
%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_
rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD
.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D"
}
};
//insepct this..... im sure this is probably not what you think it is.
//worth double checking
var resultS = GetStringContent(load); //inspect the result value.
var message = await _client.PostAsync(apiUrl, resultS);
message.EnsureSuccessStatusCode();
var jToken = JObject.Parse(await message.Content.ReadAsStringAsync());
//temp return
return ("", 1);
}
private static StringContent GetStringContent<T>(T load)
{
var serializeObject = JsonConvert.SerializeObject(load, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
return new StringContent(serializeObject, Encoding.UTF8, "application/json");
}
在你的邮递员请求中,你的 post-body 的 requests
属性 是一个数组
{
"requests": [{...}]
}
而在您的 C# 代码中,它是一个对象
var load = new {
Requests = new { ... }
}
所以服务器可能无法从您的请求中获取所需的数据。将 requests
属性 创建为 List<object>
或 object[]
,因此它将被序列化为数组
var load = new {
Requests = new List<object>{new {...}}
}
我认为你应该更改这行代码
var load = new { Requests = new { IndexName = "magento2_tcg_productiondefault_products", Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D" } };
为此:
var load = new { Requests = new[] {new { IndexName = "magento2_tcg_productiondefault_products", Params = $"query={query}&hitsPerPage=12&maxValuesPerFacet=8&page=0&highlightPreTag=__ais-highlight__&highlightPostTag=__%2Fais-highlight__&ruleContexts=%5B%22magento_filters%22%2C%22%22%5D&facets=%5B%22mtg_setcode%22%2C%22is_foil%22%2C%22mtg_rarity%22%2C%22sf_colours%22%2C%22sf_types%22%2C%22sf_legalities%22%2C%22price.AUD.default%22%2C%22stock_qty%22%2C%22mtg_cmc%22%5D&numericFilters=%5B%22visibility_search%3D1%22%5D" }} };