• android 请求网络 和 httpclient的使用上传下载


    访问网络最主要的也就是 http协议了。

    http协议很简单,但是很重要。

    直接上代码了,里面都是1个代码块 代码块的,用哪一部分直接拷出去用就好了。


    1.访问网络用 get 和 post  自己组拼提交参数 ,httpclient 方式提交

    2.上传 和 下载 

    3.比如访问服务器后 返回来的 xml 和 json 的简单解析方法

    String  path = "http://192.168.13.1";
    	String  username ="ll";
    	String  pwd="123";
    	
    	/**   get 组拼    */
    	public void  httpGet()
    			throws Exception {
    	
    		String param1 = URLEncoder.encode(username);
    		String param2 = URLEncoder.encode(pwd);
    		URL url = new URL(path + "?name=" + param1 + "&password=" + param2);
    		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    		conn.setRequestMethod("GET");
    		conn.setReadTimeout(5000);
    		// 数据并没有发送给服务器
    		// 获取服务器返回的流信息
    		InputStream in = conn.getInputStream();
    		byte[] result = StreamTool.getBytes(in);
    
    		//return new String(result);
    	}
    	
    	
    	
    	/** post  组拼   */
    	public  void  httpPost() throws Exception {
    	
    		URL url = new URL(path);
    		String param1 = URLEncoder.encode(username);
    		String param2 = URLEncoder.encode(pwd);
    		//开始连接
    		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    		String data = "username=" + param1 + "&password=" + param2;
    		//设置方式 post
    		conn.setRequestMethod("POST");
    		//timeout  5000
    		conn.setConnectTimeout(5000);
    		// 设置 http协议可以向服务器写数据
    		conn.setDoOutput(true);
    		// 设置http协议的消息头
    		conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    		conn.setRequestProperty("Content-Length",  String.valueOf(data.length()));
    		// 把我们准备好的data数据写给服务器
    		OutputStream os = conn.getOutputStream();
    		os.write(data.getBytes());
    		// httpurlconnection 底层实现 outputstream 是一个缓冲输出流
    		// 只要我们获取任何一个服务器返回的信息 , 数据就会被提交给服务器 , 得到服务器返回的流信息
    		int code = conn.getResponseCode();
    		if (code == 200) {
    			InputStream is = conn.getInputStream();
    			byte[] result = StreamTool.getBytes(is);
    			String ss= new String(result);
    		}
    		
    	}
    	
    	
    	/**   httpclient  get   */
    	public void httpClentGet () throws Exception{
    		//获取到一个浏览器的实例 
    		HttpClient client = new DefaultHttpClient();
    		//准备请求的地址 
    		String param1 = URLEncoder.encode(username);
    		String param2 = URLEncoder.encode(pwd);
    		HttpGet httpGet = new HttpGet(path + "?name=" + param1 + "&password=" + param2);
    		//敲回车 发请求 
    		HttpResponse  ressponse = client.execute(httpGet);
    		int code = ressponse.getStatusLine().getStatusCode();
    		if( code ==  200){
    			InputStream is  =ressponse.getEntity().getContent();
    			//byte[] result = StreamTool.getBytes(is);
    			
    		}
    
    	}
    	
    	
    	//	不需要的时候关闭 httpclient   client.getConnectionManager().shutdown();
    	/**    httpclient  post **/
    	public  void httpClentPost() throws Exception{	
    		//1. 获取到一个浏览器的实例 
    		HttpClient client = new DefaultHttpClient();
    		HttpPost httppost = new HttpPost(path);
    		// 键值对  BasicNameValuePair
    		List<NameValuePair> parameters = new ArrayList<NameValuePair>();
    		parameters.add(new BasicNameValuePair("username", username));
    		parameters.add(new BasicNameValuePair("pwd", pwd));
    		UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8");
    		//3.设置post请求的数据实体 
    		httppost.setEntity(entity);
    		//4. 发送数据给服务器
    		HttpResponse  ressponse = client.execute(httppost);
    		int code = ressponse.getStatusLine().getStatusCode();
    		if(code == 200){
    			InputStream is  =ressponse.getEntity().getContent();
    			byte[] result = StreamTool.getBytes(is);
    			
    			//return new String(result);
    		}
    		
    	}
    	
    	
    	/*** 下载一个东西    ***/
    	public void getFileData(Context context){
    				
    		try {
    		     HttpClient client = new DefaultHttpClient();
    		     HttpGet httpGet = new HttpGet(path);
    			 //执行
    			 HttpResponse  ressponse = client.execute(httpGet);
    			 int code = ressponse.getStatusLine().getStatusCode();
    				
    			 
    			      if(code == HttpStatus.SC_OK){
    						InputStream in =ressponse.getEntity().getContent();
    						//图片 
    //						Bitmap bitmap = BitmapFactory.decodeStream(in);
    //						in.close();
    						
    						//文件什么的比如读取了是要写在本地的
    						//小文件直接读取   大文件读取一点写一点
    						//byte[] result = StreamTool.getBytes(in);
    						//
    						
    						 //这里可以得到文件的类型 如image/jpg /zip /tiff 等等 但是发现并不是十分有效,有时明明后缀是.rar但是取到的是null,这点特别说明
                            System.out.println(ressponse.getEntity().getContentType());
                            //可以判断是否是文件数据流
                            System.out.println(ressponse.getEntity().isStreaming());
                            //设置本地保存的文件
                            //File storeFile = new File("c:/0431la.zip");  
                            String path="sdcard/aa.txt";
                            FileOutputStream output = context.openFileOutput(path, context.MODE_PRIVATE);
                            //得到网络资源并写入文件
                            InputStream input = ressponse.getEntity().getContent();
                            byte b[] = new byte[1024];
                            int j = 0;
                            while( (j = input.read(b))!=-1){
                                 output.write(b,0,j);
                            }
                            output.flush();
                            output.close(); 
    				     }	
    		} catch (Exception e) {
    			// TODO: handle exception
    		}				
    	}
    	
    	
    	/**
    	 * 提交数据给服务器 带一个文件 
    	 * @param filepath 文件在手机上的路径 
    	 */
    	public void PostData(String filepath) throws Exception{
    		
    		// 实例化上传数据的 数组  part [] username  pwd
    		Part[] parts = {
    				  new StringPart("username", username), 
    				  new StringPart("pwd", pwd), 
    				  new FilePart("file", new File(filepath))
    				  };
    		
    		PostMethod file_Post = new PostMethod(path);
    	    //                              多种类型的数据实体
    		file_Post.setRequestEntity(new MultipartRequestEntity(parts, file_Post.getParams()));
    		//创建 client
    		org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
            //timeout
    		client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
    		//执行
    		int status = client.executeMethod(file_Post);
    		
    		if(status==200){
    			
    		
    
    		}
    
    	}
    	
    	
    	//传送文件
    	public void setFile() throws Exception{
    
    		 HttpClient httpclient = new DefaultHttpClient();   
    	     HttpPost httppost = new HttpPost("http://192.168.1.1");   
    	     File file = new File(path);   
    	     InputStreamEntity reqEntity = new InputStreamEntity(   
    	             new FileInputStream(file), -1);   
    	     reqEntity.setContentType("binary/octet-stream");   
    	     reqEntity.setChunked(true);   
    	 
    	     // FileEntity entity = new FileEntity(file, "binary/octet-stream");   
    	     httppost.setEntity(reqEntity);   
    	     System.out.println("executing request " + httppost.getRequestLine());   
    	     HttpResponse response = httpclient.execute(httppost); 
    		
             if(response.getStatusLine().getStatusCode() == 200){
            	 
            	 
             }
    		
    	}
    	
    	
    	
    	
    	/** 1.
    	 *  一般访问了就会返回来1个  webservice
    	 *  pull解析访问webservice 返回来的xml
    	 *   **/
    	
    	public void  pullJX(byte[]  bb)  throws Exception{
    		// byte[] bb = EntityUtils.toByteArray(response.getEntity());
    		 XmlPullParser pullParser = Xml.newPullParser();
    		 pullParser.setInput(new ByteArrayInputStream(bb), "UTF-8");
    		 int event = pullParser.getEventType();   
    	     List<Object> info;
    		 while(event != XmlPullParser.END_DOCUMENT){
    			      switch (event) {
    					   case XmlPullParser.START_DOCUMENT:
    						info = new ArrayList<Object>();
    						break;
    						
    					   case XmlPullParser.START_TAG:								
    						if("aa".equals(pullParser.getName())){
    							String id = pullParser.nextText().toString();
    
    						}
    						break;
    						
    					   case XmlPullParser.END_TAG:
    						  if("aa".equals(pullParser.getName())){								 
    						 }
    				      break;
    			      }
    			event = pullParser.next();
    		  }
    	}
    	
    
    	/**2.
    	 *  解析 json  数据 [{id:"001",name:"lilei",age:"20"},{id:"002",name:"zhangjia",age:"30"}]	
    	 */
    	private static List parseJSON(InputStream  in) throws Exception{
    		byte[] data = StreamTool.getBytes(in);
    		String s =new String(data);
    		// 转换成  json 数组对象   [{"001","ll","20"},{"002","zj","30"},]
    		JSONArray json = new JSONArray(s);
    			for (int i = 0; i < json.length() ; i++) {
    				  JSONObject j = json.getJSONObject(i);
    			      String aa1 = j.getString("id");
    			      String aa2 = j.getString("name");
    			      String aa3 = j.getString("age");
    			}
    		  return  null;
    	   }
    	


    HttpClient其实是一个interface类型,HttpClient封装了对象需要执行的Http请求、身份验证、连接管理和其它特性

    HttpClient有三个已知的实现类分别是:

    AbstractHttpClient, AndroidHttpClient, DefaultHttpClient

     AndroidHttpClient是对HttpClient的包装,内部带访问连接器,并设置为可以多线程使用,


    public class MyApplication extends Application{
    
    	 private AndroidHttpClient httpClient;
       
          //  application oncreate的时候创建
          public void onCreate(){
              super.onCreate();
              httpClient =  AndroidHttpClient.newInstance("Android");
          }
     
        
          //供外部调用
          public AndroidHttpClient getHttpClient() {
            if (httpClient == null){
        	   httpClient = AndroidHttpClient.newInstance("Android");
            }
            return httpClient;
          }
    
    	  @Override
    	  public void onLowMemory() {
    	    super.onLowMemory();
    	    shutdownHttpClient();
    	  }
    
    	  @Override
    	  public void onTerminate() {
    	    super.onTerminate();
    	    shutdownHttpClient();
    	  }
    	  
          //关闭
    	  private void shutdownHttpClient() {
    	    if (httpClient != null) {
    	      if (httpClient.getConnectionManager() != null) {
    	        httpClient.getConnectionManager().shutdown();
    	      }
    	      httpClient.close();
    	      httpClient = null;
    	    }
    	  }
    	  
    }


    外部调用的话

    AndroidHttpClient httpClient = ((MyApplication)getApplication()).getHttpClient();  




  • 相关阅读:
    python 3.5.2安装mysql驱动报错
    mysql创建用户
    Centos7 修改SSH 端口
    centos 7 升级后yum install出现Exiting on user cancel
    centos7 systemctl 启动 Redis 失败
    redis 异常解决办法
    用普通用户通过sudo进行启动tomcat时报如下异常
    svn迁移到git仓库并保留commit历史记录
    CentOS更新yum源
    django 添加comments app
  • 原文地址:https://www.cnblogs.com/riasky/p/3464808.html
Copyright © 2020-2023  润新知