Android and OkHttp (HTTP LIB:Library)

Android and OkHttp (HTTP LIB:Library) อีก Library ตัวหนึ่งในการเขียน Android App ที่น่าสนใจไว้สำหรับการจัดการในการเชื่อมต่อกับ Http คือ OkHttp โดยไลบรารี่ตัวนี้ค่อนข้างจะทำงานได้ดีในระดับหนึ่ง ความสามารถพื้นฐานรองรับการการรับ-ส่งข้อมูลในรูปแบบ Get และ Post สามารถส่งได้ทั้งที่เป็น String , Multipart File , Streaming และอื่น ๆ อีกหลายฟีเจอร์ สั่งความสามารถพิเศษที่น่าจะสนใจ คือจะใช้ Gson ทั้งการ รับและส่ง ได้เช่นเดียวกัน

Android and OkHttp

ในการเขียน Android App ช่วงหลัง ๆ ผมจึงแนะนำให้ใช้ Library มาเข้าจัดการกับเรื่องเหล่านี้แทน ซึ่งในปัจจุบันมี Library หลายตัวมาก ที่เข้ามาจัดการกับ Http โดยเฉพาะ รองรับการทำงานเกือบทุกรูปแบบ ไม่ว่าจะเป็น get, post การรับส่ง string , files หรือแม้แต่ json ก็ยังถูกนำมารวมใช้งานกับ library นี้ด้วย โดยที่เราไม่จำเป็นจะต้องใช้การ parser ค่ามันอีก เพราะมันจะแปลงมาเป็น json ให้เลย ทั้ง ไป-กลับ และ function ต่าง ๆ ที่อยู่ใน Library เราจะมั่นใจได้ว่ามันจะไม่ถูก deprecated แน่นอน เพราะถ้ามีการ deprecated เราก็จะสามารถอัพเดดเวอร์ชั่นใหม่ ๆ ได้ตลอด โดยที่ไม่จำเป็นจะต้องมาแก้ไข Code ใหม่

สำหรับตัวอย่างและ Code นี้รองรับการเขียนทั้งบนโปรแกรม Eclipse และ Android Studio

Download OkHttp

Android and Glide

การติดตั้งสามารถดาวน์โหลดไฟล์ .JAR แล้วนำไป Import ลงใน Eclipse หรือ Android Studio

Android and Glide

ในการใช้งาน OkHttp จะต้องใช้ Library ของ okio ด้วย และจะรองรับ Level 19 หรือ Android 4.4.2 (เวอร์ชั่นต่ำกว่านี้น่าจะได้)

กรณีใช้บน Android Studio เพิ่ม build.gradle

compile ‘com.squareup.okhttp:okhttp:2.6.0’
compile ‘com.squareup.okio:okio:1.6.0’

ใน AndroidManifest.xml เพิ่ม Permission สำหรับการเชื่อมต่อกับ Internet ดังนี้

1.<uses-permission android:name="android.permission.INTERNET" />

ขั้นตอนการเรียกใช้

Example 1 : การเรียก URL ผ่าน get

Syntax

01.OkHttpClient client = new OkHttpClient();
02. 
03.String run(String url) throws IOException {
04.Request request = new Request.Builder()
05..url(url)
06..build();
07. 
08.Response response = client.newCall(request).execute();
09.return response.body().string();
10.}

getString.php : ตัวอย่างไฟล์ PHP ที่อยู่บน Server (www.thaicreate.com/android/getString.php)

1.<?php
2.echo date("Y-m-d H:i:s");
3.?>


Android and Glide

activity_main.xml

01.<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
03.android:layout_width="match_parent"
04.android:layout_height="match_parent" >
05. 
06.<TextView
07.android:id="@+id/txtResult"
08.android:layout_width="wrap_content"
09.android:layout_height="wrap_content"
10.android:layout_marginTop="50dp"
11.android:gravity="center"
12.android:text="Result" />
13. 
14.</TableLayout>

MainActivity.java

