首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

运用Apache HttpClient访问ASP.NET发送GET和POST请求

2013-01-01 
使用Apache HttpClient访问ASP.NET发送GET和POST请求预备知识请查看使用Apache HttpClient访问JSP发送GET

使用Apache HttpClient访问ASP.NET发送GET和POST请求

预备知识请查看使用Apache HttpClient访问JSP发送GET和POST请求

?

这里主要介绍对于ASP的访问的一点需要注意的地方。

1、访问ASP.NET网站时,需要请求的上下文,即必须保证HttpClient不能被关闭(也许这是必须的);

2、发送POST请求时,需要根据上一次请求时从服务器端带过来的隐藏域数据,也就是:__PREVIOUSPAGE、__EVENTVALIDATION、__VIEWSTATE,或者还有其它的,创建表单时要把他们(如果有的话)都填进去;

3、你需要使用HttpWatch查看一下IE的发送数据,找到你要点的按钮(MS根据按钮的名称判断进谁的事件,猜测的...);

?

Apache HttpClient 版本 4.0.3

下载地址:http://hc.apache.org/downloads.cgi

?

package com.zywang.http;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;public class HttpClientForAspx {private static Map<String, String> params = null; private static String loginPage = "http://localhost/kaoqin";private static String defaultPage = "http://localhost/kaoqin/Default.aspx";private static String indexPage = "http://localhost/kaoqin/Index.aspx";private static String userName = "zywang";private static String password = "zywang";//.Net隐藏域private final static String PREVIOUSPAGE = "__PREVIOUSPAGE";private final static String EVENTVALIDATION = "__EVENTVALIDATION";private final static String VIEWSTATE = "__VIEWSTATE";public static void main(String[] args)throws ClientProtocolException, IOException {attendance("下班操作");}/** * 运行按钮功能 * @throws IOException * @throws ClientProtocolException */private static void attendance(String btnValue)throws IOException, ClientProtocolException {HttpClient client = new DefaultHttpClient();//打开主页if(!loadPage(client ,loginPage)){System.out.println("打开主页失败!");return;}//执行登录if(loginPost(client)){//打开主页面if(loadPage(client,indexPage)){//开始打开          上班操作          下班操作if(sign(client,btnValue)){System.out.println("操作成功!");}else{System.out.println("操作失败!");}}}else{System.out.println("登录失败!");}client.getConnectionManager().shutdown();}/** * 根据按钮名称进行操作 */private static boolean sign(HttpClient client,String btnValue)throws IOException,ClientProtocolException {//System.out.println("==>>开始操作");HttpPost post = new HttpPost(indexPage);List<NameValuePair> qparams = new ArrayList<NameValuePair>();qparams.add(new BasicNameValuePair(PREVIOUSPAGE, params.get(PREVIOUSPAGE)));qparams.add(new BasicNameValuePair(EVENTVALIDATION, params.get(EVENTVALIDATION)));qparams.add(new BasicNameValuePair(VIEWSTATE, params.get(VIEWSTATE)));//包含目标按钮则执行操作if(getKeyByValue(btnValue)!=null){qparams.add(new BasicNameValuePair(getKeyByValue(btnValue), btnValue));post.setEntity(new UrlEncodedFormEntity(qparams));HttpResponse response = client.execute(post);int statusCode = response.getStatusLine().getStatusCode();System.out.println("statusCode:"+statusCode);post.abort();return true;}System.out.println("没有发现按钮:["+btnValue+"]");post.abort();return false;}/** * 登录系统 */private static boolean loginPost(HttpClient client) throws IOException,ClientProtocolException {//System.out.println("==>>开始登录");HttpPost post = new HttpPost(defaultPage);List<NameValuePair> qparams = new ArrayList<NameValuePair>();qparams.add(new BasicNameValuePair(EVENTVALIDATION, params.get(EVENTVALIDATION)));qparams.add(new BasicNameValuePair(VIEWSTATE, params.get(VIEWSTATE)));qparams.add(new BasicNameValuePair("imgBtnLogin.x", "0"));qparams.add(new BasicNameValuePair("imgBtnLogin.y", "0"));qparams.add(new BasicNameValuePair("txtUser", userName));qparams.add(new BasicNameValuePair("txtPassword", password));post.setEntity(new UrlEncodedFormEntity(qparams));HttpResponse response = client.execute(post);int statusCode = response.getStatusLine().getStatusCode();System.out.println("statusCode:"+statusCode);if(statusCode == 302){post.abort();return true;}post.abort();return false;}/** * 加载页面-通过GET方式 */private static boolean loadPage(HttpClient client,String url)throws IOException,ClientProtocolException {//System.out.println("==>>加载页面(GET):"+url);HttpGet get = new HttpGet(url);HttpResponse response = client.execute(get);int statusCode = response.getStatusLine().getStatusCode();System.out.println("statusCode:"+statusCode);HttpEntity entity = response.getEntity();BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));String buffer = null;StringBuilder sb = new StringBuilder();while((buffer=reader.readLine())!=null){sb.append(buffer);}params = getAllInputNames(sb.toString());get.abort();return statusCode == 200;}private static String getInputProperty(String input,String property) {Matcher m = Pattern.compile(property+"[\\s]*=[\\s]*"[^"]*"").matcher(input);if(m.find()){String v = m.group();return v.substring(v.indexOf(""")+1,v.length()-1);}return null;}private static Map<String, String> getAllInputNames(String body){Map<String, String> parameters = new HashMap<String, String>();Matcher matcher = Pattern.compile("<input[^<]*>").matcher(body);while(matcher.find()){String input = matcher.group();if(input.contains("name")){parameters.put(getInputProperty(input,"name"), getInputProperty(input,"value"));}}return parameters;}private static String getKeyByValue(String value){for(String s:params.keySet()){if(params.get(s).equals(value)){return s;}}return null;}}

?

1 楼 gelnyang 2011-10-25   Hi, 能帮我看看这个问题吗,我尝试用java登陆sharepoint一直都不成功,谢谢了:
http://stackoverflow.com/questions/7874595/using-java-to-login-form-based-authentication-net-web-application 2 楼 zywang 2011-10-26   gelnyang 写道Hi, 能帮我看看这个问题吗,我尝试用java登陆sharepoint一直都不成功,谢谢了:
http://stackoverflow.com/questions/7874595/using-java-to-login-form-based-authentication-net-web-application
手头上没有现成的环境帮你测试,建议你用HttpWatch监视一下完成登录下载请求时所发送的数据,然后再模拟这样的操作

热点排行