系统是否依赖于HTTP get / post参数顺序可靠?

时间:2014-07-09 03:37:35

标签: http post get

我正在尝试实现一个依赖于HTTP get / post参数顺序的系统。

我希望系统提供远程函数调用机制,例如: 假设有一个函数foo(int, int),它可以通过HTTP获取http://ip:port/method=foo&paramType=int&param=1&paramType=int&param=2或HTTP帖子远程调用,帖子数据为method=foo&paramType=int&param=1&paramType=int&param=2,在本地充当调用foo(1,2)

如您所见,它非常依赖于参数顺序。如果参数顺序出错,foo(2,1)将被称为意外。

但我不确定它是否可靠,因为我认为W3没有为参数顺序做出规范(告诉我,如果我错了)。

我不确定参数顺序是否符合预期的三点:

  1. 客户端(例如浏览器或jmeter)是否会发布参数 按你看的那样订购?
  2. 在传输过程中是否会保留订单?
  3. Web是否包含(例如tomcat)或Web框架(例如django) 保留参数顺序?
  4. 我做了一些测试,发现chrome,firefox和jmeter会按预期发送get / post参数并且tomcat保留了参数顺序,但找到一些情况很难,我不确定没有这样的情况。所以我不能确定我试图实现的系统是否可靠。

    有没有人有这种问题的经验?欢迎提出所有建议。

3 个答案:

答案 0 :(得分:3)

强制执行参数顺序的一种情况是使用

等路径获取请求
http://someServer/param1/param2

但是,如果您需要查询字符串参数和发布数据的特定顺序,我会说它会使您的API不灵活。不确定为什么这是必要的要求。相反,在这些情况下,将参数的反序列化基于其名称是有意义的。

这方面的一个很好的例子是Asp.Net MVC / WEB API中的模型绑定器,其中请求参数以非常灵活和健壮的方式被反序列化。

答案 1 :(得分:2)

您无法在网址查询字符串或application/x-www-form-urlencoded帖子中强制执行参数顺序。尽管W3C定义HTML以按照它们在HTML中出现的顺序传输表单值,但服务器端脚本可以按任意顺序按名称自由访问参数,并且具有相同名称的多个参数是灾难的处方。您需要重命名参数以使其独特且与顺序无关,例如:

method=foo&param1Type=int&param1=1&param2Type=int&param2=2

这样,foo()可以读取其2个paramX参数,无论其排序如何。例如,这也是完全有效的,并且仍然有效:

param2=2&param1=1&param1Type=int&param2Type=int&method=foo

就个人而言,我建议您删除paramType参数:

method=foo&param1=1&param2=2

您的API规范规定了参数的数据类型。如果客户端向foo()发送非整数值,则返回HTTP错误,如400 Bad Request。在使用之前始终验证输入。

答案 2 :(得分:0)

如果订单很重要,我会像@TGH那样设计它,表示参数是http://someServer/param1/param2之类路径的一部分。这会强制执行排序,并且不允许以任何其他方式发出请求。如果使用期望浏览器维护订单的查询参数进行设计,则可能会导致某人利用安全漏洞。