2014年3月19日

【Android】Server API網路串接傳輸HttpGet與HttpPost的運用

各位Android安卓開發者大家好 ^^

今天小黑人要跟大家分享的是"網路API串接",然而網路ServerAPI串接傳輸方式有兩種,第一種是屬於Get方式-運用HttpGet帶入網址即可取得串接溝通資料,也就是說只要有網址就可以進行串接溝通,不需要帶入任何的Data資料進去,這種傳輸方式較屬於大家皆可以使用的類型,然後第二種串接傳輸方式就是屬於Post類型--運用HttpPost帶入網址以及Data資料進行串接溝通,也就是說運用HttpPost就需要帶入值帶入資料到網路Server API,當然帶入的資料都會有相對應的欄位進行填放,說白話一點就是要丟東西到API然後丟的東西要符合API要的資料,最後API才會把資料回傳給我們,所以HttpPost傳輸方式就較為安全,因為需要互相溝通所以不屬於大家皆可使用的類型,當然Post的運用方式可以有很多種,如帳號密碼帶入驗證地區類型選擇等等都是需要帶入資料值進行演算後再回傳給我們,所以最後大家應該都了解HttpGetHttpPost的差異吧,那我們就趕快看看要如何運用這兩種傳輸方式進行網路Server API串接吧。

P.S. Server API回傳資料格式通常都是以Json格式進行回傳,下一篇文章小黑人將會說明如何解析Json格式文字進行資料讀取

1. 首先,在AndroidManifest.xml需要加入網路連線的權限 :
<uses-permission android:name="android.permission.INTERNET" />

2. Layout部分就建立兩個Button按鈕,各代表HttpGetHttpPost串接方式 :

<Button
android:id="@+id/get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="HttpGet網路串接傳輸"
android:layout_weight="1"
android:layout_margin="5dip"
/>

<Button
android:id="@+id/post"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="HttpPost網路串接傳輸"
android:layout_weight="1"
android:layout_margin="5dip"
/>

3.最後就是在程式端(.java)進行串接的動作囉 :
public class MainActivity extends Activity
{
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                //Get串接傳輸按鈕與Post串接傳輸按鈕
                Button mGet = (Button) findViewById(R.id.get);
                Button mPost = (Button) findViewById(R.id.post);

                //按下mGet按鈕進行HttpGet串接傳輸
                mGet.setOnClickListener(new OnClickListener()
                {
                        @Override
                        public void onClick(View arg0)
                        {
                                //建立多執行緒進行網路Server API串接的資料傳輸與讀取
                                new Thread(new Runnable()
                                {
                                        public void run()
                                        {
try
{
//API串接的uri路徑 (小黑人目前範例先取用YouTube API)
HttpClient mHttpClient = new DefaultHttpClient();
HttpGet mHttpGet = new HttpGet(uri);
HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);

// HttpURLConnection.HTTP_OK200200代表串接溝通成功
if(mHttpResponse.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK )
{
//API的回傳文字,格式為json格式
String mJsonText = EntityUtils.toString(mHttpResponse.getEntity());
//json格式解開並取出Title名稱
String mTitle = new JSONObject(new JSONObject(mJsonText).getString("data")).getString("title");

/**  Server API回傳的文字,Json格式 - 在下一篇文章裡小黑人將分享大家怎麼解析Json格式文字
*
* {"apiVersion":"2.1","data":{"id":"mJsT0i95cAY","uploaded":"2012-05-23T10:13:26.000Z","updated":"2013-05-11T12:14:14.000Z","uploader":"rockrecordstaipei","category":"Music","title":"陳綺貞-告訴我 (官方完整版MV)","description":"告訴我\n\n詞曲 陳綺貞\n\n看沉默的電話 " + "它什麼都不說\n看電視的畫面 它無聲的閃動\n看街上的行人 跟我擦肩而過\n整個世界太冷漠 我沒有" + "力氣再往前走\n\n看你緊閉的嘴唇 它什麼都不說\n看你飄忽的眼神 它無情的閃躲\n看你和我的回憶 " +"跟我擦肩而過\n你的改變太冷漠 我沒有勇氣大聲地說\n\n告訴我 你不是真的離開我 你也不願這樣的" + "夜裡 把難過留給我\n告訴我 你不是真的離開我 你是要懲罰我的愛讓你失去自由 告訴我......", "thumbnail":{"sqDefault":"http://i.ytimg.com/vi/mJsT0i95cAY/default.jpg","hqDefault": "http://i.ytimg.com/vi/mJsT0i95cAY/hqdefault.jpg"},"player":{"default":"https://www.yout" +"ube.com/watch?v=mJsT0i95cAY&feature=youtube_gdata_player","mobile":"https://m.youtube.com" +  "/details?v=mJsT0i95cAY"},"content":{"5":"https://www.youtube.com/v/mJsT0i95cAY?version=3&" +"f=videos&app=youtube_gdata","1":"rtsp://v8.cache7.c.youtube.com/CiILENy73wIaGQkGcHkv0hO" +"bmBMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp","6":"rtsp://v8.cache7.c.youtube.com/CiILENy73w" +"IaGQkGcHkv0hObmBMYESARFEgGUgZ2aWRlb3MM/0/0/0/video.3gp"},"duration":329,"rating":4.9524837,"likeCount":"915","ratingCount":926,"viewCount":134268,"favoriteCount":0,"commentCount":16,
 "restrictions":[{"type":"country","relationship":"deny","countries":"DE"}],"accessControl":{"comment":"allowed","commentVote":"allowed","videoRespond":"moderated","rate":"allowed","embed": "allowed","list":"allowed","autoPlay":"allowed","syndicate":"allowed"}}}
*
*/
                                                    }
                                        }
                                        catch(Exception e)
                                        {
                                        }
                                }
                        }).start();
                }});

                //按下mPost按鈕進行HttpPost串接傳輸
                mPost.setOnClickListener(new OnClickListener()
                {
                        @Override
                        public void onClick(View arg0)
                        {
                                //建立多執行緒進行網路Server API串接的資料傳輸與讀取
                                new Thread(new Runnable()
                                {
                                        public void run()
                                        {
                   try
                   {
                   //API串接的uri路徑
                   String uri = "輸入您的API路徑" ;

                   HttpClient mHttpClient = new DefaultHttpClient();                    
                   HttpPost mHttpPost = new HttpPost(uri);

                   //建立NameValuePair List帶入需要帶入的Data參數
                   List<NameValuePair> mParams = new ArrayList<NameValuePair>();
                   mParams.add(new BasicNameValuePair("欄位Key", "Data"));
                   mParams.add(new BasicNameValuePair("欄位Key", "Data"));
                   mParams.add(new BasicNameValuePair("欄位Key", "Data"));

                  //Data 放入mHttpPost                   
                  mHttpPost.setEntity(new UrlEncodedFormEntity(mParams, HTTP.UTF_8));
                  HttpResponse mHttpResponse = mHttpClient.execute(mHttpPost);

                 // HttpURLConnection.HTTP_OK200200代表串接溝通成功
                 if(mHttpResponse.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK )
                  {
                           //API的回傳文字,格式為json格式
                           String mJsonText = EntityUtils.toString(mHttpResponse.getEntity());
                   }
                   }
                   catch(Exception e)
                  {
                  }
                                        }
                                }).start();
                        }
                });
        }
}

