- 浏览: 316306 次
- 性别:
- 来自: 合肥
文章分类
最新评论
-
chinahnzhou:
...
使用Apache HTTPServer实现负载均衡 -
sanorol:
qja 写道citi007 写道 <task:annot ...
在Spring3中使用注解(@Scheduled)创建计划任务 -
qja:
citi007 写道 <task:annotation- ...
在Spring3中使用注解(@Scheduled)创建计划任务 -
u012935452:
SHOUJIAOLA
使用Apache HttpClient实现多线程下载的小例子 -
guanggsanguo:
学习!赞一个!
使用Apache HttpClient实现多线程下载的小例子
预备知识请查看使用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
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
http://stackoverflow.com/questions/7874595/using-java-to-login-form-based-authentication-net-web-application
发表评论
-
使用Apache HttpClient访问JSP发送GET和POST请求
2011-02-22 17:33 9464本示例说明了如何使用Apache HttpClient发送GE ... -
Java使用Zip包压缩文件示例
2011-02-22 17:24 2005无描述,有代码,你懂的 public static voi ... -
使用Apache HttpClient实现多线程下载的小例子
2011-02-22 17:00 12515网上类似的文章很多,参考了很多人的,大部分人都是用URLCon ... -
SVN 统计工具 StatSVN
2010-11-10 16:47 3208StatSVN可以根据SVN版本库的日志记录分析库,生成各种统 ... -
FreeMarker 2.3.16 中文手册
2010-11-09 08:43 195810 September 2010: FreeMarker M ... -
Servlet 3.0 新特性详解
2010-07-05 16:27 1240Eclispe 3.6出来了,Tomcat7也出来了,Serv ... -
Java UDP Socket消息发送
2010-03-17 23:46 6428在Java中使用UDP完成消息发送。主要使用DatagramS ... -
JSON-lib中对java.sql.Date类型转化不了
2009-10-13 09:23 3919昨天被客户发现了一个BUG,我们使用JSONLIB转化一个数据 ... -
在Java中计算四则运算表达式字符串的值
2009-09-05 17:25 6847在项目中有个需求,需要动态的计算一个四则运算表达式的结果,在J ... -
Struts中FormBean的日期类型字段赋值自动转化
2009-06-22 17:15 1890前面整理了Jsp中useBean中字符串和时间的转化操作,然后 ... -
使用jstl格式化日期
2009-06-22 16:43 1509网上看到的,收藏一下 <%@ page languag ... -
Jsp:useBean中字符串转化为Date类型的操作方法
2009-06-22 15:52 2665在Jsp项目中,很多时候需要用到字符串到日期类型的转化,一般有 ... -
Jsp中使用过滤器实现用户权限限制功能
2009-06-11 22:59 6957今天下午,临下课的时 ... -
Jsp中AJAX的简单使用
2009-06-10 21:42 3646参考了IBM上关于AJAX的使用方法,代码也是从那摘的,简单组 ... -
Java中java.util.Date时间和java.sql.Date时间的转化
2009-06-10 20:16 2739猛然回首,发现知识有点过时了,连个时间转化都处理的有点老土了, ... -
新帖试手——Jsp中使用下拉框
2009-06-10 20:07 1201好久没写过代码了,今天学生问个问题,差点没想起来,Google ...
相关推荐
当然了,正如前面说到的,如果我们自己使用java.net.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于...
使用C#或VB.NET语言,开发者可以通过HttpClient类或者WebClient类来发送HTTP请求。首先,获取短信服务提供商的API文档,了解所需的URL、认证信息以及请求格式。然后,在C#或VB.NET代码中设置这些参数,创建HTTP请求...
在ASP.NET中,可以利用.NET Framework中的类库,如System.Net命名空间的HttpClient类,来发起HTTP请求。同样,需要配置短信服务提供商的API接口,并在后端处理发送和验证验证码的逻辑。ASP.NET MVC或ASP.NET Core...
5. **发送请求**: 发送POST请求到服务器,携带文件数据和可能的其他参数,如文件名、类型等。 二、ASP.NET服务器端处理 1. **接收文件**: 在ASP.NET中,使用`HttpPostedFileBase`类接收上传的文件。它位于`System....
《Android调用Web应用浅析》这篇文章主要探讨了Android如何访问和交互不同类型的Web应用程序,如JSP和ASP.NET,以及如何处理XML和JSON数据。文章深入研究了两种主要的网络访问方式:通过URL和使用HTTP客户端...
1. Android的HttpURLConnection:这是基础的网络请求库,可以用来发送GET和POST请求。你需要手动处理HTTP头、编码和解析响应。 2. HttpClient:Apache HttpClient库为Android提供了更高级别的HTTP请求API,使得请求...
这适用于简单的请求,比如GET和POST,但不适合复杂逻辑或需要保持状态的场景。 6. **使用异步编程** - 在.NET Core或.NET Framework 4.5及以上版本中,推荐使用异步编程模型(async/await)来提高调用PHP的性能,...
HTTP版可能涉及直接使用HTTP POST或GET请求来发送短信,而WebService版则可能通过SOAP协议进行通信,这两种方式都是常见的Web服务交互模式。 综上所述,启明网站手机短信接口v1.0是一个全面的解决方案,覆盖了多种...
6. **ASP短信接口**:由于ASP是一种较旧的技术,其短信接口实现可能基于经典的XMLHttpRequest对象,通过AJAX技术向服务器发送POST请求。 7. **VB.NET短信接口**:VB.NET的实现方式与C#类似,都是.NET框架的一部分,...
3. 构建请求:确定API的URL,根据需求选择GET、POST等方法,并设置请求头和请求体。如果是GET请求,查询参数可能包含在URL中;如果是POST或PUT请求,数据通常放在请求体中。 4. 发送请求:调用客户端的相应方法,如...
1. **HTTP请求**:Java中可以使用`java.net.HttpURLConnection`或者第三方库如Apache HttpClient来发起HTTP请求。HTTP请求包括GET和POST方法,短信接口通常是POST请求,因为可能需要传递大量的短信内容和参数。 2. ...
通过HttpClient类,开发者能方便地发送GET、POST等各种HTTP请求,同时获取响应内容。C#也可以用来编写服务器端的Web应用,如ASP.NET,处理来自客户端的HTTP请求。 Perl是一种功能强大的脚本语言,对于HTTP协议分析...
例如,`asp`(Active Server Pages)可能使用XMLHttpRequest对象,而`c#`可能使用HttpClient类,`java`则可能依赖HttpURLConnection或第三方库如Apache HttpClient。 对于`C++`,可能需要使用DLL(动态链接库),...
2. **HTTP客户端**:使用`HttpURLConnection`或Retrofit库,发送HTTP POST请求上传文件,GET请求下载文件。 3. **WebDAV客户端**:使用Apache HttpClient库实现WebDAV客户端功能。 4. **Socket通信**:使用`java...
ASHX是ASP.NET中的一个自定义HTTP处理程序,用于处理特定的HTTP请求。本篇文章将深入探讨如何在Android中通过HTTPClient调用ASHX接口,以及如何使用JSONHelper进行数据序列化和反序列化,同时介绍Handler和Message在...
1. **网络请求**:使用`java.net.URL`和`java.net.HttpURLConnection`可以创建网络连接并发送GET请求到目标页面。对于POST请求或其他复杂请求,可以借助Apache HttpClient库,它提供了更灵活的选项,如设置请求头和...
或者使用HTTP请求库,如Winsock控件或.NET的HttpClient,发送HTTP请求到Web服务器获取数据,实现自动化测试、爬虫、API调用等功能。此外,VB也可以用于构建Web服务器端的应用,例如通过ASP(Active Server Pages)...
Java示例代码通常涉及使用HTTP客户端库(如Apache HttpClient)来构建HTTP请求并处理响应。 **2.4.2 IPN for Perl 示例代码** Perl示例代码可以使用LWP::UserAgent模块来构建请求和处理响应。 **2.4.3 IPN for ...
使用HttpWebRequest时,首先要创建一个HttpWebRequest实例,然后设置请求方法(GET或POST)、请求内容以及请求头(如User-Agent等)。接着使用GetResponse方法获取服务器的响应,并读取响应流中的数据。使用...