httpclient传递文件的参数如何获取

等等等等等等等等等等等完最热搜索问答话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关问答完等等等完完等等完完完等最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友HttpClient通过HttpPost传递参数 - 我们轻松了,并不是生活越来越容易了,而是我们越来越强 - ITeye技术网站
博客分类:
HttpClient新版本(新老版本没有做明确界定,Sorry!)
import java.util.ArrayL
import java.util.L
import org.apache.http.NameValueP
import org.apache.http.client.HttpC
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.HttpP
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.message.BasicNameValueP
public class HttpTests {
* @param args
* @throws Exception
public static void main(String[] args) throws Exception {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("******/abc");
List&NameValuePair& nvps = new ArrayList&NameValuePair&();
nvps.add(new BasicNameValuePair("username", "vip"));
nvps.add(new BasicNameValuePair("password", "secret"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
httpclient.execute(httpPost);
httpclient.getConnectionManager().shutdown();
HttpClient 老版本:
import mons.httpclient.HttpC
import mons.httpclient.NameValueP
import mons.httpclient.methods.PostM
public class HttpTests {
* @param args
* @throws Exception
public static void main(String[] args) throws Exception {
HttpClient httpclient = new HttpClient();
PostMethod httpPost =new PostMethod("******/abc");
NameValuePair[] param = { new NameValuePair("username", "vip")};
httpPost.setRequestBody(param);
httpclient.executeMethod(httpPost);
浏览 97527
浏览: 210057 次
来自: 北京
为什么用了第一种,死都没用呢?
lantian0802 写道有点不理解,锁锁住的是资源吗,像上 ...
有点不理解,锁锁住的是资源吗,像上文中锁数加在shareDat ...httpclient 用java调用 的方式获取网页内容, - 中国凉茶 - ITeye技术网站
博客分类:
1. 读取网页(HTTP/HTTPS)内容
下面是我们给出的一个简单的例子用来访问某个页面
/*
* Created on
by Liudong
*/
package http.
import java.io.IOE
import mons.httpclient.*;
import mons.httpclient.methods.*;
/**
*最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面
*/
public class SimpleClient {
public static void main(String[] args) throws IOException
{
HttpClient client = new HttpClient();
&&&&& // 设置代理服务器地址和端口&&&&&
&&&&& //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);
&&&&& // 使用 GET 方法 ,如果服务器需要通过 HTTPS 连接,那只需要将下面 URL 中的 http 换成 https
&&&&&&&& HttpMethodmethod=newGetMethod("");
&&&&& //使用POST方法
&&&&& //HttpMethod method = new PostMethod("");
&&&&& client.executeMethod(method);
&&&&& //打印服务器返回的状态
&&&&&& System.out.println(method.getStatusLine());
&&&&& //打印返回的信息
&&&&& System.out.println(method.getResponseBodyAsString());
&&&&& //释放连接
&&&&& method.releaseConnection();
&& }
}
在这个例子中首先创建一个HTTP客户端(HttpClient)的实例,然后选择提交的方法是GET或者POST,最后在HttpClient实例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用HttpClient的基本流程。其实用一行代码也就可以搞定整个请求的过程,非常的简单!
2. 以GET或者POST方式向网页提交参数
其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一个页面,本小节与之不同的是多了提交时设定页面所需的参数,我们知道如果是GET的请求方式,那么所有参数都直接放到页面的URL后面用问号与页面地址隔开,每个参数用&隔开,例如:/?name=liudong&mobile=123456,但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市,代码如下:
/*
* Created on
by Liudong
*/
package http.
import java.io.IOE
import mons.httpclient.*;
import mons.httpclient.methods.*;
/**
*提交参数演示
*该程序连接到一个用于查询手机号码所属地的页面
*以便查询号码段1330227所在的省份以及城市
*/
public class SimpleHttpClient {
&& public static void main(String[] args) throws IOException {
&&&&& HttpClient client = new HttpClient();
&&&&& client.getHostConfiguration().setHost( ".cn" , 80, "http" );
&&&&& method = getPostMethod();&&& // 使用 POST 方式提交数据
&&&&& client.executeMethod(method);&& //打印服务器返回的状态
&&&&& System.out.println(method.getStatusLine());&& //打印结果页面
&&&&& Stringresponse=newString(method.getResponseBodyAsString().getBytes("8859_1"));
&&&&& //打印返回的信息
&&&&& System.out.println(response);
&&&&& method.releaseConnection();
&& }
&& /**
&&& * 使用 GET 方式提交数据
&&
&& privatestaticHttpMethodgetGetMethod(){
&&&&& returnnewGetMethod("/simcard.php?simcard=1330227");
&& }
&&& /**
&&&& * 使用 POST 方式提交数据
&&&
&&&& */
&&& private static HttpMethod getPostMethod(){
&&&&& PostMethod post = new PostMethod( "/simcard.php" );
&&&&& NameValuePair simcard = new NameValuePair( "simcard" , "1330227" );
&&&&& post.setRequestBody( new NameValuePair[] { simcard});
&&&&&
&& }
}
在上面的例子中页面.cn/simcard.php需要一个参数是simcard,这个参数值为手机号码段,即手机号码的前七位,服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息,而POST则需要通过NameValuePair类来设置参数名称和它所对应的值。
3. 处理页面重定向
在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。它与JSP中的&jsp:forward …&的区别在于后者是在服务器中实现页面的跳转,也就是说应用容器加载了所要跳转的页面的内容并返回给客户端;而前者是返回一个状态码,这些状态码的可能值见下表,然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程,所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了,那么可以通过读取HTTP头中的location属性来获取新的地址。
对应 HttpServletResponse 的常量
详细描述
301
SC_MOVED_PERMANENTLY
页面已经永久移到另外一个新地址
302
SC_MOVED_TEMPORARILY
页面暂时移动到另外一个新的地址
303
SC_SEE_OTHER
客户端请求的地址必须通过另外的 URL 来访问
307
SC_TEMPORARY_REDIRECT
同 SC_MOVED_TEMPORARILY
下面的代码片段演示如何处理页面的重定向
client.executeMethod(post);
System.out.println(post.getStatusLine().toString());
post.releaseConnection();
// 检查是否重定向
int statuscode = post.getStatusCode();
if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) || (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) || (statuscode == HttpStatus.SC_SEE_OTHER) || (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
// 读取新的 URL 地址
&& Headerheader=post.getResponseHeader("location");
&& if (header!=null){
&&&&& Stringnewuri=header.getValue();
&&&&& if((newuri==null)||(newuri.equals("")))
&&&&&&&& newuri="/";
&&&&&&&& GetMethodredirect=newGetMethod(newuri);
&&&&&&&& client.executeMethod(redirect);
&&&&&&&& System.out.println("Redirect:"+redirect.getStatusLine().toString());
&&&&&&&& redirect.releaseConnection();
&& }else
&&& System.out.println("Invalid redirect");
}
我们可以自行编写两个JSP页面,其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。
4. 模拟输入用户名和口令进行登录
本小节应该说是HTTP客户端编程中最常碰见的问题,很多网站的内容都只是对注册用户可见的,这种情况下就必须要求使用正确的用户名和口令登录成功后,方可浏览到想要的页面。因为HTTP协议是无状态的,也就是连接的有效期只限于当前请求,请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例,当浏览器请求一个JSP或者是Servlet的页面时,应用服务器会返回一个参数,名为jsessionid(因不同应用服务器而异),值是一个较长的唯一字符串的Cookie,这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息,应用服务器根据读取这个会话标识来获取对应的会话信息。
对于需要用户登录的网站,一般在用户登录成功后会将用户资料保存在服务器的会话中,这样当访问到其他的页面时候,应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息,然后就可以判断用户资料是否存在于会话信息中,如果存在则允许访问页面,否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用的方法。
这样一来,对于HTTP的客户端来讲,如果要访问一个受保护的页面时就必须模拟浏览器所做的工作,首先就是请求登录页面,然后读取Cookie值;再次请求登录页面并加入登录页所需的每个参数;最后就是请求最终所需的页面。当然在除第一次请求外其他的请求都需要附带上Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多,可是如果你使用httpclient的话,你甚至连一行代码都无需增加,你只需要先传递登录信息执行登录过程,然后直接访问想要的页面,跟访问一个普通的页面没有任何区别,因为类HttpClient已经帮你做了所有该做的事情了,太棒了!下面的例子实现了这样一个访问的过程。
/*
* Created on
by Liudong
*/
package http.
import mons.httpclient.*;
import mons.httpclient.cookie.*;
import mons.httpclient.methods.*;
/**
* 用来演示登录表单的示例
* @author Liudong
*/
public class FormLoginDemo {
&& static final String LOGON_SITE = "localhost" ;
&& static final int&&&& LOGON_PORT = 8080;
&& public static void main(String[] args) throws Exception{
&&&&& HttpClient client = new HttpClient();
&&&&& client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT);
&&&&& // 模拟登录页面 login.jsp-&main.jsp
&&&&& PostMethod post = new PostMethod( "/main.jsp" );
&&&&& NameValuePair name = new NameValuePair( "name" , "ld" );
&&&&& NameValuePair pass = new NameValuePair( "password" , "ld" );
&&&&& post.setRequestBody( new NameValuePair[]{name,pass});
&&&&& int status = client.executeMethod(post);
&&&&& System.out.println(post.getResponseBodyAsString());
&&&&& post.releaseConnection();
&&&&& // 查看 cookie 信息
&&&&& CookieSpec cookiespec = CookiePolicy.getDefaultSpec();
&&&&& Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/" , false , client.getState().getCookies());
&&&&& if (cookies.length == 0) {
&&&&&&&& System.out.println( "None" );
&&&&& } else {
&&&&&&&& for ( int i = 0; i & cookies. i++) {
&&&&&&&&&&& System.out.println(cookies[i].toString());
&&&&&&&& }
&&&&& }
&&&&& // 访问所需的页面 main2.jsp
&&&&& GetMethodget=newGetMethod("/main2.jsp");
&&&&& client.executeMethod(get);
&&&&& System.out.println(get.getResponseBodyAsString());
&&&&& get.releaseConnection();
&& }
}
5. 提交XML格式参数
提交XML格式的参数很简单,仅仅是一个提交时候的ContentType问题,下面的例子演示从文件文件中读取XML信息并提交给服务器的过程,该过程可以用来测试Web服务。
import java.io.F
import java.io.FileInputS
import mons.httpclient.HttpC
import mons.httpclient.methods.EntityEnclosingM
import mons.httpclient.methods.PostM
/**
*用来演示提交XML格式数据的例子
*/
public class PostXMLClient {
&& public static void main(String[] args) throws Exception {
&&&&& File input = new File(“test.xml”);
&&&&& PostMethod post = new PostMethod(“http://localhost:8080/httpclient/xml.jsp”);
&&&&& // 设置请求的内容直接从文件中读取
&&&&& post.setRequestBody( new FileInputStream(input));
&&&&& if (input.length() & Integer.MAX_VALUE)
&&&&&&&& post.setRequestContentLength(input.length());
&&&&& else
&&&&&&&& post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);
&&&&& // 指定请求内容的类型
&&&&& post.setRequestHeader( "Content-type" , "text/ charset=GBK" );
&&&&& HttpClient httpclient = new HttpClient();
&&&&& int result = httpclient.executeMethod(post);
&&&&& System.out.println( "Response status code: " + result);
&&&&& System.out.println( "Response body: " );
&&&&& System.out.println(post.getResponseBodyAsString());
&&&&& post.releaseConnection();
&& }
}
6. 通过HTTP上传文件
httpclient使用了单独的一个HttpMethod子类来处理文件的上传,这个类就是MultipartPostMethod,该类已经封装了文件上传的细节,我们要做的仅仅是告诉它我们要上传文件的全路径即可,下面的代码片段演示如何使用这个类。
MultipartPostMethod filePost = new MultipartPostMethod(targetURL);
filePost.addParameter( "fileName" , targetFilePath);
HttpClient client = new HttpClient();
// 由于要上传的文件可能比较大 , 因此在此设置最大的连接超时时间
client.getHttpConnectionManager(). getParams().setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
上面代码中,targetFilePath即为要上传的文件所在的路径。
7. 访问启用认证的页面
我们经常会碰到这样的页面,当访问它的时候会弹出一个浏览器的对话框要求输入用户名和密码后方可,这种用户认证的方式不同于我们在前面介绍的基于表单的用户身份验证。这是HTTP的认证策略,httpclient支持三种认证方式包括:基本、摘要以及NTLM认证。其中基本认证最简单、通用但也最不安全;摘要认证是在HTTP 1.1中加入的认证方式,而NTLM则是微软公司定义的而不是通用的规范,最新版本的NTLM是比摘要认证还要安全的一种方式。
下面例子是从httpclient的CVS服务器中下载的,它简单演示如何访问一个认证保护的页面:
import mons.httpclient.HttpC
import mons.httpclient.UsernamePasswordC
import mons.httpclient.methods.GetM
public class BasicAuthenticationExample {
&&& public BasicAuthenticationExample() {
&&& }
&&& public static void main(String[] args) throws Exception {
&&&&&& HttpClient client = new HttpClient();
&&&&&& client.getState().setCredentials( "" , "realm" , new UsernamePasswordCredentials( "username" , "password" ) );
&&&&&& GetMethod get = new GetMethod( "/products/index.html" );
&&&&&& get.setDoAuthentication( true );
&&&&&& int status = client.executeMethod( get );
&&&&&& System.out.println(status+ "\n" + get.getResponseBodyAsString());
&&&&&& get.releaseConnection();
&&& }
}
8. 多线程模式下使用httpclient
多线程同时访问httpclient,例如同时从一个站点上下载多个文件。对于同一个HttpConnection同一个时间只能有一个线程访问,为了保证多线程工作环境下不产生冲突,httpclient使用了一个多线程连接管理器的类:MultiThreadedHttpConnectionManager,要使用这个类很简单,只需要在构造HttpClient实例的时候传入即可,代码如下:
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
HttpClient client = new HttpClient(connectionManager);
浏览 13734
浏览: 233749 次
来自: 北京
多谢博主分享
图片看不成
正在学习中,看完文章了,谢谢写的教程!!!HttpClient使用HttpGet进行json数据传输 - zhanghc - ITeye技术网站
博客分类:
项目中与对方进行数据交互时,对方提供了一套夸域json方式传递数据,并给出了一个js示例
$.getJSON(
"http://www.----aspx?callback=?",
{Name:"123",Pass:"123"},
function(json){
if(json.UserId==null){
alert("NO");
alert(json.UserId);
但是此方法处理数据时,只能在页面中进行,局限性很大。因此在具体实施时,使用了HttpClient来代替。
import java.io.InputStreamR
import java.util.ArrayL
import java.util.L
import org.apache.http.HttpE
import org.apache.http.HttpR
import org.apache.http.HttpS
import org.apache.http.NameValueP
import org.apache.http.client.HttpC
import org.apache.http.client.methods.HttpG
import org.apache.http.client.utils.URLEncodedU
import org.apache.http.impl.client.DefaultHttpC
import org.apache.http.message.BasicNameValueP
import org.apache.http.protocol.HTTP;
import org.json.JSONE
import org.json.JSONO
import org.json.JSONT
* 使用HttpClient请求页面并返回json格式数据.
* 对方接收的也是json格式数据。
* 因此使用HttpGet。
public class Json {
public static void main(String[] args) throws JSONException {
JSONObject json = new JSONObject();
List&NameValuePair& params = new ArrayList&NameValuePair&();
params.add(new BasicNameValuePair("Name", "123"));
params.add(new BasicNameValuePair("Pass", "123"));
//要传递的参数.
String url = "http://www.----aspx?" + URLEncodedUtils.format(params, HTTP.UTF_8);
//拼接路径字符串将参数包含进去
json = get(url);
System.out.println(json.get("UserId"));
public static JSONObject get(String url) {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
JSONObject json =
HttpResponse res = client.execute(get);
if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = res.getEntity();
json = new JSONObject(new JSONTokener(new InputStreamReader(entity.getContent(), HTTP.UTF_8)));
} catch (Exception e) {
throw new RuntimeException(e);
} finally{
//关闭连接 ,释放资源
client.getConnectionManager().shutdown();
(731.8 KB)
下载次数: 984
浏览 48202
浏览: 119285 次
来自: 北京
大哥有没有ECB模式的?
是吖,他奶奶的。做.net的就是傻帽,不考虑兼容性的,用md5 ...
非常感谢!3478人阅读
网络编程(8)
HttpClient新版本(新老版本没有做明确界定,Sorry!)&
Java代码&&
package&&&
import&java.util.ArrayL&&
import&java.util.L&&
import&org.apache.http.NameValueP&&
import&org.apache.http.client.HttpC&&
import&org.apache.http.client.entity.UrlEncodedFormE&&
import&org.apache.http.client.methods.HttpP&&
import&org.apache.http.impl.client.DefaultHttpC&&
import&org.apache.http.message.BasicNameValueP&&
public&class&HttpTests&{&&
&&&&public&static&void&main(String[]&args)&throws&Exception&{&&
&&&&&&&&HttpClient&httpclient&=&new&DefaultHttpClient();&&
&&&&&&&&HttpPost&httpPost&=&new&HttpPost(&******/abc&);&&
&&&&&&&&List&NameValuePair&&nvps&=&new&ArrayList&NameValuePair&();&&
&&&&&&&&nvps.add(new&BasicNameValuePair(&username&,&&vip&));&&
&&&&&&&&nvps.add(new&BasicNameValuePair(&password&,&&secret&));&&
&&&&&&&&httpPost.setEntity(new&UrlEncodedFormEntity(nvps));&&
&&&&&&&&httpclient.execute(httpPost);&&
&&&&&&&&httpclient.getConnectionManager().shutdown();&&
HttpClient 老版本:&
Java代码&&
package&&&
import&mons.httpclient.HttpC&&
import&mons.httpclient.NameValueP&&
import&mons.httpclient.methods.PostM&&
public&class&HttpTests&{&&
&&&&public&static&void&main(String[]&args)&throws&Exception&{&&
&&&&&&&&HttpClient&httpclient&=&new&HttpClient();&&
&&&&&&&&PostMethod&httpPost&=new&PostMethod(&******/abc&);&&
&&&&&&&&NameValuePair[]&param&=&{&new&NameValuePair(&username&,&&vip&)};&&
&&&&&&&&httpPost.setRequestBody(param);&&&
&&&&&&&&httpclient.executeMethod(httpPost);&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:184487次
积分:2505
积分:2505
排名:第13229名
原创:87篇
转载:66篇
评论:15条
(1)(2)(1)(3)(35)(96)(1)(1)(1)(2)(2)(6)(2)

我要回帖

更多关于 httpclient传递文件 的文章

 

随机推荐