[英]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.