播放2.3 WS withFollowRedirects(true)不起作用

时间:2015-07-06 14:28:22

标签: scala playframework

以下代码应将表单发布到端点(返回302),并在执行重定向后,解析页面的url并从那里返回一些信息。

<a data-bind="attr: { href: mailto }">click</a>

问题是val start = System.currentTimeMillis() val requestHolder = WS.url(conf("login.url")) .withRequestTimeout(loginRequestTimeOut) .withFollowRedirects(true) //This appears to have no effect... requestHolder.post(getMap(username, password)) .map(resp =>{ Logger.debug(resp.status.toString) val loginResponse = getResponse(resp) val end = System.currentTimeMillis() Logger.debug("Login for the user: "+username+", request took: " + (end - start) + " milliseconds.") loginResponse }) 似乎对查询没有影响。响应的状态为302,请求不遵循重定向。

我已经使用httpie手动完成了这个过程,并且重定向后会导致正确的页面。

非常感谢任何帮助或见解。

2 个答案:

答案 0 :(得分:0)

POST重定向也不像GET重定向那样受支持。 W3 specification说:

  

如果收到301状态代码以响应GET或HEAD以外的请求,则用户代理不得自动重定向请求,除非用户可以确认,因为这可能会改变请求的条件。发出的。

有些浏览器不这样做,只是忽略。另请查看307状态:

  

307临时重定向(自HTTP / 1.1起)

     

在这种情况下,请求应该使用另一个URI重复;但是,未来的请求仍应使用原始URI。与历史上实现302的方式相反,在重新发出原始请求时不允许更改请求方法。例如,应使用另一个POST请求重复POST请求。

还在Programmer Stack Exchange上讨论了这个问题。

答案 1 :(得分:0)

我在withFollowRedirects和POST方面遇到了很多麻烦。 在某些时候,在努力使事情发挥作用的同时,我在代码中使用了.withFollowRedirects(false),然后在清理过程中将其删除。事情破灭了。我目前的猜测是,如果未明确将此选项设为false,则默认行为是遵循重定向(在我的情况下为302)并使用一些错误机制。也许默认机制使用相同的参数再次使用POST。但就我而言,与Google App Script(GAS)交互时,需要使用GET来检索POST的JSON输出。 无论机制在做什么,我都没有进一步诊断400。 在浪费了几个小时之后,我意识到.withFollowRedirects(false)实际上是真正需要的:它禁用了Play重定向的麻烦,我能够看到302响应&amp;成功手动处理以下GET。