簡體   English   中英

HttpClient 后調用適用於郵遞員,但不適用於 C#

[英]HttpClient post call works on postman but not C#

正如標題所說,我的后期通話在郵遞員中有效,但在 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");
    }

這是我的郵遞員截圖: 身體標題

需要注意的一件事是,post 請求在進行 post 調用時采用表單數據。

我認為您應該更改這行代碼

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-body 的requests屬性是一個數組

{
  "requests": [{...}]
}

而在您的 C# 代碼中,它是一個對象

var load = new { 
  Requests = new { ... } 
}

因此服務器可能無法從您的請求中獲取所需的數據。 requests屬性創建為List<object>object[] ,因此它將被序列化為數組

var load = new {
  Requests = new List<object>{new {...}}
}

請參閱下面代碼中的注釋也包括錯誤..

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");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM