如何使用RestSharp v106.6.10(.NET Core 2.2)发送带请求体的GET请求
解决RestSharp v106.6.10中GET请求带请求体的问题
我完全理解你的需求——当复杂参数没法优雅塞进QueryString时,用GET请求带请求体确实是合理的选择,毕竟把大段JSON拼在URL里既不美观也容易出问题。你遇到的{"A non-empty request body is required."}错误,本质是RestSharp默认会拦截GET请求的请求体,这是它遵循常见HTTP实践的默认行为,但我们可以绕过这个限制。
解决方案:手动指定请求体参数
RestSharp的AddJsonBody方法在处理GET请求时会自动跳过添加请求体,所以我们需要换一种方式手动添加:
var client = new RestClient("BaseUri"); var request = new RestRequest("URL", Method.GET); // 1. 手动序列化请求体(需要引用Newtonsoft.Json) var serializedBody = Newtonsoft.Json.JsonConvert.SerializeObject(Body); // 2. 显式添加请求体参数,指定类型为RequestBody request.AddParameter("application/json", serializedBody, ParameterType.RequestBody); // 执行请求 var response = client.Execute(request);
如果上面的方法仍不生效:直接操作WebRequest
如果RestSharp的参数机制还是不生效,我们可以直接通过ConfigureWebRequest方法手动写入请求体:
var client = new RestClient("BaseUri"); var request = new RestRequest("URL", Method.GET); var serializedBody = Newtonsoft.Json.JsonConvert.SerializeObject(Body); client.ConfigureWebRequest(webRequest => { // 设置Content-Type webRequest.ContentType = "application/json"; // 开启请求流写入 webRequest.ContentLength = serializedBody.Length; using (var streamWriter = new StreamWriter(webRequest.GetRequestStream())) { streamWriter.Write(serializedBody); } }); var response = client.Execute(request);
为什么会出现这个问题?
RestSharp的默认设计是遵循大多数HTTP客户端的惯例:虽然HTTP规范并没有明确禁止GET请求带请求体,但很多服务器和工具会忽略这种请求的请求体,所以RestSharp默认会过滤掉GET请求的请求体内容。但既然你已经确认服务器支持这种用法(WebClient、Postman都能正常工作),那通过上面的方法就能让RestSharp兼容这个场景。
内容的提问来源于stack exchange,提问作者user1514042
相关产品推荐
相关产品推荐

