设为首页 收藏本站
查看: 1099|回复: 0

[经验分享] 使用Apache HttpClient访问ASP.NET发送GET和POST请求

[复制链接]

尚未签到

发表于 2017-1-13 08:01:45 | 显示全部楼层 |阅读模式
  预备知识请查看使用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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-327667-1-1.html 上篇帖子: apache通用日志包commons-logging的简介以及与log4j的结合 下篇帖子: 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表