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

如何获取API响应状态码?C#+RestSharp+SpecFlow测试问题

解决RestSharp + SpecFlow获取API响应状态码的问题

我来帮你搞定这个问题!结合RestSharp和SpecFlow获取API响应状态码其实很简单,我给你拆解下步骤和常见坑点:

1. 先确认RestSharp版本(关键!)

RestSharp在v107版本做了不少API变更,所以分两种情况给你示例:

情况一:RestSharp v107+(最新稳定版,推荐使用)

发起请求后会得到RestResponse对象,直接就能访问它的StatusCode(状态码枚举)和StatusDescription(状态字符串)属性。结合SpecFlow的Step Definition示例如下:

using RestSharp;
using TechTalk.SpecFlow;
using Xunit; // 也可以用NUnit等其他断言库

[Binding]
public class ApiTestSteps
{
    // 用类字段在Step之间共享响应对象
    private RestResponse _apiResponse;

    [When(@"我向接口 ""(.*)"" 发送GET请求")]
    public async Task WhenISendGetRequestToEndpoint(string endpoint)
    {
        var client = new RestClient("https://你的API基础地址.com");
        var request = new RestRequest(endpoint);
        
        // 推荐用异步请求方式
        _apiResponse = await client.ExecuteGetAsync(request);
        
        // 打印调试信息,看看能不能输出状态码
        Console.WriteLine($"当前响应状态码: {(int)_apiResponse.StatusCode}");
        Console.WriteLine($"当前响应状态描述: {_apiResponse.StatusDescription}");
    }

    [Then(@"响应状态码应该是 (.*)")]
    public void ThenResponseStatusCodeShouldBe(int expectedCode)
    {
        // 断言状态码(把枚举转成int和预期值对比)
        Assert.Equal(expectedCode, (int)_apiResponse.StatusCode);
        
        // 如果要断言状态字符串,比如"OK"
        Assert.Equal("OK", _apiResponse.StatusDescription);
    }
}

关键注意点:

  • 要保证_apiResponse对象在Step之间正确共享,别在每个Step里重新声明,不然会丢失数据
  • StatusCode是HttpStatusCode枚举类型,转成int就是我们熟悉的数字(比如200)
  • StatusDescription就是对应的状态字符串(比如"OK"、"NotFound")

情况二:RestSharp v106及以下(旧版本)

如果还在使用旧版本,请求返回的是IRestResponse,属性访问逻辑类似,但发起请求的方法略有不同:

[When(@"我向接口 ""(.*)"" 发送GET请求")]
public async Task WhenISendGetRequestToEndpoint(string endpoint)
{
    var client = new RestClient("https://你的API基础地址.com");
    var request = new RestRequest(endpoint, Method.GET);
    
    _apiResponse = await client.ExecuteTaskAsync(request);
    
    Console.WriteLine($"当前响应状态码: {(int)_apiResponse.StatusCode}");
    Console.WriteLine($"当前响应状态描述: {_apiResponse.StatusDescription}");
}

常见排查点(如果还是拿不到状态码)

如果你的打印语句没输出预期内容,可以从这几个方向排查:

  • 检查请求是否真的发送成功:加try-catch捕获请求过程中的异常,看看是不是网络问题或者URL写错了
  • 确认_apiResponse没有被意外重置:比如是不是在某个Step里重新赋值了这个字段
  • 查看响应的错误信息:可以打印_apiResponse.ErrorMessage和_apiResponse.ErrorException,排查请求失败的具体原因

比如加一段错误排查的打印代码:

if (!_apiResponse.IsSuccessful)
{
    Console.WriteLine($"请求失败原因: {_apiResponse.ErrorMessage}");
    if (_apiResponse.ErrorException != null)
    {
        Console.WriteLine($"异常详情: {_apiResponse.ErrorException.Message}");
    }
}

按照这个思路调整代码,应该就能顺利获取到状态码和状态描述,然后用Assert做验证啦!

内容的提问来源于stack exchange,提问作者bobe_b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:29:06