httpClient下载(同样适用android)
Android Http网络编程--使用HttpClient
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
Android HTTP网络编程
6
使用HttpClient
HttpPost的使用要稍微麻烦一点,因为GET方式直接在URL中传入了请求 参数,而POST方式需要另外一种传参方式。
✓POST方式的参数需要使用一个List<NameValuePair>类型的对象传递, NameValuePair是一个接口,一般使用的是其直接实现类 BasicNameValuPair类:
Android HTTP网络编程
----使用HttpClient
Android HTTP网络编程
2
使用HttpClient
在有线互联网领域,基于HTTP的应用是最为广泛的,也就是我们所说的B/S 结构程序,即浏览器/服务器程序。随着移动互联网时代的来临,基于HTTP的 手机等移动终端的B/S结构应用会更加广泛。
Android HTTP网络编程
8
使用HttpClient
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,"utf-8"); httppost.setEntity(entity);
Android HTTP网络编程
7
使用HttpClient实现文件的上传下载方法
使⽤HttpClient实现⽂件的上传下载⽅法1 HTTPHTTP 协议可能是现在 Internet 上使⽤得最多、最重要的协议了,越来越多的 Java 应⽤程序需要直接通过 HTTP 协议来访问⽹络资源。
虽然在 JDK 的 包中已经提供了访问 HTTP 协议的基本功能,但是对于⼤部分应⽤程序来说,JDK 库本⾝提供的功能还不够丰富和灵活。
HttpClient ⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持HTTP 协议最新的版本和建议。
⼀般的情况下我们都是使⽤Chrome或者其他浏览器来访问⼀个WEB服务器,⽤来浏览页⾯查看信息或者提交⼀些数据、⽂件上传下载等等。
所访问的这些页⾯有的仅仅是⼀些普通的页⾯,有的需要⽤户登录后⽅可使⽤,或者需要认证以及是⼀些通过加密⽅式传输,例如HTTPS。
⽬前我们使⽤的浏览器处理这些情况都不会构成问题。
但是⼀旦我们有需求不通过浏览器来访问服务器的资源呢?那该怎么办呢?下⾯以本地客户端发起⽂件的上传、下载为例做个⼩Demo。
HttpClient有两种形式,⼀种是org.apache.http下的,⼀种是mons.httpclient.HttpClient。
2 ⽂件上传⽂件上传可以使⽤两种⽅式实现,⼀种是PostMethod⽅式,⼀种是HttpPost⽅式。
两者的处理⼤同⼩异。
PostMethod是使⽤FileBody将⽂件包装流包装起来,HttpPost是使⽤FilePart将⽂件流包装起来。
在传递⽂件流给服务端的时候,都可以同时传递其他的参数。
2.1 客户端处理2.1.1 PostMethod⽅式将⽂件封装到FilePart中,放⼊Part数组,同时,其他参数可以放⼊StringPart中,这⾥没有写,只是单纯的将参数以setParameter的⽅式进⾏设置。
此处的HttpClient是mons.httpclient.HttpClient。
HttpClient
1.1.4.1 Repeatable entities (可重复的 重复的实体) 实体)
一个实体可以是可重复的,这意味着它的内容可以被读取一次以上。这是唯一可能有自我包含的实体(像 ByteArrayEntity 或 StringEntity) 。
1.1.4.2 Using HTTP entities (使用 HTTP 实体) 实体)
由于一个实体即能表示二进制内容又能表示字符内容,它支持字符编码(支持后者,即:字符内容) 。 从 实 体 中 读 取 内 容 , 通 过 HttpEntity 的 getContent 方 法 可 以 取 回 输 入 流 , 并 返 回 一 个 java.io.InputStream,或者给 HttpEntity 的 writeTo(OutputStream) 方法提供一个输出流,它将一次性 返回所有的被写在流里的内容。 当实体已收到传入消息,HttpEntity#getContentType()和 HttpEntity#getContentLength()方 法可用于读取常见的元数据,例如内容类型和内容长度(如果可用) 。由于内容类型标题可以包含文本 MIME 类型的字符编码,像 text/plain 或者 text/html,HttpEntity#getContentEncoding()方法用来读取此 信息。如果标题不可用,返回的长度为-1,并返回内容类型为 NULL,如果内容类型标题可用,返回标题对 象。 当创建一个即将卸任的消息实体,此元数据必须由实体创建者提供。 StringEntity myEntity = new StringEntity("important message", "UTF-8"); System.out.println(myEntity.getContentType()); System.out.println(myEntity.getContentLength()); System.out.println(EntityUtils.getContentCharSet(myEntity)); System.out.println(EntityUtils.toString(myEntity)); System.out.println(EntityUtils.toByteArray(myEntity).length);
HTTPClient用法
HttpClient的用法HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过HTTP 协议来访问网络资源。
Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。
通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给 httpclient替你完成。
首先,我们必须安装好 HttpClient。
HttpClient 可以在/commons/httpclient/downloads.html下载.HttpClient 用到了 Apache Jakarta common 下的子项目 logging,你可以从这个地址/site/downloads /downloads_commons-logging.cgi下载到 common logging,从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中.HttpClient 用到了 Apache Jakarta common 下的子项目 codec,你可以从这个地址/site/downloads /downloads_commons-codec.cgi 下载到最新的 common codec,从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中1.读取网页(HTTP/HTTPS)内容下面是我们给出的一个简单的例子用来访问某个页面package http.demo;import java.io.IOException;import mons.httpclient.*;import mons.httpclient.methods.*;/*** 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面* @author Liudong*/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 HttpMethod method = new GetMethod("");//使用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实例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。
Android网络连接之HttpURLConnection和HttpClient
Android网络连接之HttpURLConnection和HttpClient1.概念HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。
在JDK 的 包中已经提供了访问HTTP协议的基本功能:HttpURLConnection。
但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
除此之外,在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持HTTP 协议工具包,并且它支持HTTP 协议最新的版本和建议。
使用HttpClient可以快速开发出功能强大的Http程序。
2.区别HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。
URLConnectionProxies and SOCKS Full support in Netscape browser, appletviewer, and applicat additional limitations from security policies.Authorization Full support for Basic Authorization in Netscape (can use in accesses outside of the applet); no support in appletviewer orMethods Only has GET and POST.Headers Currently you can only set any request headers if you are doing and the JDK you can't set any headers.Under Netscape 3.0 you can read headers only if the resource w header; if no Content-length header was returned, or under using the JDK no headers can be read.Automatic Redirection Handling Yes.Persistent Connections No support currently in JDK; under Netscape uses HTTP/1.0 K Pipelining of Requests No.Can handle protocols other than HTTP Theoretically; however only http is currently implemented.Can do HTTP over SSL (https)Under Netscape, yes. Using Appletviewer or in an application, Source code available No.3.案例URLConnectionString urlAddress = "http://192.168.1.102:8080/AndroidServer/login.do";URL url;HttpURLConnection uRLConnection;public UrlConnectionToServer(){}//向服务器发送get请求public String doGet(String username,String password){String getUrl = urlAddress + "?username="+username+"&password="+password;try {url = new URL(getUrl);uRLConnection = (HttpURLConnection)url.openConnection();InputStream is = uRLConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response +readLine;}is.close();br.close();uRLConnection.disconnect();return response;} catch (MalformedURLException e) {e.printStackTrace();return null;} catch (IOException e) {e.printStackTrace();return null;}}//向服务器发送post请求public String doPost(String username,String password){try {url = new URL(urlAddress);uRLConnection = (HttpURLConnection)url.openConnection();uRLConnection.setDoInput(true);uRLConnection.setDoOutput(true);uRLConnection.setRequestMethod("POST");uRLConnection.setUseCaches(false);uRLConnection.setInstanceFollowRedirects(false);uRLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");uRLConnection.connect();DataOutputStream out = new DataOutputStream(uRLConnection.getOutputStream());String content = "username="+username+"&password="+password;out.writeBytes(content);out.flush();out.close();InputStream is = uRLConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();uRLConnection.disconnect();return response;} catch (MalformedURLException e) {e.printStackTrace();return null;} catch (IOException e) {e.printStackTrace();return null;}}HTTPClientString urlAddress = "http://192.168.1.102:8080/qualityserver/login.do"; public HttpClientServer(){}public String doGet(String username,String password){String getUrl = urlAddress + "?username="+username+"&password="+password; HttpGet httpGet = new HttpGet(getUrl);HttpParams hp = httpGet.getParams();hp.getParameter("true");//hp. //httpGet.setp HttpClient hc = new DefaultHttpClient();try {HttpResponse ht = hc.execute(httpGet);if(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){HttpEntity he = ht.getEntity();InputStream is = he.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();//String str = EntityUtils.toString(he); System.out.println("========="+response);return response;}else{return "error";}} catch (ClientProtocolException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";} catch (IOException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";}}public String doPost(String username,String password){//String getUrl = urlAddress + "?username="+username+"&password="+password; HttpPost httpPost = new HttpPost(urlAddress);List params = new ArrayList();NameValuePair pair1 = new BasicNameValuePair("username", username);NameValuePair pair2 = new BasicNameValuePair("password", password);params.add(pair1);params.add(pair2);HttpEntity he;try {he = new UrlEncodedFormEntity(params, "gbk");httpPost.setEntity(he);} catch (UnsupportedEncodingException e1) {//TODO Auto-generated catch block e1.printStackTrace();}HttpClient hc = new DefaultHttpClient();try {HttpResponse ht = hc.execute(httpPost);//连接成功if(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){HttpEntity het = ht.getEntity();InputStream is = het.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();//String str = EntityUtils.toString(he); System.out.println("=========&&"+response);return response;}else{return "error";}} catch (ClientProtocolException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";} catch (IOException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";}}servlet端json转化:resp.setContentType("text/json");resp.setCharacterEncoding("UTF-8");toDo = new ToDo();List<UserBean> list = new ArrayList<UserBean>();list = toDo.queryUsers(mySession);String body;//设定JSON JSONArray array = new JSONArray();for(UserBean bean : list){JSONObject obj = new JSONObject();try{obj.put("username", bean.getUserName());obj.put("password", bean.getPassWord());}catch(Exception e){}array.add(obj);}pw.write(array.toString());System.out.println(array.toString());android端接收:String urlAddress = "http://192.168.1.102:8080/qualityserver/result.do";String body =getContent(urlAddress);JSONArray array = new JSONArray(body);for(int i=0;i<array.length();i++){obj = array.getJSONObject(i);sb.append("用户名:").append(obj.getString("username")).append("\t"); sb.append("密码:").append(obj.getString("password")).append("\n");HashMap<String, Object> map = new HashMap<String, Object>();try {userName = obj.getString("username");passWord = obj.getString("password");} catch (JSONException e) {e.printStackTrace();}map.put("username", userName);map.put("password", passWord);listItem.add(map);}} catch (Exception e) {//TODO Auto-generated catch block e.printStackTrace(); }if(sb!=null){showResult.setText("用户名和密码信息:");showResult.setTextSize(20);} elseextracted();//设置adapter SimpleAdapter simple = new SimpleAdapter(this,listItem,yout.simple_list_item_2,new String[]{"username","password"},new int[]{android.R.id.text1,android.R.id.text2});listResult.setAdapter(simple);listResult.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {int positionId = (int) (id+1);Toast.makeText(MainActivity.this, "ID:"+positionId, Toast.LENGTH_LONG).show();}});}private void extracted() {showResult.setText("没有有效的数据!");}//和服务器连接private String getContent(String url)throws Exception{ StringBuilder sb = new StringBuilder();HttpClient client =new DefaultHttpClient();HttpParams httpParams =client.getParams();HttpConnectionParams.setConnectionTimeout(httpParams, 3000);HttpConnectionParams.setSoTimeout(httpParams, 5000);HttpResponse response = client.execute(new HttpGet(url));HttpEntity entity =response.getEntity();if(entity !=null){BufferedReader reader = new BufferedReader(new InputStreamReader (entity.getContent(),"UTF-8"),8192);String line =null;while ((line= reader.readLine())!=null){sb.append(line +"\n");}reader.close();}return sb.toString();}分类: Android之网络编程。
黑马程序员安卓教程:使用 HttpClient 提交数据(一)
使用HttpClient提交数据(一)HttpClient 是Apache Jakarta Common 下的子项目,提供了高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP协议最新的版本。
HttpClient 被内置到Android SDK 中,因此可以在不添加任何额外jar 包情况下,直接使用。
1.3.1get 方式提交在1.2 节工程的基础上,只需要修改部分代码即可。
因此这里只给出核心代码。
【文件1-5】get方式提交数据代码片段1./**2.* HttpCLient使用get方式完成用户的登录3.*4.* @param view5.*/6.public void login3(View view){7.// 获取用户数据8.final String username= et_username.getText().toString().trim();119.final String password= et_password.getText().toString().trim();10.// 校验数据11.if (TextUtils.isEmpty(password) ||TextUtils.isEmpty(username)){12.Toast.makeText(this, "用户名或密码不能为空!",Toast.LENGTH_SHORT).show();13.return;14.}15.// 开启子线程16.new Thread(new Runnable(){17.18.@Override19.public void run() {20.String path=21."http://10.0.2.2:8080/userlogin/servlet/LoginServlet?username="22.+ URLEncoder.encode(username) +"&password=" +password;23.try{24. // 创建一个httpClient 对象25. HttpClient client = new DefaultHttpClient();26. // 创建一个请求方式27. HttpGet request = new HttpGet(path);28. // 执行操作29. HttpResponse response = client.execute(request);30. // 获取放回状态对象31. StatusLine statusLine = response.getStatusLine();32. // 获取状态码33. int statusCode =statusLine.getStatusCode();34. if (200 == statusCode) {35. // 获取服务器返回的对象36. HttpEntity entity = response.getEntity();37. // 获取输入流38. InputStream inputStream = entity.getContent();39. // 将输入流转化为字符串40. String data = StreamUtils.inputStream2String(inputStream);41. handler.obtainMessage(RESULT_OK, data).sendToTarget();42. } else {43. handler.obtainMessage(RESULT_CANCELED, statusCode).sendToTarget();44. }45.46.}catch (Exception e) {47. e.printStackTrace();48. handler.obtainMessage(RESULT_CANCELED, e).sendToTarget();50.}51.}).start();52.}。
【推荐下载】Android进阶(三)android httpClient 支持HTTPS的访问方式
Android 进阶(三)android httpClient 支持HTTPS 的访问方式2015/04/21 0 项目中Androidhttps 请求地址遇到了这个异常(无终端认证):javax.ssl.SSLPeerUnverifiedException:Nopeercertificate是SSL 协议中没有终端认证。
没有遇到过的问题,于是无奈的去找度娘。
,各种问题,各种纠结。
看了不少大神的博客后得到的解决方案如下:span > * Post 请求连接Https 服务* @param serverURL 请求地址* @param jsonStr 请求报文* @return * @throws Exception */ public static synchronized String doHttpsPost(String serverURL, String jsonStr)throws Exception { span > HttpParams httpParameters = new BasicHttpParams(); span > HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);span >HttpConnectionParams.setSoTimeout(httpParameters, 3000); span > HttpClient hc =initHttpClient(httpParameters); HttpPost post = new HttpPost(serverURL); span > post.addHeader( Content-Type , application/json;charset=utf-8 span >post.addHeader(Accept , application/json span > StringEntity entity = new StringEntity(jsonStr, UTF-8 post.setEntity(entity); post.setParams(httpParameters); HttpResponse response = null;try { response = hc.execute(post); } catch (UnknownHostException e) { throw new Exception( Unable to access + e.getLocalizedMessage()); } catch (SocketException e) {e.printStackTrace(); } int sCode = response.getStatusLine().getStatusCode(); if (sCode == HttpStatus.SC_OK) { return EntityUtils.toString(response.getEntity()); } else throw new Exception( StatusCode is + sCode); } private static HttpClient client = null; /** * 初始化HttpClient 对象* @param params * @return */ public static synchronized HttpClient initHttpClient(HttpParams params) { if(client == null){ try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());。
HttpClient组件及其在Android开发中的应用探讨
HttpClient组件及其在Android开发中的应用探讨HttpClient组件是用于发送HTTP请求的一个重要工具,早在2001年就已经由Apache开发团队推出,并成为了一个开源项目。
它提供了一个易用、高效的HTTP请求和响应操作API,使得开发者能够更加方便的实现HTTP通信。
在Android开发中,HttpClient组件同样也被广泛使用,包括HTTP GET和HTTP POST请求等,因此学会使用HttpClient组件对于Android开发者来说十分重要。
HttpClient的优点1.提供了一套简单易用的API,使得开发者能够更加方便的实现HTTP通信。
2.支持连接池和线程安全的多线程访问,能够有效的提高网络性能。
3.提供了更强大的HTTP请求和相应的处理能力,包括HTTP GET和HTTP POST请求等。
4.支持HTTPS协议的访问,保证了数据在传输过程中的安全性。
5.无需依赖第三方库,良好的移植性和灵活性。
HttpClient组件在Android中的应用在初学者看来,HttpClient组件在Android开发中似乎有些吓人,但实际上,它并不需要太高的技术水平便可以使用,只需掌握一些基本的技能即可。
下面我们将通过具体的实例探讨HttpClient组件在Android中的应用。
发送HTTP GET请求1.创建HttpClient对象HttpClient对象是用于发送HTTP请求的核心对象,我们首先需要创建一个HttpClient对象。
```HttpClient httpClient = new DefaultHttpClient();```2.创建HttpGet对象HttpGet对象是HTTP GET请求的封装类,我们需要创建一个HttpGet对象,并设置请求的URL地址。
```HttpGet httpGet = new HttpGet(url);```3.执行请求并接收响应我们需要发送请求并接收响应,HttpClient提供了HttpResponse类来封装HTTP响应结果。
HttpClient的基本使用
HttpClient的基本使用1. 引入HttpClient库:首先,需要将HttpClient库添加到项目的依赖中。
可以通过Maven或Gradle来添加依赖。
2. 创建HttpClient实例:接下来,需要创建一个HttpClient实例。
可以使用HttpClientBuilder类来构建实例。
````java```3. 创建Http请求:使用HttpGet、HttpPost等类来创建具体的Http请求对象。
可以设置请求的URL、请求头、请求体等信息。
````java```4. 执行Http请求:使用HttpClient实例来执行Http请求。
可以调用execute方法来发送请求,并获取响应对象。
````java```5. 处理Http响应:通过HttpResponse对象可以获取响应的状态码、响应头、响应体等信息。
````java```6. 释放资源:在完成所有的Http请求和响应处理后,需要释放相关的资源,如关闭HttpClient实例。
````java```除了基本的使用方法,HttpClient还提供了一些高级功能,例如:-设置请求超时时间:可以通过设置连接超时时间和读取超时时间来控制请求的超时行为。
````javaRequestConfig requestConfig = RequestConfig.custom.setConnectTimeout(5000) // 设置连接超时时间为5秒.setSocketTimeout(5000) // 设置读取超时时间为5秒.build(;```-设置请求头:可以通过设置请求头来发送特定的HTTP头部信息。
````java```- 发送POST请求:可以使用HttpPost类来发送POST请求,并设置请求体的内容。
````javaStringEntity requestEntity = new StringEntity("request body");```- Cookie管理:HttpClient可以自动处理和管理Cookie,可以通过CookieStore接口来获取和设置Cookie。
黑马程序员安卓教程:httpClient提交数据到服务端简述
httpClient提交数据到服务端简述Android应用访问Internet上的资源是很常见的需求,我们一般是通过Http协议来访问网络资源。
在JDK的. HttpURLConnection类中包含了一系列访问网络的API,我们在之前的文档中已详细讲述;为了简化访问网络资源的方法,Apache开源组织提供了一个HttpClient项目,看它的名称就知道,它是一个简单的HTTP客户端(可以理解为浏览器但并不是浏览器),可以用于发送HTTP请求,接收HTTP响应。
下面就这两种不同访问网络资源方式的总结,具体参考下表1-1:HttpURLConnection HttpClient发布者Sun公司Apache组织支持协议Http协议Http协议请求方式Get/Post Get/Post访问过程 1.指定URL路径(拼接参数或不拼接参数)2.建立网络数据连接:HttpUrlConnection3.设置请求方式:get/post4.指定相关参数5.写数据到服务端(若为post请求)6.获取状态码7.接收服务端返回数据1.创建HttpClient对象2.创建请求方式对象,HttpGet对象或HttpPost对象3.传参数,setParams方法(setEntity也可传参,前提是该请求方式是post)4.发送请求,返回HttpResponse5.调用HttpResponse相应的方法,获取返回头,返回码,以及返回内容。
常用的方法Int getResponsed()void setRequestMethod()setRequestProperty()new DefaultHttpClient通过默认实现类返回一个HttpClient实体new HttpGet或new HttpPost包装请求execute()发送请求类型抽象类接口表1-1所示。
Android-25_网络通信(2)—HttpClient
第25讲网络通信(2)—HttpClient一、HttpClient为了更好的处理向web站点的请求,包括处理Session、Cookie等细节问题,Apache开源组织提供了一个HttpClient项目(HttpClient就是一个增强版本的HttpURLConnection),扩展了HttpURLConnection的功能,Android将这个HttpClient所在的包集成了进来,较之HttpURLConnection,采用HttpClient发送请求,接收响应更为简单。
例:修改上面的Android客户端程序,采用HttpClient来发送GET和POST请求。
先创建一个能将InputStream转换成一个字节数组的工具类:public class StreamUtil {public static byte[] convertStreamToByte(InputStream in){ ByteArrayOutputStream baos = new ByteArrayOutputStream();byte [] buffer = new byte[1024];int len =0;try {while((len=in.read(buffer))!=-1){baos.write(buffer,0,len);}byte [] result = baos.toByteArray();return result;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}(1)发送GET请求public int login_HttpClient_Get(String username ,String password){ String baseURL ="http://192.168.101.62:8080/LoginDemoServer/servlet/LoginServlet";String path = baseURL+"?username="+username+"&password="+password;try {HttpClient client = new DefaultHttpClient(); //创建一个浏览器的客户端HttpGet httpGet = new HttpGet(path); //创建一个请求对象HttpResponse httpResponse = client.execute(httpGet); //将请求发送出去if(httpResponse.getStatusLine().getStatusCode()==200){Log.i("test", "网络连接成功,采用HttpClient的get请求");//进一步判断,返回回来的字符串是InputStream in =httpResponse.getEntity().getContent(); //得到服务器响应的输入流byte buffer[] = StreamUtil.convertStreamToByte(in);String result = new String(buffer).trim(); //.trim()去掉字符串前后空格换行等无用的字符Log.i("test", result+"--------------");if(result.equals("success")){Log.i("test", "登陆成功");return LOGINSUCCESS;}else{Log.i("test", "用户名密码错误");return LOGINFAILURE;}}else{//连接失败Log.i("test", "网络连接失败");return NETFAILURE;}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return 0;}(2)发送Post请求public int login_HttpClient_Post(String username ,String password){ String baseURL ="http://192.168.101.62:8080/LoginDemoServer/servlet/LoginServlet";HttpClient client = new DefaultHttpClient(); //创建一个浏览器的客户端HttpPost httpPost = new HttpPost(baseURL);try {username=new String(username.getBytes("utf8"),"iso8859-1");password=new String(password.getBytes("utf8"),"iso8859-1");} catch (UnsupportedEncodingException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}if(httpResponse.getStatusLine().getStatusCode()==200){Log.i("test", "网络连接成功,采用HttpClient的post请求");InputStream in =httpResponse.getEntity().getContent(); //得到服务器响应的输入流byte buffer[] = StreamUtil.convertStreamToByte(in);String result = new String(buffer).trim(); //.trim()去掉字符串前后空格换行等无用的字符Log.i("test", result+"--------------");if(result.equals("success")){Log.i("test", "登陆成功");return LOGINSUCCESS;}else{Log.i("test", "用户名密码错误");return LOGINFAILURE;}}else{//连接失败Log.i("test", "网络连接失败");return NETFAILURE;}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return 0;}二、数据提交的乱码处理---使用HttpClient(1)Post请求:发送时:在Android端,先将需要发送的文字:username=new String(username.getBytes("utf8"),"iso8859-1");values.add(new BasicNameValuePair("username",username)); //将转码后的字符串加入到Post 请求的参数中去。
HttpClient的用法
HttpClient的用法HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。
Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。
通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给 httpclient替你完成。
首先,我们必须安装好 HttpClient。
HttpClient 可以在/commons/httpclient/downloads.html下载.HttpClient 用到了 Apache Jakarta common 下的子项目 logging,你可以从这个地址/site/downloads /downloads_commons-logging.cgi下载到common logging,从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中.HttpClient 用到了 Apache Jakarta common 下的子项目 codec,你可以从这个地址/site/downloads /downloads_commons-codec.cgi 下载到最新的 common codec,从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中1.读取网页(HTTP/HTTPS)内容下面是我们给出的一个简单的例子用来访问某个页面package http.demo;import java.io.IOException;import mons.httpclient.*;import mons.httpclient.methods.*;/*** 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面* @author Liudong*/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换成httpsHttpMethod method = new GetMethod("");//使用POST方法//HttpMethod method = new Post Method("");client.executeMethod(method);//打印服务器返回的状态System.out.println(method.getStatusLine());//打印返回的信息System.out.println(method.getResponseBodyAsString());//释放连接method.releaseConnection();}}在这个例子中首先创建一个HTTP客户端(HttpClient)的实例,然后选择提交的方法是GET或者 POST,最后在HttpClient实例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。
Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get。。。
Android系列之⽹络(⼀)----使⽤HttpClient发送HTTP请求(通过get。
【声明】欢迎转载,但请保留⽂章原始出处→_→【系列】Android系列之⽹络:(持续更新)【正⽂】⼀、HTTP协议初探:HTTP(Hypertext Transfer Protocol)中⽂ “超⽂本传输协议”,是⼀种为分布式,合作式,多媒体信息系统服务,⾯向应⽤层的协议,是Internet上⽬前使⽤最⼴泛的应⽤层协议,它基于传输层的TCP协议进⾏通信,HTTP协议是通⽤的、⽆状态的协议。
这⼏个名词有⼀种通俗的解释:通讯协议:双⽅对话的标准通⽤的:⽤了都说好,谁⽤谁知道⽆状态的:翻脸不认⼈超⽂本:除了⽂本,还可以是⾳频、视频HTTP协议与Android开发之间的关系:HTTP协议的学习重点:Http协议基础概念、请求响应模型、提交请求的不同⽅法、响应状态判断、获取响应以及解析响应、数据下载的实现⽅法、数据上传的实现⽅法、请求头详细内容、响应头详细内容等关于http协议的学习,推荐两个链接:⼆、http协议概念:1、http协议定义:WWW是以Internet作为传输媒介的⼀个应⽤系统,WWW⽹上基本的传输单位是Web⽹页。
WWW的⼯作是基于客户机/服务器计算模型,由Web浏览器和Web服务器构成,两者之间采⽤超⽂本传输协议HTTP进⾏通信。
HTTP协议时基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应⽤层的协议,是通⽤的、⽆状态的⾯向对象的协议。
如果要实现⽹络互联我们要思考两个需要解决的技术问题:第⼀:浏览器和服务器是通过什么来连接的。
第⼆:这种连接⽅式是怎么实现的。
通过Internet去发送到服务器当中,⽽Internet内部可以通过三种⽅式来实现发送信息和数据:第⼀种:HTTP协议,也是在⼯作中最常⽤的,是建⽴在TCP/IP基础上实现的。
第⼆种:FTP协议第三种:TCP/IP协议,它也是最底层的协议,其它的⽅式必须是要通过它,但是要想实现这种协议必须要实现socket编程,这种⽅法是⽤来上传⼀些⽐较⼤的⽂件,视频,进⾏断点续传的操作。
HttpClient 4.3教程(转载)
HttpClient提供URIBuilder工具类来简化URIs的创建和修改过程。
1. URI uri = new URIBuilder()2. .setScheme("http")3. .setHost("")4. .setPath("/search")5. .setParameter("q", "httpclient")6. .setParameter("btnG", "Google Search")7. .setParameter("aq", "f")8. .setParameter("oq", "")9. .build();10. HttpGet httpget = new HttpGet(uri);11. System.out.println(httpget.getURI());上述代码会在控制台输出:1. /search?q=httpclient&btnG=Google+Search&aq=f&oq=1.1.2. HTTP响应服务器收到客户端的http请求后,就会对其进行解析,然后把响应发给客户端,这个响应就是HTTP response.HTTP响应第一行是协议版本,之后是数字状态码和相关联的文本段。
1. HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,2. HttpStatus.SC_OK, "OK");3.4. System.out.println(response.getProtocolVersion());5. System.out.println(response.getStatusLine().getStatusCode());6. System.out.println(response.getStatusLine().getReasonPhrase());7. System.out.println(response.getStatusLine().toString());上述代码会在控制台输出:1. HTTP/1.12. 2003. OK4. HTTP/1.1 200 OK1.1.3. 消息头一个Http消息可以包含一系列的消息头,用来对http消息进行描述,比如消息长度,消息类型等等。
HttpClient总结
HttpClient总结1、HttpClient的功能基于标准,纯正java,实现了http1.0和1.1。
在一个可扩展的OO框架内,实现了HTTP的全部方法(GET, POST,PUT, DELETE, HEAD, OPTIONS, and TRACE)支持HTTPS(ssl上的HTTP)的加密操作透明地穿过HTTP代理建立连接通过CONNECT方法,利用通过建立穿过HTTP代理的HTTPS连接利用本地Java socket,透明地穿过SOCKS(版本5和4)代理建立连接支持利用Basic、Digest和NTLM加密的认证支持用于上传大文件的Multi-Part表单POST方法插件式安全socket实现,易于使用第三方的解决方案连接管理,支持多线程应用,支持设定单个主机总连接和最高连接数量,自动检测和关闭失效连接直接将请求信息流送到服务器的端口直接读取从服务器的端口送出的应答信息支持HTTP/1.0中用KeepAlive和HTTP/1.1中用persistance设置的持久连接直接访问由服务器送出的应答代码和头部信息可设置连接超时时间HttpMethods 实现Command Pattern,以允许并行请求或高效连接复用遵循the Apache Software License协议,源码免费可得2、预备工作对jre1.3.*,如果要HttpClient支持https,则需要下载并安装jsse和jce.安装的步骤如下:1)下载jsse和jce.2)检查CLASSPATH中没有与jsse和jce相关的jar包3)将US_export_policy.jar、local_policy.jar、jsse.jar、jnet.jar、jce1_2_x.jar、sunjce_provider.jar、jcert.jar复制到目录:UNIX:$JDK_HOME/jre/lib/extWindows:%JDK_HOME%\jre\lib\ext4)修改下述目录下的java.security文件。
httpclient
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
if (locationHeader != null) {
//执行getMethod
int statusCode = client.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + getMethod.getStatusLine());
System.out.println(new String(responseBody));
下面是程序的完整代码,这些代码也可在附件中的test.GetSample中找到。
package test;
import java.io.IOException;
import mons.httpclient.*;
? 创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。
GetMethod getMethod = new GetMethod("/");
// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
【推荐下载】Android网络访问之HttpURLConnection和HttpClient
Android 网络访问之HttpURLConnection 和HttpClient 2015/05/23 4 Android 上发送HTTP 请求的一般有两种方式,HttpURLConnection 和HttpClient。
下面分别简述两种方式的用法。
1. HttpURLConnection1, 获取HttpURLConnection 的实例。
一般只需new 出一个URL 对象,并传入目标的网络地址,然后调用openConnection()方法即可。
如下所示:URL url = new URL(“baidu”);HttpURLConnection connection = (HttpURLConnection) url.openConnection();2, 设置HTTP 请求方法。
常用的方法有两个:GET 和POST。
GET 表示希望从服务器那里获取数据,而POST 则表示希望提交数据给服务器。
写法如下:connection.setRequestMethod(“GET”);3,其他设置,如设置连接超时、读取超时的毫秒数等。
可根据实际情况来写,例如:connection.setConnectTimeout(5000);// 设置连接超时为5000 毫秒connection.setReadTimeout(5000);4, 用getInputStream() 方法获取服务器返回的输入流,然后读取输入流。
代码如下所示:InputStream in = connection.getInputStream();5, 关闭HTTP 连接connection.disconnect();MainActivity 代码实现:public class MainActivity extends Activity implements OnClickListener { public static final int SHOW_RESPONSE = 0; private Button sendRequest; private TextView responseText; private Handler handler = new Handler() { public void handleMessage(Message msg) { switch(msg.what) { case SHOW_RESPONSE: Stringresponse = (String) msg.obj; // 在这里进行UI 操作,将结果显示到界面上responseText.setText(response); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_main); sendRequest = (Button) findViewById(R.id.send_request); responseText = (TextView)。
AndroidStudioOkHttpClient使用教程详解
AndroidStudioOkHttpClient使⽤教程详解本次来记录下OkHttpClient的使⽤,OkHttpClient是⽤来完成android 客户端对服务端请求的⼯具。
⾸先记住,使⽤⽹络的时候⼀定要加⼊权限,加⼊到AndroidMainfest.xml中<uses-permission android:name="android.permission.INTERNET" />在初次使⽤的时候会出现报错。
cannot resolve symbol OkHttpClient这⾥需要引⼊implementation 'com.squareup.okhttp3:okhttp:3.0.1'然后刷新下项⽬就可以了。
代码:package com.example.administrator.testclient;import com.squareup.*;import java.io.IOException;import okhttp3.FormBody;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class BaseHttpClient {public static final MediaType MEDIA_TYPE_MARKDOWN= MediaType.parse("text/x-markdown; charset=utf-8");// 01. 定义okhttpprivate final OkHttpClient client = new OkHttpClient();public BaseHttpClient(){//client.connectTimeoutMillis();}/*** 发送⼀个表单请求* @throws Exception*/public void SendForm() throws Exception {RequestBody formBody = new FormBody.Builder().add("search", "Jurassic Park").build();Request request = new Request.Builder().url("https:///w/index.php").post(formBody).build();Response response = client.newCall(request).execute();if (!response.isSuccessful())throw new IOException("Unexpected code " + response);System.out.println(response.body().string());}/**POST 请求* 发送⼀个string请求* @throws Exception*/public void SendPostString() throws Exception {String postBody = ""+ "Releases\n"+ "--------\n"+ "\n"+ " * _1.0_ May 6, 2013\n"+ " * _1.1_ June 15, 2013\n"+ " * _1.2_ August 11, 2013\n";Request request = new Request.Builder().url("https:///markdown/raw").post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody)).build();Response response = client.newCall(request).execute();if (!response.isSuccessful())throw new IOException("Unexpected code " + response);System.out.println(response.body().string());}/**POST 请求* 发送⼀个From请求* @throws Exception*/public void SendPostFrom() throws Exception {RequestBody body = new FormBody.Builder().add("name", "sy")//添加参数体.add("age", "18").build();Request request = new Request.Builder().post(body) //请求参数.url("http://123.207.70.54:8080/SpringMvc/hello").build();Response response = client.newCall(request).execute();if (!response.isSuccessful())throw new IOException("Unexpected code " + response);}/**Get请求* 发送⼀个From请求* @throws Exception*/public void SendGetFrom() throws Exception {Request request = new Request.Builder().get() //请求参数.url("http://123.207.70.54:8080/SpringMvc/hello").build();Response response = client.newCall(request).execute();if (!response.isSuccessful())throw new IOException("Unexpected code " + response);}}测试发现,上⾯的⽤不了,下⾯放⼀个测试通过的⽅法:public void getDatasyncFactory(){new Thread(new Runnable() {@Overridepublic void run() {try {OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象Request request = new Request.Builder().url("http://123.207.70.54:8080/SpringMvc/hello")//请求接⼝。
android中HttpClie...
android中HttpClie...android开始项目中,通常会遇到既使用HttpClient,又使用WebView的情况。
一个典型的例子是,使用HttpClient登录,WebView展示登录后的某些页面,这个时候,如果直接不加任何处理的话会发现在使用WebView展示的时候,会提示没有登录你的应用系统,造成这种结果的原因就是使用HttpClient登录的session和WebView访问服务器的session并不是同一个,解决办法如下。
HttpClient 登录代码如下DefaultHttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(url);HttpContext context = new BasicHttpContext();CookieStore cookieStore = new BasicCookieStore();context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);HttpResponse response = client.execute(get, context);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 根据你的逻辑,判断返回的值是不是表示已经登录成功if (isLoginSuccess()) {List cookies = cookieStore.getCookies();if (!cookies.isEmpty()) {for (int i = cookies.size(); i > 0; i --) {Cookie cookie = cookies.get(i - 1);if (cookie.getName().equalsIgnoreCase("jsessionid")) {// 使用一个常量来保存这个cookie,用于做session共享之用Utils.appCookie = cookie;}}}}}WebView代码WebView webView = ......String url4load = "登录域名下你要访问的地址";CookieSyncManager.createInstance(this);CookieManager cookieManager = CookieManager.getInstance();Cookie sessionCookie = Utils.appCookie;if (sessionCookie != null) {String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain();cookieManager.setCookie(url4Load, cookieString);CookieSyncManager.getInstance().sync();}webView.loadUrl(url4Load);。
android,6.0,httpclient解决方案
android,6.0,httpclient解决方案篇一:Android进阶学习-httpclient【Android进阶学习】Http编程之HttpClientXX-03-11 19:05:42标签:POST GET HttpClient 休闲 Android原创作品,许诺转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
不然将追究法律责任。
803097在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端。
它提供了对HTTP协议的全面支持,能够利用HttpClient的对象来执行HTTP GET 和HTTP POST挪用。
HTTP工作原理:1.客户端(一样是指阅读器,那个地址是指自己写的程序)与效劳器成立连接2.成立连接后,客户端向效劳器发送请求3.效劳器接收到请求后,向客户端发送响应信息4.客户端与效劳器断开连接HttpClient的一样利用步骤:1.利用DefaultHttpClient类实例化HttpClient对象2.创建HttpGet或HttpPost对象,将要请求的URL通过构造方式传入HttpGet或HttpPost对象。
3.挪用execute方式发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。
4.通过HttpResponse接口的getEntity方式返回响应信息,并进行相应的处置。
最跋文得要在文件添加网络权限下面是具体的例子:1.利用HttpClient来执行GET挪用在LogCat窗口就能够看到输出的信息1. package ;2.3. import ;4.5. import ;6. import ;7. import ;8. import ;9. import ;10.11. import ;12. import ;13. import ;14.15. public class HttpGetActivity extends Activity {16. String uri = "p> 17. final String TAG_STRING = "TAG";18. @Override19. public void onCreate(Bundle savedInstanceState) {(savedInstanceState);();22.{24. //取得HttpClient对象25. HttpClient getClient = new DefaultHttpClient();26. //取得HttpGet对象27. HttpGet request = new HttpGet(uri);28. //客户端利用GET方式执行请教,取得效劳器端的回应response29. HttpResponse response = (request);30. //判定请求是不是成功31. if(().getStatusCode()==_OK){32. (TAG_STRING, "请求效劳器端成功");33. //取得输入流34. InputStream inStrem = ().getContent();35. int result = ();36. while (result != -1){((char)result);= ();39. }40. //关闭输入流41. ();42. }else {43. (TAG_STRING, "请求效劳器端失败");44. }45.} catch (Exception e) {46. // TODO Auto-generated catch block47. ();48.}49. }50. }利用HTTP GET挪用有一个缺点确实是,请求的参数作为URL一部份来传递,以这种方式传递的时候,URL的长度应该在2048个字符之内。