以下代码应将表单发布到端点(返回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手动完成了这个过程,并且重定向后会导致正确的页面。
非常感谢任何帮助或见解。
答案 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。