WSO2 EI调用HTTP POST端点报错:无效协议版本问题排查
我仔细对比了你的WSO2请求日志和curl请求日志,发现问题出在请求行的格式不符合HTTP规范,而Python的BaseHTTP服务器对格式校验非常严格。
问题根源
从Wire Log可以看到,WSO2发送的请求行是:
POST HTTP/1.0
这不符合HTTP标准的请求行格式——正确的格式应该是 [METHOD] [PATH] [HTTP VERSION],这里缺少了必须的路径部分(比如/)。
而curl自动为你补充了根路径/,所以发送的请求行是:
POST / HTTP/1.1
这完全符合规范,因此Python服务器接受了请求并返回200响应。
为什么WSO2会生成错误的请求行?因为你的HTTP端点配置里,uri-template只指定了地址和端口,没有包含路径:
<http method="post" uri-template="http://192.168.1.50:1237"/>
修复方案
1. 给端点添加根路径/
修改你的端点配置,在uri-template末尾加上/:
<send description=""> <endpoint> <http method="post" uri-template="http://192.168.1.50:1237/"/> </endpoint> </send>
修改后,WSO2会生成正确的请求行:POST / HTTP/1.0(因为你设置了FORCE_HTTP_1.0),满足Python服务器的格式要求。
2. (可选)移除FORCE_HTTP_1.0属性
从curl的响应可以看到,目标服务器支持HTTP/1.0,但如果没有特殊需求,建议移除FORCE_HTTP_1.0属性,让WSO2使用默认的HTTP/1.1协议,这样请求会更规范,也能避免潜在的兼容性问题:
<inSequence> <payloadFactory media-type="json"> <format>{"jsonrpc": "2.0", "params": {"auth_type": "ADMIN", "auth_name": "someName", "normal_username": "$1", "auth_pass": "myPassword"},"method": "user.MethodName", "id": 0} </format> <args> <arg evaluator="json" expression="$.user"/> </args> </payloadFactory> <property name="messageType" scope="axis2" type="STRING" value="application/json"/> <!-- 移除FORCE_HTTP_1.0属性 --> <send description=""> <endpoint> <http method="post" uri-template="http://192.168.1.50:1237/"/> </endpoint> </send> </inSequence>
验证结果
重新部署修改后的API,再次调用时,Wire Log里会显示正确的请求行,Python服务器将返回正常的JSON响应,不再出现400错误。
补充说明:你之前调用其他HTTP端点没问题,是因为那些端点的服务器对请求格式的容错性更高,允许缺少路径的请求;而Python的BaseHTTP服务器遵循严格的HTTP规范,所以触发了错误。
内容的提问来源于stack exchange,提问作者Masoud Keshavarz

