You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:31:05