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

RestSharp调用HyperCo API更新License元数据遇Bad Request求助

RestSharp调用HyperCo API更新License Metadata时返回Bad Request

我用C#的RestSharp调用HyperCo API,先验证License密钥有效性,再更新该License的metadata(设置hwid字段),但运行代码时触发了Bad Request响应,求帮忙排查问题。

我的代码:

var client = new RestClient("https://api.hyper.co/v6/licenses/");
var request = new RestRequest(licensekey);
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer secret key");
RestResponse response = await client.GetAsync(request);

if (response.IsSuccessStatusCode == true)
{
    LicenseResponse.Text = "Sucess";
    Refresh();
    Thread.Sleep(1000);
    LicenseResponse.Location = new Point(450, 330);
    var body = "{\"hwid\":\"" + harware_id + "\"}";
    var requestMetadata = new RestRequest($"{licensekey}/metadata");
    requestMetadata.AddHeader("accept", "application/json");
    requestMetadata.AddHeader("content-type", "application/json");
    requestMetadata.AddHeader("Authorization", "Bearer secret key");
    requestMetadata.RequestFormat=DataFormat.Json;
    requestMetadata.AddJsonBody(body) ;
    RestResponse responseMetadata = await client.GetAsync(requestMetadata);
    if (responseMetadata.IsSuccessStatusCode == true)
    {
        LicenseResponse.Text = responseMetadata.ToString();
        Refresh();
    } else if (responseMetadata.StatusCode == System.Net.HttpStatusCode.NotFound) {
        LicenseResponse.Text = responseMetadata.ToString();
        Refresh();
    } else if (responseMetadata.StatusCode == System.Net.HttpStatusCode.Unauthorized) {
        LicenseResponse.Text = responseMetadata.ToString();
        Refresh();
    }
    toolForm toolForm = new toolForm();
    toolForm.Visible = true;
    this.Visible= false;
}
else
{
    LicenseResponse.Text = "Error";
    Refresh();
    LicenseResponse.Location = new Point(438, 330);
    Thread.Sleep(3000);
    Environment.Exit(0);
}

注:操作成功的话,HyperCo后台的metadata字段应该会变化。


问题排查与修正

导致Bad Request的核心问题有两个,附带一些优化点:

1. 请求方法错误:更新Metadata必须用PUT而非GET

HyperCo的License Metadata更新接口要求使用PUT请求,你代码里用了GetAsync——GET请求不支持携带请求体,直接会被API拒绝,返回400 Bad Request。

2. AddJsonBody使用错误:传入对象而非手动序列化的字符串

你手动把hwid序列化成JSON字符串传给AddJsonBody,但RestSharp的AddJsonBody会自动对传入内容做JSON序列化,这就导致了双重序列化:最终请求体是一个包含该字符串的JSON,而非预期的{"hwid":"xxx"},格式完全不符合API要求。

修正后的代码

// 初始化RestClient时建议不带尾部斜杠,避免路径拼接出现重复斜杠
var client = new RestClient("https://api.hyper.co/v6/licenses");
var request = new RestRequest($"/{licensekey}");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer your-secret-key"); // 替换为实际密钥
RestResponse response = await client.GetAsync(request);

if (response.IsSuccessStatusCode)
{
    LicenseResponse.Text = "Success";
    Refresh();
    await Task.Delay(1000); // 用Task.Delay替代Thread.Sleep,避免阻塞UI线程
    LicenseResponse.Location = new Point(450, 330);

    // 定义匿名对象作为请求体,让RestSharp自动完成JSON序列化
    var metadataBody = new { hwid = harware_id };
    var requestMetadata = new RestRequest($"/{licensekey}/metadata", Method.Put); // 指定PUT请求方法
    requestMetadata.AddHeader("accept", "application/json");
    requestMetadata.AddHeader("content-type", "application/json");
    requestMetadata.AddHeader("Authorization", "Bearer your-secret-key");
    requestMetadata.AddJsonBody(metadataBody); // 传入对象而非手动序列化的字符串

    RestResponse responseMetadata = await client.ExecuteAsync(requestMetadata);
    var responseContent = responseMetadata.Content;
    
    if (responseMetadata.IsSuccessStatusCode)
    {
        LicenseResponse.Text = "Metadata更新成功";
        Refresh();
    }
    else
    {
        // 显示具体错误内容,而非仅状态码,方便排查
        LicenseResponse.Text = $"更新失败: {responseMetadata.StatusCode} - {responseContent}";
        Refresh();
    }

    toolForm toolForm = new toolForm();
    toolForm.Visible = true;
    this.Visible = false;
}
else
{
    var errorContent = response.Content;
    LicenseResponse.Text = $"License验证失败: {response.StatusCode} - {errorContent}";
    Refresh();
    LicenseResponse.Location = new Point(438, 330);
    await Task.Delay(3000);
    Environment.Exit(0);
}

额外优化建议

  • 用Task.Delay替代Thread.Sleep:你的代码看起来是WinForm场景,Thread.Sleep会阻塞UI线程导致界面假死,Task.Delay是异步等待,不会影响界面响应。
  • 打印响应Content属性:Bad Request时HyperCo通常会返回具体错误原因(比如"invalid request body"),这能帮你快速定位问题。
  • 密钥配置化:不要把API密钥硬编码在代码里,抽成配置项更安全。

内容的提问来源于stack exchange,提问作者Célyan Mellinger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:35:19