C#调用PATCH API返回HTTP 400错误,ReadyAPI调用正常求助
解决C#调用PATCH API返回HTTP 400错误的问题
问题根源与修复要点
请求URL重复拼接错误
代码中同时设置client.BaseAddress = new Uri(apiUrl),又在PatchAsync(apiUrl, content)传入完整URL,导致HttpClient将两个URL拼接成错误地址(如https://xxx.com/xxx/https://xxx.com/xxx),直接触发400错误。修复时要么只把BaseAddress设为API根路径(比如https://tfs.ups.com/tfs/UpsProd/P04S_SPPS/),然后用相对路径调用;要么直接不设置BaseAddress,传入完整URL即可。冗余代码与异步调用不当
- 代码中创建的
WebClient client1未被使用,可直接删除。 - 使用
.Result同步阻塞调用异步方法PatchAsync,易引发死锁,建议改用async/await模式。
- 代码中创建的
重复设置请求头
同时在DefaultRequestHeaders和请求内容中设置Content-Type属于冗余操作,仅在请求内容中设置即可。
修正后的代码
using System.Net.Http.Headers; using System.Net; using System.Text; using System.Threading.Tasks; string apiUrl = "https://tfs.ups.com/tfs/UpsProd/P04S_SPPS/_apis/testplan/Plans/5150238/Suites/5716385/TestPoint?includePointDetails=true&returnIdentityRef=true"; string username = "******"; string password = "******"; var credentials = new NetworkCredential(username, password); var handler = new HttpClientHandler { Credentials = credentials }; using (var client = new HttpClient(handler)) { try { string json = "[{\"id\":3490616,\"results\":{\"outcome\":2}}]"; Console.WriteLine(json); client.DefaultRequestHeaders.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.TryAddWithoutValidation("api-version", "6.1-preview.2"); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await client.PatchAsync(apiUrl, content); Console.WriteLine(response.StatusCode); if (response.IsSuccessStatusCode) { Console.Write("Success"); } else { // 打印错误响应内容,方便定位具体问题 var errorContent = await response.Content.ReadAsStringAsync(); Console.WriteLine($"Error content: {errorContent}"); } } catch (Exception ex) { Console.WriteLine($"An error occurred: {ex.Message}"); } }
额外排查建议
如果修正后仍报错,可通过以下方式进一步定位:
- 抓包对比ReadyAPI与C#代码的请求头、请求体,确保两者完全一致。
- 检查JSON格式是否存在细微差异(如转义字符、空格),部分工具会自动处理这类细节。
内容的提问来源于stack exchange,提问作者Anit Dhanapal
相关产品推荐
相关产品推荐

