restsharp 107+已废弃executegetasync,统一使用await client.getasync()自动反序列化json;传参须显式调用addqueryparameter等方法;非2xx响应需检查response.content而非issuccessful。

RestSharp 107+ 版本已经彻底移除 ExecuteGetAsync 等旧方法,直接用 GetAsync<t>()</t> 就能自动反序列化 JSON;别再查老教程照搬写法,否则编译报错或 NullReferenceException 是大概率事件。
GetAsync() 怎么用才不崩
新版 RestSharp 的异步请求方法返回的是 Task<t></t>,不是 Task<irestresponse>></irestresponse>。这意味着它默认只在成功(2xx)时返回数据,失败直接抛异常——所以你得用 try/catch 捕获,不能只靠 IsSuccessful 判断。
-
GetAsync<user>()</user>:自动把响应体 JSON 反序列化成User对象,前提是响应是单个对象(不是数组) - 如果接口返回的是 JSON 数组,比如
[{"id":1},{"id":2}],泛型得写成IEnumerable<user></user>或List<user></user> - 不想反序列化?去掉泛型,用
await client.GetAsync(request),返回RestResponse,再读response.Content - 别在 WinForms/WPF 主线程里用
.Result或.Wait(),会死锁;必须await
传参必须显式声明,RestSharp 不猜你要放哪儿
RestSharp 不会根据参数名或类型自动决定是拼 Query、塞 Body 还是填 Header。所有流向都得手动指定,漏一个就 400 或空数据。
-
AddQueryParameter("page", "1")→ 拼到 URL 后面:?page=1,GET/POST 都可用 -
AddUrlSegment("id", "123")→ 替换路径占位符,如/users/{id}变成/users/123 -
AddJsonBody(new { name = "foo" })→ 自动设Content-Type: application/json,仅用于 JSON 接口 -
AddFormField("username", "admin")→ 生成application/x-www-form-urlencoded,适合传统表单提交 - Header 必须每个请求单独加:
request.AddHeader("Authorization", "Bearer abc");client.AddDefaultHeader只影响后续新请求,不补到已建好的request上
401/400 错误时 response.Content 才是真相
RestSharp 把非 2xx 响应也当成“可返回的响应”,response.IsSuccessful 为 false,但 response.Data 是 null,而真实错误信息藏在 response.Content 里——比如微信支付返回的 {"code":"INVALID_REQUEST","message":"缺少必填参数"}。
- 出错时第一反应不是看
ErrorMessage,而是读response.Content - 可以定义自己的错误类型,比如
WxPayError,然后JsonConvert.DeserializeObject<wxpayerror>(response.Content)</wxpayerror> - 注意:如果后端返回的是纯文本错误(如
Invalid token),response.Content就是那串字符串,别硬往 JSON 里反序列化 -
response.StatusCode和response.StatusDescription也要一起检查,区分是网络超时、DNS 失败,还是服务端明确拒绝
最常被忽略的是:RestSharp 客户端本身不维护 Cookie 容器,每次请求都是干净的;需要会话保持(比如登录后调用其他接口),得自己从响应里提取 Set-Cookie,再手动 request.AddCookie() 塞回去——这个逻辑不会自动发生。










