我正在创建第三方java应用程序(桌面),需要连接到基于php的站点并登录以收集相关数据。没有可访问的Web服务,没有API,每个用户都有自己的安全登录。该站点使用dojo(如果这很重要),我使用Java HttpClient发送帖子。
HttpPost httppost = new HttpPost("https://thewebsite.net/index/login"); // .php ?
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
//initialize the response string
String nextpage = "";
try {
// Add nvps
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
nameValuePairs.add(new BasicNameValuePair("", ""));
nameValuePairs.add(new BasicNameValuePair("login", "USER"));
nameValuePairs.add(new BasicNameValuePair("", ""));
nameValuePairs.add(new BasicNameValuePair("pass", "PASSWORD"));
nameValuePairs.add(new BasicNameValuePair("Submit", ""));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
userID = EntityUtils.toString(response.getEntity());
System.out.println(nextpage);
httppost.releaseConnection();
}
...
现在,我遇到的问题是给我的响应是通过dojo的user / pass字段的验证jscript。
<script type='text/javascript'>
dojo.require("dojox.validate._base");
function validate_RepeatPassword(val, constraints)
{
var isValid = false;
if(constraints) {
var otherInput = dijit.byId(constraints[0]);
if(otherInput) {
var otherValue = otherInput.value;
isValid = (val == otherValue);
}
}
return isValid;
}
</script>
我只想连接,解析html响应,然后关闭连接。
当我使用firebug时,我将其作为post方法,但我似乎无法让它运行: 参考者https://thewebsite.net/index/login 来源登录= USER&amp; pass = PASSWORD
当我使用HttpPost客户端构建没有namevaluepairs的直接帖子网址时:
HttpPost httppost = new HttpPost("https://thewebsite.net/index/login?login=USER&pass=PASSWORD");
,我收到一条错误响应,指出“用户和传递字段不能留空。”
我的问题是:是否有一种直接的登录方法,这种方式更容易让我错过,这样我才能成功继续登录?
谢谢 - 我喜欢SO社区;希望你能提供帮助。
答案 0 :(得分:0)
我认为执行此操作的最佳库是jsoup
Connection.Response res =
Jsoup.connect("https://thewebsite.net/index/login?login=USER&pass=PASSWORD")
.method(Method.POST)
.execute();
在此之后您还需要进行验证。您需要读取cookie,请求参数和标题参数,这将有效。
答案 1 :(得分:0)
我最终没有使用您的确切代码(使用post参数),但JSoup是修复。
这是我使用的:
`res = Jsoup.connect("https://thewebsite.net/index/login")
.data("login", User).data("pass", Pass)
.userAgent("Chrome").method(Method.POST).execute();
//then I grabbed the cookie and sent the next post for the data
Document t = res.parse(); //for later use
SessionID = res.cookie("UNIQUE_NAME");
//the JSON
Connection.Response driverx = Jsoup.connect("https://thewebsite.net/datarequest/data").cookie("UNIQUE_NAME",SessionID).userAgent("Chrome").method(Method.POST).execute();`