C# HttpClient Post请求发送至Java Servlet时内容为空问题排查
问题:C# HttpClient 发送Post请求至Java Servlet,服务器接收内容为空
问题详情
使用C#的HttpClient向Java Servlet引擎发送Post请求,请求能成功到达服务器,但服务器读取到的请求内容为空,引发报错。该Servlet接口使用VBA代码请求时可正常工作。
C# 客户端请求代码
string loginBuffer = "test"; HttpClient hClient = GetClient(); using StringContent loginString = new StringContent(loginBuffer, UnicodeEncoding.UTF8, "application/text"); var response1 = await hClient.PostAsync(new Uri("https://sampleserver.com/Login"), loginString);
Java Servlet 服务端读取内容代码
protected StringBuffer getRequestBuffer(ServletRequest request) throws IOException { StringBuffer sb = null; try { sb = new StringBuffer(); BufferedReader br = request.getReader(); String line = new String(); line = br.readLine(); // 后续读取逻辑省略 } // 异常处理省略 }
可正常工作的VBA请求代码
Dim res As String res = "" If req Is Nothing Then Set req = New WinHttp.WinHttpRequest End If req.SetTimeouts 1800000, 1800000, 1800000, 1800000 m_serverURL = getserverurl req.Open "POST", m_serverURL & "/" & Service, False req.setRequestHeader "Content-Length", "" & VBA.Len(buffer) req.setRequestHeader "X-client", "WinExcel" req.Send buffer
问题原因及解决方法
原因1:Content-Type 非标准类型
C#代码中指定的application/text不是标准MIME类型,标准文本类型应为text/plain。VBA代码未显式设置Content-Type,WinHttp默认使用的类型(如text/plain或application/x-www-form-urlencoded)能被Servlet正常识别,这是两者的核心差异。
原因2:编码与请求头差异
UnicodeEncoding.UTF8生成的是带BOM的UTF-8编码,而VBA默认使用不带BOM的编码,可能导致Servlet解析异常。此外,HttpClient自动处理Content-Length,若Servlet对该头的校验逻辑严格,也可能引发读取问题。
解决步骤
修正Content-Type为标准值
将StringContent的MIME类型改为text/plain,同时使用不带BOM的Encoding.UTF8:using StringContent loginString = new StringContent(loginBuffer, Encoding.UTF8, "text/plain");对齐VBA的请求头配置
参考VBA代码添加相同的自定义请求头,确保请求特征一致:loginString.Headers.Add("X-client", "WinExcel");检查Servlet读取逻辑
确认Servlet中未在调用getReader()前读取过请求输入流(如调用getInputStream()),两种读取方式互斥,会导致其中一种无法获取内容。需统一使用一种方式读取请求体。
内容的提问来源于stack exchange,提问作者Robo-SC
相关产品推荐
相关产品推荐

