我正在尝试创建一个Android应用来检查我的工程学校的测试成绩。为了下载包含分数的Word,我需要登录门户网站。
我认为发送POST请求会很简单。
借助此页面上的代码绕过自签名证书(或其他)的问题后:Self-signed SSL acceptance on Android
我在尝试向登录页面发送任何POST请求时仍然收到500错误,其中包括:https://e-campus.hei.fr/ERP-prod/pc_mv_login.aspx
我尝试从网上发送各种代码来发送POST数据(特别是How to do a HTTP Post in Android?这个)。甚至在纯Java应用程序上,我得到500。
当我将网址指向另一个测试页面时,我设法让它工作,但不是https://e-campus.hei.fr/ERP-prod/pc_mv_login.aspx
有人可以向我解释为什么它不起作用或帮助我摆脱这个错误吗?
编辑: 这是通过我的浏览器发送的内容(根据chrome开发工具)
__EVENTTARGET:
__EVENTARGUMENT:
__VIEWSTATE:dDwxNDU4ODc4MDI5O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDE+O2k8Nz47aTwxMz47aTwxNT47aTwxNz47aTwxOT47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8SWRlbnRpZmlhbnQgOjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8TW90IGRlIHBhc3NlIDo7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPExhbmd1ZSA6Oz4+Oz47Oz47dDx0PDt0PGk8Mj47QDxBbmdsYWlzO0ZyYW7Dp2Fpczs+O0A8ZW47ZnI7Pj47bDxpPDE+Oz4+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Vm91cyBuJ8OqdGVzIHBhcyBhdXRvcmlzw6kgIMOgIHZvdXMgY29ubmVjdGVyLjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Q29ubmVjdGVyIDo7Pj47Pjs7Pjs+Pjs+Pjs+inmhCwE9zfymuEXDXGORShkB1GI=
Username:******
Password:******
Langues:fr
Button1:Connecter :
这是我发送的字符串:
String parameters = "__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE="
+ URLEncoder
.encode("dDwxNDU4ODc4MDI5O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDE+O2k8Nz47aTwxMz47aTwxNT47aTwxNz47aTwxOT47PjtsPHQ8cDxwPGw8VGV4dDs+O2w8SWRlbnRpZmlhbnQgOjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8TW90IGRlIHBhc3NlIDo7Pj47Pjs7Pjt0PHA8cDxsPFRleHQ7PjtsPExhbmd1ZSA6Oz4+Oz47Oz47dDx0PDt0PGk8Mj47QDxBbmdsYWlzO0ZyYW7Dp2Fpczs+O0A8ZW47ZnI7Pj47bDxpPDE+Oz4+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Vm91cyBuJ8OqdGVzIHBhcyBhdXRvcmlzw6kgIMOgIHZvdXMgY29ubmVjdGVyLjs+Pjs+Ozs+O3Q8cDxwPGw8VGV4dDs+O2w8Q29ubmVjdGVyIDo7Pj47Pjs7Pjs+Pjs+Pjs+inmhCwE9zfymuEXDXGORShkB1GI=",
"UTF-8") + "&Username="
+ URLEncoder.encode(mUsername, "UTF-8") + "&Password="
+ URLEncoder.encode(mPassword, "UTF-8")
+ "&Langues=fr&Button1="
+ URLEncoder.encode("Connecter :", "UTF-8");
答案 0 :(得分:1)
HTTP错误500只表示服务器端代码失败。它有一个错误,例如在那里抛出NullPointerException
。如果响应主体不包含任何合理的内容(例如堆栈跟踪),以便您可以了解它是如何引起的,从而相应地更改请求,那么最好的办法是联系服务器管理员并在服务器代码中报告此错误并询问如何正确执行程序化登录。
如果由于某种原因这不是一个选项,那么如果您不忘记发送特定的cookie,标题和/或参数,则应该进行双重检查。可能是服务器端代码期待它,但它是null
并且代码是错误的,因此完全打破了500.我建议使用Firebug来跟踪整个HTTP流量并进行比较它与你设置的标题/参数。可能你需要发回特定的cookie吗?或者您需要发送提交按钮的名称=值对?等等。
更新:您发送错误的__VIEWSTATE
值。该网站运行在ASP.NET MVC上,这是一个基于组件的MVC框架(就像Java EE中的JSF一样)。它将组件树存储为“视图状态”。您不应将随机/不存在/无效的视图状态作为参数发送回来,而应该发送有效。您需要重写HTTP客户端,以便它首先使用表单在页面上触发GET请求,然后使用HTML解析器(Jsoup?)来提取隐藏的__VIEWSTATE
输入字段的值,最后发出一个具有该值的POST请求(和请求头中的cookie完全相同!)。
与JSF一样,视图状态是CSRF攻击防范的一部分。如果没有首先在同一会话中从网站本身请求表单,则无法提交表单。