Android Http請求方法匯總

jopen 12年前發布 | 182K 次閱讀 Android Android開發 移動開發

這篇文章主要實現了在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("

    }
    return result;
}</pre> <p>注意:因為是通過android模擬器訪問本地pc服務端,所以不能使用localhost和127.0.0.1,使用127.0.0.1會訪問模擬器自身。Android系統為實現通信將PC的IP設置為10.0.2.2</p>

(2)post請求

public String executeHttpPost() {
        String result = null;
        URL url = null;
        HttpURLConnection connection = null;
        InputStreamReader in = null;
        try {
            url = new URL("

        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;
}</pre> <p>如果參數中有中文的話,可以使用下面的方式進行編碼解碼:</p>

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(
                    "

        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;
}</pre> <p>(2)post請求</p>

public String executePost() {
        String result = null;
        BufferedReader reader = null;
        try {
            HttpClient client = new DefaultHttpClient();
            HttpPost request = new HttpPost();
            request.setURI(new URI("

        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;
}</pre> <p>3.服務端代碼實現<br />

上面是采用兩種方式的get和post請求的代碼,下面來實現服務端的代碼編寫,使用python+flask真的非常的簡單,就一個文件,前提是你得搭建好python+flask的環境,代碼如下:</p>

#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)</pre>

運行服務器,如圖:

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);
}

}</pre>

附上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;
}

/*...上面的四個方法.../ }</pre>

現在還需要修改Android項目的配置文件AndroidManifest.xml,添加網絡訪問權限和單元測試的配置,AndroidManifest.xml配置文件的全部代碼如下:

<manifest xmlns:android="

<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></pre>

注意:
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,結果如圖:

轉載請注明來自:
Alex Zhou,本文鏈接:http://codingnow.cn/android/723.html</span></span></span></span></span>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!