我正在尝试创建一个 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。
当我将 URL 指向另一个测试页面时,我设法让它工作,但在 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");
最佳答案
HTTP 错误 500 仅表示服务器端代码失败。它有一个错误,例如那里抛出了一个 NullPointerException
。如果响应正文不包含任何合理的内容(例如堆栈跟踪)以便您可以了解它是如何引起的并因此相应地更改请求,那么最好的办法是联系服务器管理员并报告服务器代码中的此错误并询问如何正确执行编程登录。
如果出于某种原因这不是一个选项,那么您应该仔细检查是否没有忘记发送特定的 cookie、 header 和/或参数。可能服务器端代码期待它,但它是 null
并且代码有错误,因此它完全打破了 500。我建议使用 Firebug跟踪整个 HTTP 流量并将其与您设置的 header /参数进行比较。可能您需要发回特定的 cookie?或者您需要发送提交按钮的名称=值对?等等。
更新:您发送了错误的 __VIEWSTATE
值。该网站在 ASP.NET MVC 上运行,这是一个基于组件的 MVC 框架(类似于 Java EE 中的 JSF)。它将组件树存储为“ View 状态”。您不应将随机/不存在/无效的 View 状态作为参数发回,而应发送有效。您需要重写 HTTP 客户端,以便它首先在包含表单的页面上触发 GET 请求,然后使用 HTML 解析器(Jsoup?)提取隐藏的 __VIEWSTATE
输入字段的值最后使用该值(以及请求 header 中完全相同的 cookie!)触发 POST 请求。
与在 JSF 中一样, View 状态是 CSRF 攻击预防的一部分。您必须先在同一 session 中从网站本身请求表单,才能提交表单。
关于java - 为什么通过 Android 向 ASP.NET MVC 站点发送 POST 数据时会出现错误 500?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6082791/