01.package com.myapp;
02. 
03.import android.os.Bundle;
04.import android.os.StrictMode;
05. 
06.import java.io.IOException;
07.import com.squareup.okhttp.OkHttpClient;
08.import com.squareup.okhttp.Request;
09.import com.squareup.okhttp.Response;
10. 
11.import android.app.Activity;
12.import android.widget.TextView;
13. 
14.public class MainActivity extends Activity {
15. 
16.@Override
17.public void onCreate(Bundle savedInstanceState) {
18.super.onCreate(savedInstanceState);
19.setContentView(R.layout.activity_main);
20. 
21.// Permission StrictMode
22.if (android.os.Build.VERSION.SDK_INT > 9) {
23.StrictMode.ThreadPolicy policy = newStrictMode.ThreadPolicy.Builder().permitAll().build();
24.StrictMode.setThreadPolicy(policy);
25.}
26. 
27.final TextView txtResult = (TextView) findViewById(R.id.txtResult);
28. 
29.getHttp http = new getHttp();
30.String response = null;
31.try {
33.catch (IOException e) {
34.// TODO Auto-generated catch block
35.e.printStackTrace();
36.}
37.txtResult.setText(response);
38. 
39.}
40. 
41.public class getHttp {
42.OkHttpClient client = new OkHttpClient();
43. 
44.String run(String url) throws IOException {
45.Request request = new Request.Builder()
46..url(url)
47..build();
48.Response response = client.newCall(request).execute();
49.return response.body().string();
50.}
51.}
52. 
53.}


Android and Glide

Example 2 : การเรียก URL และส่งค่า Parameters ผ่าน post

Syntax

01.private final OkHttpClient client = new OkHttpClient();
02. 
03.public void run() throws Exception {
04.RequestBody formBody = new FormEncodingBuilder()
05..add("search""Jurassic Park")
06..build();
07.Request request = new Request.Builder()
09..post(formBody)
10..build();
11. 
12.Response response = client.newCall(request).execute();
13.if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
14. 
15.System.out.println(response.body().string());
16.}

postString.php : ตัวอย่างไฟล์ PHP ที่อยู่บน Server (www.thaicreate.com/android/postString.php)

1.<?php
2.echo "Sawatdee : ".$_POST["sName"]." ".$_POST["sLastName"];
3.?>


activity_main.xml

01.<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
03.android:layout_width="match_parent"
04.android:layout_height="match_parent" >
05. 
06.<TextView
07.android:id="@+id/txtResult"
08.android:layout_width="wrap_content"
09.android:layout_height="wrap_content"
10.android:layout_alignParentTop="true"
11.android:layout_centerHorizontal="true"
12.android:layout_marginTop="107dp"
13.android:text="Result" />
14. 
15.</RelativeLayout>


MainActivity.java

01.package com.myapp;
02. 
03.import android.os.Bundle;
04.import android.os.StrictMode;
05. 
06.import java.io.IOException;
07. 
08.import com.squareup.okhttp.FormEncodingBuilder;
09.import com.squareup.okhttp.OkHttpClient;
10.import com.squareup.okhttp.Request;
11.import com.squareup.okhttp.RequestBody;
12.import com.squareup.okhttp.Response;
13. 
14.import android.app.Activity;
15.import android.widget.TextView;
16. 
17.public class MainActivity extends Activity {
18. 
19.@Override
20.public void onCreate(Bundle savedInstanceState) {
21.super.onCreate(savedInstanceState);
22.setContentView(R.layout.activity_main);
23. 
24.// Permission StrictMode
25.if (android.os.Build.VERSION.SDK_INT > 9) {
26.StrictMode.ThreadPolicy policy = newStrictMode.ThreadPolicy.Builder().permitAll().build();
27.StrictMode.setThreadPolicy(policy);
28.}
29. 
30.final TextView txtResult = (TextView) findViewById(R.id.txtResult);
31. 
32.postHttp http = new postHttp();
33. 
34.RequestBody formBody = new FormEncodingBuilder()
35..add("sName""Weerachai")
36..add("sLastName""Nukitram")
37..build();
38. 
39.String response = null;
40.try {
41.response = http.run("https://www.thaicreate.com/android/postString.php",formBody);
42.catch (IOException e) {
43.// TODO Auto-generated catch block
44.e.printStackTrace();
45.}
46.txtResult.setText(response);
47. 
48.}
49. 
50.public class postHttp {
51.OkHttpClient client = new OkHttpClient();
52. 
53.String run(String url,RequestBody body) throws IOException {
54.Request request = new Request.Builder()
55..url(url)
56..post(body)
57..build();
58.Response response = client.newCall(request).execute();
59.return response.body().string();
60.}
61.}
62. 
63.}


Android and Glide

Example 3 : การส่งค่า Post ไปยัง Web Server พร้อมกับ multipart/form-data

01.public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
02. 
03.private final OkHttpClient client = new OkHttpClient();
04. 
05.public void run() throws Exception {
06.File file = new File("/mnt/README.md");
07. 
08.Request request = new Request.Builder()
10..post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
11..build();
12. 
13.Response response = client.newCall(request).execute();
14.if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
15. 
16.System.out.println(response.body().string());
17.}

Example 4 : การส่งค่าไปกับ Header

01.private final OkHttpClient client = new OkHttpClient();
02. 
03.public void run() throws Exception {
04.Request request = new Request.Builder()
06..header("User-Agent""OkHttp Headers.java")
07..addHeader("Accept""application/json; q=0.5")
08..addHeader("Accept""application/vnd.github.v3+json")
09..build();
10. 
11.Response response = client.newCall(request).execute();
12.if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
13. 
14.System.out.println("Server: " + response.header("Server"));
15.System.out.println("Date: " + response.header("Date"));
16.System.out.println("Vary: " + response.headers("Vary"));
17.}

Example 5 : การส่งค่า Post แบบ JSON (Gson)

01.private final OkHttpClient client = new OkHttpClient();
02.private final Gson gson = new Gson();
03. 
04.public void run() throws Exception {
05.Request request = new Request.Builder()
07..build();
08.Response response = client.newCall(request).execute();
09.if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
10. 
11.Gist gist = gson.fromJson(response.body().charStream(), Gist.class);
12.for (Map.Entry<String, GistFile> entry : gist.files.entrySet()) {
13.System.out.println(entry.getKey());
14.System.out.println(entry.getValue().content);
15.}
16.}
17. 
18.static class Gist {
19.Map<String, GistFile> files;
20.}
21. 
22.static class GistFile {
23.String content;
24.}

ตัวอย่างการใช้งานต่าง ๆ

 

https://www.thaicreate.com/mobile/android-okhttp.html