以上就是HttpGetHttpPost兩種串接傳輸方式的運用,大家可以參考看看唷 ^^

另外要向大家說明的是因為有時會因網路讀取速度時間過長或其他不確定原因,造成程式停滯在串接溝通的部分裡而無法動彈,所以現在必須建立一個多執行緒(Thread)進行網路串接資料讀取的動作而不會影響到其他程式的進行動作。

最後謝謝大家~如有任何問題都可以和小黑人一起交流討論喔~ XDD

☆小黑人☆

10 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
  2. 你好,請問string uri 後面的連結,無法除錯,怎麼處理好呢

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      您是說如果String uri = "API_URL" 這個路徑是錯誤的話該怎麼處理嗎?
      如果連結是錯誤的話,mHttpResponse.getStatusLine().getStatusCode()這個狀態就不會等於200喔,
      HttpURLConnection.HTTP_OK為200,200代表串接溝通成功,
      所以連結網址錯誤或其他原因出錯的話,StatusCode就不會是200.

      感謝您的提問!

      刪除
  3. 你好 請問一下我想設定Get得到的資料會轉成UTF-8要怎麼設定?

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      若要將編碼轉換成UTF-8的話只要在取得字串時給予欲轉換的編碼,
      方法如下:
      String 取得的文字 = EntityUtils.toString(mHttpResponse.getEntity(),HTTP.UTF_8);

      感謝您的提問!

      刪除
  4. 如果要資料寫入DB如何設定QQ

    回覆刪除
    回覆
    1. 您好,根據您的提問小黑人與您解釋,
      當然首先要先將資料取出,例如範例方法: String mTitle = new JSONObject(new JSONObject(mJsonText).getString("data")).getString("title");
      取得資料後可建立資料庫,並將資料存入資料庫,
      資料庫方法可參考小黑人的文章 -> 【Android】SQLite基礎資料庫存取應用實作。

      感謝您的提問。

      刪除
  5. 您好,小黑人,我是用淘寶的API,API沒問題,可是利用GET跟POST卻都沒反應,code是利用您的方式去做的,請問有可能是什麼問題呢? 謝謝!

    回覆刪除
  6. 請問 我需要重android取出MySQL的資料做為文字跑馬燈 也是需要用這個嗎?還是有比較好的辦法嗎?

    回覆刪除
  7. 您好,我想請問一下,如果我是要用Web API存取SQL server那要怎麼使用呢?謝謝!

    回覆刪除

謝謝大家支持,有任何問題都可以和小黑人一起討論!