我正在尝试实现一个依赖于HTTP get / post参数顺序的系统。
我希望系统提供远程函数调用机制,例如:
假设有一个函数foo(int, int)
,它可以通过HTTP获取http://ip:port/method=foo¶mType=int¶m=1¶mType=int¶m=2
或HTTP帖子远程调用,帖子数据为method=foo¶mType=int¶m=1¶mType=int¶m=2
,在本地充当调用foo(1,2)
。
如您所见,它非常依赖于参数顺序。如果参数顺序出错,foo(2,1)
将被称为意外。
但我不确定它是否可靠,因为我认为W3没有为参数顺序做出规范(告诉我,如果我错了)。
我不确定参数顺序是否符合预期的三点:
我做了一些测试,发现chrome,firefox和jmeter会按预期发送get / post参数并且tomcat保留了参数顺序,但找到一些情况很难,我不确定没有这样的情况。所以我不能确定我试图实现的系统是否可靠。
有没有人有这种问题的经验?欢迎提出所有建议。
答案 0 :(得分:3)
强制执行参数顺序的一种情况是使用
等路径获取请求http://someServer/param1/param2
但是,如果您需要查询字符串参数和发布数据的特定顺序,我会说它会使您的API不灵活。不确定为什么这是必要的要求。相反,在这些情况下,将参数的反序列化基于其名称是有意义的。
这方面的一个很好的例子是Asp.Net MVC / WEB API中的模型绑定器,其中请求参数以非常灵活和健壮的方式被反序列化。
答案 1 :(得分:2)
您无法在网址查询字符串或application/x-www-form-urlencoded
帖子中强制执行参数顺序。尽管W3C定义HTML以按照它们在HTML中出现的顺序传输表单值,但服务器端脚本可以按任意顺序按名称自由访问参数,并且具有相同名称的多个参数是灾难的处方。您需要重命名参数以使其独特且与顺序无关,例如:
method=foo¶m1Type=int¶m1=1¶m2Type=int¶m2=2
这样,foo()
可以读取其2个paramX
参数,无论其排序如何。例如,这也是完全有效的,并且仍然有效:
param2=2¶m1=1¶m1Type=int¶m2Type=int&method=foo
就个人而言,我建议您删除paramType
参数:
method=foo¶m1=1¶m2=2
您的API规范规定了参数的数据类型。如果客户端向foo()
发送非整数值,则返回HTTP错误,如400 Bad Request
。在使用之前始终验证输入。
答案 2 :(得分:0)
如果订单很重要,我会像@TGH那样设计它,表示参数是http://someServer/param1/param2
之类路径的一部分。这会强制执行排序,并且不允许以任何其他方式发出请求。如果使用期望浏览器维护订单的查询参数进行设计,则可能会导致某人利用安全漏洞。