Postman请求正常返回,同款C# RestSharp请求无结果问题排查
问题分析与解决方案
以下是导致Postman导出的RestSharp代码无法正常工作的几个核心原因及对应修复方案:
1. 请求体传递方式不符合application/x-www-form-urlencoded规范
当前代码直接将URL编码后的字符串作为请求体传递,但application/x-www-form-urlencoded类型要求数据以键值对形式由客户端自动编码,而非手动传入预编码字符串。这种方式会导致服务器无法正确解析请求参数。
修复方法:
解码command参数的原始值,使用AddFormParameter方法添加参数,让RestSharp自动处理编码逻辑。
2. 手动添加authority头引发冲突
authority是curl的自定义头,对应HTTP标准的Host头。RestSharp会自动根据请求URL生成合法的Host头,手动添加authority会导致服务器收到重复或无效的Host信息,触发验证失败。
修复方法:
删除request.AddHeader("authority", "dbh.smartschool.be");这一行代码。
3. Cookie处理方式不严谨
直接通过请求头添加Cookie,无法正确维护Cookie的会话状态(如HttpOnly属性),部分服务器会严格校验Cookie的传递方式。
修复方法:
使用RestSharp的CookieContainer管理Cookie,确保会话状态正确传递。
4. UA相关头部的转义错误
导出代码中sec-ch-ua等头部的字符串存在多余转义(如\"),导致实际发送的头部值与curl请求不一致,触发服务器的UA验证逻辑。
修复方法:
简化UA头部的字符串,移除多余转义字符,保证与curl请求的头部值完全一致。
修正后的代码示例
using RestSharp; using System.Net; namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { // 初始化带Cookie容器的客户端,维护会话状态 var cookieContainer = new CookieContainer(); var client = new RestClient("https://dbh.smartschool.be/index.php?module=Agenda&file=dispatcher") { Timeout = -1, CookieContainer = cookieContainer }; // 向容器添加Cookie,替代手动添加Cookie头 cookieContainer.Add(new Uri("https://dbh.smartschool.be"), new Cookie("pid", "77573bd5-8567-4bed-8f03-19211db08663")); cookieContainer.Add(new Uri("https://dbh.smartschool.be"), new Cookie("PHPSESSID", "s0qf6btgu15su1gesrubrm01lveov6far58r58r2vabvfpo60e")); var request = new RestRequest(Method.POST); // 移除多余的authority头,保留必要请求头 request.AddHeader("accept", "*/*"); request.AddHeader("accept-language", "nl-BE,nl-NL;q=0.9,nl;q=0.8,en-US;q=0.7,en;q=0.6"); request.AddHeader("cache-control", "no-cache"); request.AddHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8"); request.AddHeader("origin", "https://dbh.smartschool.be"); request.AddHeader("pragma", "no-cache"); request.AddHeader("referer", "https://dbh.smartschool.be/"); // 修正UA头的转义问题,与curl请求保持一致 request.AddHeader("sec-ch-ua", "\"Chromium\";v=\"106\", \"Google Chrome\";v=\"106\", \"Not;A=Brand\";v=\"99\""); request.AddHeader("sec-ch-ua-mobile", "?0"); request.AddHeader("sec-ch-ua-platform", "\"Windows\""); request.AddHeader("sec-fetch-dest", "empty"); request.AddHeader("sec-fetch-mode", "cors"); request.AddHeader("sec-fetch-site", "same-origin"); client.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"; request.AddHeader("x-requested-with", "XMLHttpRequest"); // 使用AddFormParameter传递未编码的原始参数,让RestSharp自动处理编码 var commandValue = @"<request> <command> <subsystem>agenda</subsystem> <action>get lessons</action> <params> <param name=""startDateTimestamp""><![CDATA[1666611595]]></param> <param name=""endDateTimestamp""><![CDATA[1667043595]]></param> <param name=""filterType""><![CDATA[false]]></param> <param name=""filterID""><![CDATA[false]]></param> <param name=""gridType""><![CDATA[2]]></param> <param name=""classID""><![CDATA[0]]></param> <param name=""endDateTimestampOld""><![CDATA[1667043595]]></param> <param name=""forcedTeacher""><![CDATA[0]]></param> <param name=""forcedClass""><![CDATA[0]]></param> <param name=""forcedClassroom""><![CDATA[0]]></param> <param name=""assignmentTypeID""><![CDATA[1]]></param> </params> </command> </request>"; request.AddFormParameter("command", commandValue); IRestResponse response = client.Execute(request); Console.WriteLine(response.StatusCode); Console.WriteLine(response.Content); // 打印响应内容便于调试 Console.ReadLine(); } } }
内容的提问来源于stack exchange,提问作者Roel Bellemans
相关产品推荐
相关产品推荐

