簡體   English   中英

使用 C# HttpClient API 和郵遞員測試之間的區別? 客戶端調用適用於郵遞員,但不適用於 C# httpClient getAsync

[英]Differences between using C# HttpClient API and the postman testing? Client call works on postman, but not C# httpClient getAsync

在此處輸入圖片說明

在此處輸入圖片說明

我正在測試 REST API 帖子,當我在 Postman 上嘗試時,它運行良好。 但是,在某些情況下(與發布 XML 數據相關),如果我使用 HttpClient API 發布,我會收到以下錯誤:

無法從傳輸連接讀取數據:遠程主機強行關閉了現有連接。

但是相同的 XML 內容在 Postman 上運行良好,狀態正常且響應正確。

使用 C# HttpClient API 和 postman 測試有什么區別? 如何配置我的 API 調用以匹配郵遞員的行為?

這里我附上了源代碼和郵遞員截圖

public void createLoan()
{
    string baseCreateLoanUrl = @"https://serverhost/create?key=";
    var strUCDExport = XDocument.Load(@"C:\CreateLoan_testcase.xml");

    using (var client = new HttpClient())
    {
        var content = new StringContent(strUCDExport.ToString(), Encoding.UTF8, Mediatype);
        string createLoanApi = string.Concat(baseCreateLoanUrl, APIKey);

        try
        {
            var response = client.PostAsync(createLoanApi, content).Result;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error Happened here...");
            throw;
        }

        if (response.IsSuccessStatusCode)
        {
            // Access variables from the returned JSON object
            string responseString = response.Content.ReadAsStringAsync().Result;
            JObject jObj = JObject.Parse(responseString);

            if (jObj.SelectToken("failure") == null)
            {
                // First get the authToken
                string LoanID = jObj["loanStatus"]["id"].ToString();
                MessageBox.Show("Loan ID: " + LoanID);
            }
            else
            {
                string getTokenErrorMsg = string.Empty;

                JArray errorOjbs = (JArray) jObj["failure"]["errors"];
                foreach (var errorObj in errorOjbs)
                {
                    getTokenErrorMsg += errorObj["message"].ToString() + Environment.NewLine;
                }
                getTokenErrorMsg.Dump();
            }
        }
    }

感謝 Nard 的評論,在比較標題后,我發現我的客戶端標題有這個問題:Expect: 100-continue

雖然郵遞員沒有。

一旦我使用 ServicePointManager 刪除了它:

ServicePointManager.Expect100Continue = false;

現在一切似乎都很好。 感謝所有的投入!

我的直覺告訴我這很簡單。 首先,我們知道 API 有效,所以我認為這取決於您如何使用 HttpClient。

首先,按照this SO answer的建議嘗試,將其創建為單例並完全刪除 using 語句,因為共識是不需要處理 HttpClient :

    private static readonly HttpClient HttpClient = new HttpClient();

我認為它要么存在,要么是您的內容編碼行出現問題導致 API 出現問題。 是否有您遺漏的不喜歡的東西,我敢打賭 Postman 與此處的請求有所不同。 也許嘗試將其作為 JSON ala 發送:

     var json = JsonConvert.SerializeObject(strUCDExport.ToString());
     var content = new StringContent(json, Encoding.UTF8, Mediatype);

也許 Postman vs yours 的標題會顯示缺失的東西,我認為真正的答案會在那里。 讓 fiddler 在后台運行,通過 Postman 發送,檢查它,然后運行你的代碼並重新檢查。 密切注意 Postman 標頭上的所有屬性標簽,API 工作正常,因此缺少某些東西。 Fiddler 會告訴你的。

當我偶然發現 Fiddler 時,我為此苦苦掙扎了 2 天,它可以讓您記錄服務的流量。 比較調用后,我發現我的代碼中遺漏了一個標題。

暫無
暫無

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

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