`

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

    博客分类:
  • Java
阅读更多

预备知识请查看使用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;
	}
}

 

分享到:
评论
4 楼 zywang 2013-03-21  
爱编程 写道
发送POST请求时,需要根据上一次请求时从服务器端带过来的隐藏域数据。这是必须的吗?很急,请帮忙解答

按我以前的经验,这是必须的,ASP.NET中有个ViewState,这里面的东西,要传来传去的
3 楼 爱编程 2013-03-07  
发送POST请求时,需要根据上一次请求时从服务器端带过来的隐藏域数据。这是必须的吗?很急,请帮忙解答
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监视一下完成登录下载请求时所发送的数据,然后再模拟这样的操作
1 楼 gelnyang 2011-10-25  
Hi, 能帮我看看这个问题吗,我尝试用java登陆sharepoint一直都不成功,谢谢了:
http://stackoverflow.com/questions/7874595/using-java-to-login-form-based-authentication-net-web-application

相关推荐

    用HttpClient来模拟浏览器GET POST

    当然了,正如前面说到的,如果我们自己使用java.net.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于...

    各种语言短信接口 PHP Java asp.net

    使用C#或VB.NET语言,开发者可以通过HttpClient类或者WebClient类来发送HTTP请求。首先,获取短信服务提供商的API文档,了解所需的URL、认证信息以及请求格式。然后,在C#或VB.NET代码中设置这些参数,创建HTTP请求...

    asp,asp.net,java,php手机短信验证码程序

    在ASP.NET中,可以利用.NET Framework中的类库,如System.Net命名空间的HttpClient类,来发起HTTP请求。同样,需要配置短信服务提供商的API接口,并在后端处理发送和验证验证码的逻辑。ASP.NET MVC或ASP.NET Core...

    Android端将小文件上传到asp.net服务器

    5. **发送请求**: 发送POST请求到服务器,携带文件数据和可能的其他参数,如文件名、类型等。 二、ASP.NET服务器端处理 1. **接收文件**: 在ASP.NET中,使用`HttpPostedFileBase`类接收上传的文件。它位于`System....

    Android调用Web应用浅析.pdf

    《Android调用Web应用浅析》这篇文章主要探讨了Android如何访问和交互不同类型的Web应用程序,如JSP和ASP.NET,以及如何处理XML和JSON数据。文章深入研究了两种主要的网络访问方式:通过URL和使用HTTP客户端...

    android webservice C#.NET

    1. Android的HttpURLConnection:这是基础的网络请求库,可以用来发送GET和POST请求。你需要手动处理HTTP头、编码和解析响应。 2. HttpClient:Apache HttpClient库为Android提供了更高级别的HTTP请求API,使得请求...

    .net中调用PHP原码

    这适用于简单的请求,比如GET和POST,但不适合复杂逻辑或需要保持状态的场景。 6. **使用异步编程** - 在.NET Core或.NET Framework 4.5及以上版本中,推荐使用异步编程模型(async/await)来提高调用PHP的性能,...

    启明网站手机短信接口v1.0 asp,php,asp.net,java开发接口源代码

    HTTP版可能涉及直接使用HTTP POST或GET请求来发送短信,而WebService版则可能通过SOAP协议进行通信,这两种方式都是常见的Web服务交互模式。 综上所述,启明网站手机短信接口v1.0是一个全面的解决方案,覆盖了多种...

    运短信多语言接口案例

    6. **ASP短信接口**:由于ASP是一种较旧的技术,其短信接口实现可能基于经典的XMLHttpRequest对象,通过AJAX技术向服务器发送POST请求。 7. **VB.NET短信接口**:VB.NET的实现方式与C#类似,都是.NET框架的一部分,...

    对接金蝶的demo,帮助快速对接金蝶webapi

    3. 构建请求:确定API的URL,根据需求选择GET、POST等方法,并设置请求头和请求体。如果是GET请求,查询参数可能包含在URL中;如果是POST或PUT请求,数据通常放在请求体中。 4. 发送请求:调用客户端的相应方法,如...

    java短信接口

    1. **HTTP请求**:Java中可以使用`java.net.HttpURLConnection`或者第三方库如Apache HttpClient来发起HTTP请求。HTTP请求包括GET和POST方法,短信接口通常是POST请求,因为可能需要传递大量的短信内容和参数。 2. ...

    http协议分析工具

    通过HttpClient类,开发者能方便地发送GET、POST等各种HTTP请求,同时获取响应内容。C#也可以用来编写服务器端的Web应用,如ASP.NET,处理来自客户端的HTTP请求。 Perl是一种功能强大的脚本语言,对于HTTP协议分析...

    短信通接口

    例如,`asp`(Active Server Pages)可能使用XMLHttpRequest对象,而`c#`可能使用HttpClient类,`java`则可能依赖HttpURLConnection或第三方库如Apache HttpClient。 对于`C++`,可能需要使用DLL(动态链接库),...

    c#-android 文件传输

    2. **HTTP客户端**:使用`HttpURLConnection`或Retrofit库,发送HTTP POST请求上传文件,GET请求下载文件。 3. **WebDAV客户端**:使用Apache HttpClient库实现WebDAV客户端功能。 4. **Socket通信**:使用`java...

    android调用ASHX

    ASHX是ASP.NET中的一个自定义HTTP处理程序,用于处理特定的HTTP请求。本篇文章将深入探讨如何在Android中通过HTTPClient调用ASHX接口,以及如何使用JSONHelper进行数据序列化和反序列化,同时介绍Handler和Message在...

    水文站流量数据爬虫程序

    1. **网络请求**:使用`java.net.URL`和`java.net.HttpURLConnection`可以创建网络连接并发送GET请求到目标页面。对于POST请求或其他复杂请求,可以借助Apache HttpClient库,它提供了更灵活的选项,如设置请求头和...

    13.WWW浏览器和Web服务器.rar

    或者使用HTTP请求库,如Winsock控件或.NET的HttpClient,发送HTTP请求到Web服务器获取数据,实现自动化测试、爬虫、API调用等功能。此外,VB也可以用于构建Web服务器端的应用,例如通过ASP(Active Server Pages)...

    Paypal的IPN和PDT变量对照表(中文版)PP_IPN_PDT_Guide_CHN

    Java示例代码通常涉及使用HTTP客户端库(如Apache HttpClient)来构建HTTP请求并处理响应。 **2.4.2 IPN for Perl 示例代码** Perl示例代码可以使用LWP::UserAgent模块来构建请求和处理响应。 **2.4.3 IPN for ...

    java、php、C#、asp实现短信群发功能的方法

    使用HttpWebRequest时,首先要创建一个HttpWebRequest实例,然后设置请求方法(GET或POST)、请求内容以及请求头(如User-Agent等)。接着使用GetResponse方法获取服务器的响应,并读取响应流中的数据。使用...

Global site tag (gtag.js) - Google Analytics