Grapevine控制台应用POST请求报错:Content-Length与实际内容不匹配
问题解决:Grapevine POST请求Content-Length不匹配错误
错误提示Sent 0 request content bytes, but Content-Length promised 538的核心原因是:你手动设置的ContentLength是JSON字符串的字符数,但HTTP协议要求Content-Length是请求体的字节数,二者不匹配;同时Grapevine的RestRequest会自动处理ContentLength的计算,手动设置反而会导致冲突。
修正方案
直接移除手动设置ContentLength的代码,让Grapevine自动根据Payload内容计算正确的字节长度。
修正后的客户端代码:
public void Test() { RestClient client = new RestClient(); client.Host = "localhost"; client.Port = 8120; RestRequest request = new RestRequest("/distribution/saveorder"); request.HttpMethod = HttpMethod.POST; request.ContentType = ContentType.JSON; Order order = new (); order.Buyer.Number = "4711"; OrderItem item = new (); item.Article.Number = "1111111"; item.Quantity = 5; order.Items.Add(item); item = new (); item.Article.Number = "2222222"; item.Quantity = 20; request.Payload = JsonSerializer.Serialize(order); // 移除手动设置ContentLength的代码,Grapevine会自动计算并设置 var response = client.Execute(request); }
额外说明
如果需要手动控制编码(比如非UTF-8编码),可以将JSON字符串转为对应编码的字节数组再赋值给Payload,同样不需要手动设置ContentLength:
var json = JsonSerializer.Serialize(order); var bytes = Encoding.UTF8.GetBytes(json); // 可替换为其他编码 request.Payload = bytes;
服务器端读取请求内容(补充)
如果需要在服务器端处理传入的Order对象,可以修改SaveOrder方法:
[RestResource] public class OrderService { public OrderService() { } [RestRoute(HttpMethod = HttpMethod.POST, PathInfo = "/distribution/saveorder")] public IHttpContext SaveOrder(IHttpContext context) { // 读取请求体JSON并反序列化为Order对象 var jsonContent = context.Request.Content.ReadAsStringAsync().Result; var order = JsonSerializer.Deserialize<Order>(jsonContent); // 执行你的业务逻辑... return context; } }
内容的提问来源于stack exchange,提问作者user2377283
相关产品推荐
相关产品推荐

