很奇怪,因为它的工作方式与昨天一样,但是今天停止了工作(可能是网站进行了一些更改)。我在Android应用中使用此代码发布到具有适当参数的URL。现在,当它开始显示404错误时,我尝试了各种帖子“标题”,但仍然无法正常工作。
例如,如果您进入http://www.indianrail.gov.in/pnr_Enq.html并输入以下PNR号:2727059219,则输入该纯文本验证码(是的,我知道。很遗憾),然后单击“获取状态”,在Firebug中观看它,您可以清楚地看到参数。但是,当我在应用程序中执行几乎完全相同的操作时,它将不再起作用。请注意,验证码是由客户端脚本生成的5位随机数字,如果用户写的相同,则匹配。因此,在发送post参数时,无论是什么(生成和输入的)都像'11111'一样有效。
这是我的代码一直有效到昨天。带注释的标题是我现在尝试过但仍然无法使用的标题:
try
{
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://www.indianrail.gov.in/cgi_bin/inet_pnrstat_cgi.cgi");
post.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0");
post.setHeader("Accept","text/html,application/xhtml+xml,application/xml");
//post.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
post.setHeader("Accept-Language", "en-US,en;q=0.5");
post.setHeader("Accept-Encoding", "gzip, deflate");
//post.setHeader("Referer", "http://www.indianrail.gov.in/pnr_Enq.html");
//post.setHeader("Content-Type", "application/x-www-form-urlencoded");
post.setHeader("Connection", "keep-alive");
List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
urlParameters.add(new BasicNameValuePair("lccp_cap_val", "11111"));
urlParameters.add(new BasicNameValuePair("lccp_capinp_val", "11111"));
urlParameters.add(new BasicNameValuePair("lccp_pnrno1", "2727059219")); //the PNR number taken from app, but hard coded to test
urlParameters.add(new BasicNameValuePair("submit", "Get+Status"));
post.setEntity(new UrlEncodedFormEntity(urlParameters));
HttpResponse response = client.execute(post);
if(response.getStatusLine().getStatusCode() != 200)
throw new Exception("Error " + String.valueOf(response.getStatusLine().getStatusCode())); String result = EntityUtils.toString(response.getEntity());
}
catch (Exception ex)
{
mException = ex;
}
有人可以告诉我代码在哪里错误吗?为何它只能在浏览器中工作?
最佳答案
您使用了错误的端点URL,那里有一个额外的字符。
更改您的URL:
http://www.indianrail.gov.in/cgi_bin/inet_pnstat_cgi.cgi
注意删除的“ r” inet_pn * r * stat_cgi。
我能够复制404;使用更改后的网址,它可以正常工作-不再是404。