zoukankan      html  css  js  c++  java
  • Android Http请求方法汇总

    [转]  原文

    这篇文章主要实现了在Android中使用JDK的HttpURLConnection和Apache的HttpClient访问网络资源,服务端采用python+flask编写,使用Servlet太麻烦了。关于Http协议的相关知识,可以在网上查看相关资料。代码比较简单,就不详细解释了。

    1. 使用JDK中HttpURLConnection访问网络资源

    (1)get请求

    public String executeHttpGet() { 		String result = null; 		URL url = null; 		HttpURLConnection connection = null; 		InputStreamReader in = null; 		try { 			url = new URL("http://10.0.2.2:8888/data/get/?token=alexzhou"); 			connection = (HttpURLConnection) url.openConnection(); 			in = new InputStreamReader(connection.getInputStream()); 			BufferedReader bufferedReader = new BufferedReader(in); 			StringBuffer strBuffer = new StringBuffer(); 			String line = null; 			while ((line = bufferedReader.readLine()) != null) { 				strBuffer.append(line); 			} 			result = strBuffer.toString(); 		} catch (Exception e) { 			e.printStackTrace(); 		} finally { 			if (connection != null) { 				connection.disconnect(); 			} 			if (in != null) { 				try { 					in.close(); 				} catch (IOException e) { 					e.printStackTrace(); 				} 			}  		} 		return result; 	}

    注意:因为是通过android模拟器访问本地pc服务端,所以不能使用localhost和127.0.0.1,使用127.0.0.1会访问模拟器自身。Android系统为实现通信将PC的IP设置为10.0.2.2

    (2)post请求

    public String executeHttpPost() { 		String result = null; 		URL url = null; 		HttpURLConnection connection = null; 		InputStreamReader in = null; 		try { 			url = new URL("http://10.0.2.2:8888/data/post/"); 			connection = (HttpURLConnection) url.openConnection(); 			connection.setDoInput(true); 			connection.setDoOutput(true); 			connection.setRequestMethod("POST"); 			connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 			connection.setRequestProperty("Charset", "utf-8"); 			DataOutputStream dop = new DataOutputStream( 					connection.getOutputStream()); 			dop.writeBytes("token=alexzhou"); 			dop.flush(); 			dop.close();  			in = new InputStreamReader(connection.getInputStream()); 			BufferedReader bufferedReader = new BufferedReader(in); 			StringBuffer strBuffer = new StringBuffer(); 			String line = null; 			while ((line = bufferedReader.readLine()) != null) { 				strBuffer.append(line); 			} 			result = strBuffer.toString(); 		} catch (Exception e) { 			e.printStackTrace(); 		} finally { 			if (connection != null) { 				connection.disconnect(); 			} 			if (in != null) { 				try { 					in.close(); 				} catch (IOException e) { 					e.printStackTrace(); 				} 			}  		} 		return result; 	}

    如果参数中有中文的话,可以使用下面的方式进行编码解码:

    URLEncoder.encode("测试","utf-8") URLDecoder.decode("测试","utf-8");

    2.使用Apache的HttpClient访问网络资源
    (1)get请求

    public String executeGet() { 		String result = null; 		BufferedReader reader = null; 		try { 			HttpClient client = new DefaultHttpClient(); 			HttpGet request = new HttpGet(); 			request.setURI(new URI( 					"http://10.0.2.2:8888/data/get/?token=alexzhou")); 			HttpResponse response = client.execute(request); 			reader = new BufferedReader(new InputStreamReader(response 					.getEntity().getContent()));  			StringBuffer strBuffer = new StringBuffer(""); 			String line = null; 			while ((line = reader.readLine()) != null) { 				strBuffer.append(line); 			} 			result = strBuffer.toString();  		} catch (Exception e) { 			e.printStackTrace(); 		} finally { 			if (reader != null) { 				try { 					reader.close(); 					reader = null; 				} catch (IOException e) { 					e.printStackTrace(); 				} 			} 		}  		return result; 	}

    (2)post请求

    public String executePost() { 		String result = null; 		BufferedReader reader = null; 		try { 			HttpClient client = new DefaultHttpClient(); 			HttpPost request = new HttpPost(); 			request.setURI(new URI("http://10.0.2.2:8888/data/post/")); 			List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 			postParameters.add(new BasicNameValuePair("token", "alexzhou")); 			UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity( 					postParameters); 			request.setEntity(formEntity);  			HttpResponse response = client.execute(request); 			reader = new BufferedReader(new InputStreamReader(response 					.getEntity().getContent()));  			StringBuffer strBuffer = new StringBuffer(""); 			String line = null; 			while ((line = reader.readLine()) != null) { 				strBuffer.append(line); 			} 			result = strBuffer.toString();  		} catch (Exception e) { 			e.printStackTrace(); 		} finally { 			if (reader != null) { 				try { 					reader.close(); 					reader = null; 				} catch (IOException e) { 					e.printStackTrace(); 				} 			} 		}  		return result; 	}

    3.服务端代码实现
    上面是采用两种方式的get和post请求的代码,下面来实现服务端的代码编写,使用python+flask真的非常的简单,就一个文件,前提是你得搭建好python+flask的环境,代码如下:

    #coding=utf-8  import json from flask import Flask,request,render_template  app = Flask(__name__)  def send_ok_json(data=None):     if not data:         data = {}     ok_json = {'ok':True,'reason':'','data':data}     return json.dumps(ok_json)  @app.route('/data/get/',methods=['GET']) def data_get():     token = request.args.get('token')     ret = '%s**%s' %(token,'get')     return send_ok_json(ret)  @app.route('/data/post/',methods=['POST']) def data_post():     token = request.form.get('token')     ret = '%s**%s' %(token,'post')     return send_ok_json(ret)  if __name__ == "__main__":     app.run(host="localhost",port=8888,debug=True)

    运行服务器,如图:

    4. 编写单元测试代码
    右击项目:new–》Source Folder取名tests,包名是:com.alexzhou.androidhttp.test(随便取,没有要求),结构如图:


    在该包下创建测试类HttpTest,继承自AndroidTestCase。编写这四种方式的测试方法,代码如下:

    public class HttpTest extends AndroidTestCase {  	@Override 	protected void setUp() throws Exception { 		Log.e("HttpTest", "setUp"); 	}  	@Override 	protected void tearDown() throws Exception { 		Log.e("HttpTest", "tearDown"); 	}  	public void testExecuteGet() { 		Log.e("HttpTest", "testExecuteGet"); 		HttpClientTest client = HttpClientTest.getInstance(); 		String result = client.executeGet(); 		Log.e("HttpTest", result); 	}  	public void testExecutePost() { 		Log.e("HttpTest", "testExecutePost"); 		HttpClientTest client = HttpClientTest.getInstance(); 		String result = client.executePost(); 		Log.e("HttpTest", result); 	}  	public void testExecuteHttpGet() { 		Log.e("HttpTest", "testExecuteHttpGet"); 		HttpClientTest client = HttpClientTest.getInstance(); 		String result = client.executeHttpGet(); 		Log.e("HttpTest", result); 	}  	public void testExecuteHttpPost() { 		Log.e("HttpTest", "testExecuteHttpPost"); 		HttpClientTest client = HttpClientTest.getInstance(); 		String result = client.executeHttpPost(); 		Log.e("HttpTest", result); 	} }

    附上HttpClientTest.java的其他代码:

    public class HttpClientTest {  	private static final Object mSyncObject = new Object(); 	private static HttpClientTest mInstance;  	private HttpClientTest() {  	}  	public static HttpClientTest getInstance() { 		synchronized (mSyncObject) { 			if (mInstance != null) { 				return mInstance; 			} 			mInstance = new HttpClientTest(); 		} 		return mInstance; 	}    /**...上面的四个方法...*/ }

    现在还需要修改Android项目的配置文件AndroidManifest.xml,添加网络访问权限和单元测试的配置,AndroidManifest.xml配置文件的全部代码如下:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="com.alexzhou.androidhttp"     android:versionCode="1"     android:versionName="1.0" >      <uses-permission android:name="android.permission.INTERNET" />      <uses-sdk         android:minSdkVersion="8"         android:targetSdkVersion="15" />      <application         android:icon="@drawable/ic_launcher"         android:label="@string/app_name"         android:theme="@style/AppTheme" >         <uses-library android:name="android.test.runner" />          <activity             android:name=".MainActivity"             android:label="@string/title_activity_main" >             <intent-filter>                 <action android:name="android.intent.action.MAIN" />                  <category android:name="android.intent.category.LAUNCHER" />             </intent-filter>         </activity>     </application>      <instrumentation         android:name="android.test.InstrumentationTestRunner"         android:targetPackage="com.alexzhou.androidhttp" />  </manifest>

    注意:
    android:name=”android.test.InstrumentationTestRunner”这部分不用更改
    android:targetPackage=”com.alexzhou.androidhttp”,填写应用程序的包名

    5.测试结果
    展开测试类HttpTest,依次选中这四个测试方法,右击:Run As–》Android Junit Test。
    (1)运行testExecuteHttpGet,结果如图:
    (2)运行testExecuteHttpPost,结果如图:
    (3)运行testExecuteGet,结果如图:
    (4)运行testExecutePost,结果如图:

  • 相关阅读:
    Windows Azure Cloud Service (14) 使用Windows Azure诊断收集日志记录数据
    Windows Azure Cloud Service (13) 用Visual Studio 2010 将应用程序部署到Windows Azure平台
    Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session
    Windows Azure Storage (5) Windows Azure Drive
    Windows Azure Storage (7) 使用工具管理Windows Azure Storage
    SQL Azure(二) SQL Azure vs SQL Server
    webbrowser的自动提交
    提取视频的背景声音的软件
    Listview列排序的bug原因
    两个奇怪的问题
  • 原文地址:https://www.cnblogs.com/wxmdevelop/p/6043053.html
Copyright © 2011-2022 走看看