Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该如何对错误的HTTP登录进行故障排除?_Java_Http - Fatal编程技术网

Java 我应该如何对错误的HTTP登录进行故障排除?

Java 我应该如何对错误的HTTP登录进行故障排除?,java,http,Java,Http,我试图使用ApacheHttpComponents客户端,用Java模拟网站上的登录过程。目前它正在失败,我不知道为什么。我在Firefox中使用Firebug来尝试理解等效的浏览器事件,我确信它是通过表单上的特定POST方法登录的 这是我的密码。最后,我希望设置一大堆cookie,但它们不是,我对后续GET请求的响应证明登录失败 String email = ... String password = ... String url = ... DefaultHttpClient client

我试图使用ApacheHttpComponents客户端,用Java模拟网站上的登录过程。目前它正在失败,我不知道为什么。我在Firefox中使用Firebug来尝试理解等效的浏览器事件,我确信它是通过表单上的特定POST方法登录的

这是我的密码。最后,我希望设置一大堆cookie,但它们不是,我对后续GET请求的响应证明登录失败

String email = ...
String password = ...
String url = ...
DefaultHttpClient client = new DefaultHttpClient();
List<NameValuePair> loginParams = new ArrayList<NameValuePair>(2);
loginParams.add(new BasicNameValuePair("logindetails[email]", email));
loginParams.add(new BasicNameValuePair("logindetails[password]", password));
UrlEncodedFormEntity loginEntity = new UrlEncodedFormEntity(loginParams);
HttpPost loginPost = new HttpPost(url);
loginPost.setEntity(loginEntity);
HttpResponse loginResponse = client.execute(loginPost);
HttpEntity loginRepsonseEntity = loginResponse.getEntity();
loginRepsonseEntity.consumeContent();

for (Cookie cookie: client.getCookieStore().getCookies()) {
    System.out.println(cookie.getName() + " -> " + cookie.getValue());
}
String电子邮件=。。。
字符串密码=。。。
字符串url=。。。
DefaultHttpClient=新的DefaultHttpClient();
List LoginParms=新的ArrayList(2);
添加(新的BasicNameValuePair(“logindetails[email]”,email));
添加(新的BasicNameValuePair(“logindetails[password]”,password));
UrlEncodedFormEntity loginEntity=新的UrlEncodedFormEntity(loginParams);
HttpPost loginPost=新的HttpPost(url);
loginPost.setEntity(loginEntity);
HttpResponse loginResponse=client.execute(loginPost);
HttpEntity loginRepsonseEntity=loginResponse.getEntity();
loginReposenseEntity.consumeContent();
对于(Cookie Cookie:client.getCookieStore().getCookies()){
System.out.println(cookie.getName()+“->”+cookie.getValue());
}

我应该从哪里开始寻找问题?我想验证帖子是否与我的浏览器正在制作的帖子相同——最好的方法是什么?

您可以使用Firefox中的Firebug查看“网络”选项卡,以了解在使用网页时如何完成帖子。看看你的代码,我猜你的参数名很奇怪<代码>登录详细信息[电子邮件]和
登录详细信息[密码]
看起来很奇怪

这相当于:

<form action="...url" method="post">
   email: <input type="text" name="logindetails[email]"/><br/>
   password: <input type="password" name="logindetails[password]"/><br/>
   <input type="submit" value="submit"/>
</form>

电子邮件:
密码:

确保这正是您想要的…

看看奇妙的cURL实用程序->

它在Unix/Linux中无处不在,并且在Windows上的Cygwin下可用


它可以让您在命令行中通过几次按键来实现在Java中的目标。

在我工作的地方,我们每天都在使用ApacheHttpClient,这太棒了。你在做什么,你自己编码数据,我觉得有点奇怪。有一个更简单的方法。我想你是在发帖子

String email = ...
String password = ...
String url = ...

PostMethod post = new PostMethod(url);

NameValuePair[] data = {
    new NameValuePair("logindetails[email]", email),
    new NameValuePair("logindetails[password]", password)
};

post.setRequestBody(data);

// execute method and handle any error responses.

HttpClient httpclient = new HttpClient();

int statusCode = httpclient.executeMethod(post);

// continue as neccessary
我从ApacheHttpClient站点获取了该代码(并对其进行了修改以更好地适应您的代码)。除非您有充分的理由,否则您不需要麻烦自己用UrlEncodedFormEntity打包字段


至于调试这类东西,用它来观察数据包的来回是最容易的。其中任何一个都可以让您观察请求的来回(只要您不使用HTTPS),这样您就可以通过将请求与浏览器发送的内容进行比较,轻松判断错误发送的内容。这不是世界上最方便用户的程序,但在尝试解决这类问题时,它是非常宝贵的。

好的,那么我的下一步检查是使用firebug检查网络选项卡。然后在HttpClient中打开调试并比较帖子的内容。这些并不奇怪。Php支持这些标记并将它们解释为数组。