ساخت REST API برای اندروید با PHP که اطلاعات را از دیتابیس MySQL میخواند یک مورد قراردادی بسیار مرسوم برای اپلیکیشن های موبایل است . زمانی که یک سناریو نیاز دارد که اطلاعات را به شیوه متمرکز ذخیره کنید , از این نوع ساختار باید بهره برد.
همچنین دیتابیس محلی بر روی موبایل می تواند برای ذخیره و خواندن اطلاعات نیز استفاده شود .
در این آموزش , قصد ساخت وب سرویس RESTful برای خواندن اطلاعات از جدول دیتابیس (MySQL) را داریم.
همچنین , یک کد مثال ساده از پروژه اندروید (Android) برای استفاده از این سرویس RESTful را در اختیار شما قرار میدهیم . قبلا نیز اصول پایه ساخت وب سرویس RESTful در php و نحوه کویری زدن به دیتابیس برای جستجو و… مطالب دیگر را دیدیم .
شدیدا توصیه می شود قبل از ادامه مقاله ساخت REST API برای اندروید , آموزش های دیگری که در رابطه با وب سرویس RESTful ارایه دادیم رو مطالعه بفرمایید.
در این مثال از ساخت REST API برای اندروید , ما PHP REST API را از طریق اپلیکیش اندروید فراخوانی می کنیم . در سمت سرور , این سرویس API داده ها را از دیتابیس خوانده (fetch
) و پاسخ را در فرمت داده jSON برگشت می دهد.
بعد از دریافت پاسخ (response) , اپلیکیشن اندروید سطر های داده برگشتی را به صورت لیست مانند نمایش می دهد .
PHP REST API برای خواندن سطر های MySQL
ما جدولی از لیست نام مدل های مختلف موبایل را داریم . API ما تمام این لیست را از دیتابیس Mysql خوانده و در فرمت JSON به عنوان پاسخ برگشت می دهد . REST API ما شامل سه بخش کنترلر REST , کلاس وب سرویس , DAO است .
RestContorller.php
این کنترلر برای کلاس مورد نظر را بر اساس درخواست فراخوانی می کند و در نهایت پاسخ مناسب را ایجاد میکند..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php require_once("MobileRestHandler.php"); $view = ""; if(isset($_GET["view"])) $view = $_GET["view"]; /* controls the RESTful services URL mapping */ switch($view){ case "all": // to handle REST Url /mobile/list/ $mobileRestHandler = new MobileRestHandler(); $mobileRestHandler->getAllMobiles(); break; case "" : //404 - not found; break; } ?> |
MobileRestHandler.php
این کلاس تابع DAO را برای خواندن اطلاعات از دیتابیس فراخوانی می کند . زمانی که اپلیکیشن ما درخواست داده نوع JSON را می کند , این کلاس پاسخ داده JSON را می سازد .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php require_once("SimpleRest.php"); require_once("Mobile.php"); class MobileRestHandler extends SimpleRest { function getAllMobiles() { $mobile = new Mobile(); $rawData = $mobile->getAllMobile(); if(empty($rawData)) { $statusCode = 404; $rawData = array('error' => 'No mobiles found!'); } else { $statusCode = 200; } $requestContentType = 'application/json';//$_POST['HTTP_ACCEPT']; $this ->setHttpHeaders($requestContentType, $statusCode); $result["output"] = $rawData; if(strpos($requestContentType,'application/json') !== false){ $response = $this->encodeJson($result); echo $response; } } public function encodeJson($responseData) { $jsonResponse = json_encode($responseData); return $jsonResponse; } } ?> |
Mobile.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php require_once("dbcontroller.php"); /* A domain Class to demonstrate RESTful web services */ Class Mobile { private $mobiles = array(); /* you should hookup the DAO here */ public function getAllMobile(){ $query = "SELECT * FROM tbl_mobile"; $dbcontroller = new DBController(); $this->mobiles = $dbcontroller->executeSelectQuery($query); return $this->mobiles; } } ?> |
اپلیکیشن اندروید – دسترسی به PHP REST API
در این مثال از ساخت REST API برای اندروید, ما یک اپ اندرویدی ساده برای دسترسی به داده های MySQL توسط REST API در PHP ایجاد کردیم . ما یک المنت ListView
در MainActivity
یا همان صفحه اصلی داریم .
همچنین یک آداپتو ListView
برای افزودن آیتم های برگشتی در پاسخ API
به لیست ساختیم . که اطلاعات سطر های mysql را نمایش میدهد.
در زمان اجرای MainActivity
, ما AsyncTask
را برای دسترسی به PHP REST API فراخوانی میکنیم . همچنین از کلاس “HTTPConnectionRequest
” برای ست کردن پارامتر ها و ارسال آن به API بهره بردیم .
کد اندروید زیر کلاس MainActivity
را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
package com.phppot.code.phprestapp; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.format.DateUtils; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.lang.ref.WeakReference; import java.util.Date; import java.util.HashMap; public class MainActivity extends AppCompatActivity { private String apiPath = "http://10.0.2.2/phpsamples/php-mysql-rest-api-for-android/mobile/list/"; private ProgressDialog processDialog; private JSONArray restulJsonArray; private int success = 0; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.mobile_name_list); new ServiceStubAsyncTask(this, this).execute(); } private class ServiceStubAsyncTask extends AsyncTask<Void, Void, Void> { private Context mContext; private Activity mActivity; String response = ""; HashMap<String, String> postDataParams; public ServiceStubAsyncTask(Context context, Activity activity) { mContext = context; mActivity = activity; } @Override protected void onPreExecute() { super.onPreExecute(); processDialog = new ProgressDialog(mContext); processDialog.setMessage("Please Wait ..."); processDialog.setCancelable(false); processDialog.show(); } @Override protected Void doInBackground(Void... arg0) { postDataParams = new HashMap<String, String>(); postDataParams.put("HTTP_ACCEPT", "application/json"); HttpConnectionService service = new HttpConnectionService(); response = service.sendRequest(apiPath, postDataParams); try { success = 1; JSONObject resultJsonObject = new JSONObject(response); restulJsonArray = resultJsonObject.getJSONArray("output"); } catch (JSONException e) { success = 0; e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); if (processDialog.isShowing()) { processDialog.dismiss(); } if (success == 1) { if (null != restulJsonArray) { ArrayAdapter listViewAdapter = new ArrayAdapter<String>(mContext, R.layout.mobile_name_listview); for (int i = 0; i < restulJsonArray.length(); i++) { try { JSONObject jsonObject = restulJsonArray.getJSONObject(i); listViewAdapter.add(jsonObject.get("name")); } catch (JSONException e) { e.printStackTrace(); } } listView.setAdapter(listViewAdapter); } } } }//end of async task } |
در خط ۲۷ آدرس URL مربوط به API خود را تغییر بدید
و محتویات فایل XML بصورت زیر است :
Activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.phppot.code.phprestapp.MainActivity" android:background="#000000" android:padding="0dp"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/mobile_name_list" android:layout_alignParentBottom="false" android:layout_centerHorizontal="true" android:layout_marginBottom="124dp" android:layout_alignParentTop="true" android:divider="#5e5e5f" android:dividerHeight="1dp" android:drawSelectorOnTop="true" android:layout_margin="0dp" android:padding="0dp" /> </RelativeLayout> |
Mobile_name_listview.xml
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Text" android:id="@+id/list_item" android:textColor="#FFFFFF" android:background="#000" android:textSize="18dp" android:paddingTop="20dp" android:paddingBottom="20dp" /> |
خروجی نهایی اپلیکیشن اندروید متصل به REST API
همانطور که میدانید امروزه این امر که برای اپلیکیشن های اندروید خود یک API به سبک REST بنویسد بسیار شایع و فراگیر است و شرکت ها مختلفی برای اپ های خود از این استاندارد و تکنیک ها استفاده می کنند. و بازار کار ساخت API برای اپلیکیشن بسیار داغ است.
امیدوارم از آموزش ساخت REST API برای اندروید با php نهایت استفاده را برده باشید .
برای دانلود سورس کد کامل این مقاله که به زبان PHP و اندروید است می توانید به بخش باکس دانلود زیر این مقاله آموزشی مراجعه کنید.
هر سوالی داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
سلام
ممنون از آموزش های عالی تون….
یه سوال داشتم
من می خواهم برنامه ای بنویسم که اطلاعات را از وب سایت من با استفاده از JSON دریافت کند. برای مثال، فایل JSON در آدرس زیر در host قرار دارد. http://example.com/jfile.json
در برنامه ای که در Android نوشته ام، من این فایل را فراخوانی میکنم و سپس عملیات هایی را می خواهم روی داده هایی که دریافت کردم اعمال میکنم.
اما نکته اینجا این است که من نمی خواهم که کاربر با تایپ کردن (http://example.com/jfile.json) به فایل JSON دسترسی پیدا کنم و تنها برنامه اندرویدی من به این فایل دسترسی داشته باشد.
آیا امکان دارد؟ اگر بله، چطور؟
سلام . بله باید احراز هویت انجام بدید که با ارسال یک سری اطلاعات و دریافت کلید اختصاصی میتونید عملیات رو پیش ببرید.
https://netparadis.com/php-authorization-jwt-json-web-tokens-1
موفق بشید.