آموزش ساخت وب سرویس مبتنی بر Rest با PHP و MySQL برای استفاده در موبایل
ساخت وب سرویس مبتنی بر Rest با PHP و MySQL ( استفاده در موبایل)
در اکثر مواقع که اپلیکیشن های موبایل تولید میشود و قصد دارد به سرور متصل شود زبان برنامه نویسی سمت سرور پی اچ پی و پایگاه داده ی آن MySQL است. شما زمانی باید از این آموزش استفاده کنید که یک اپلیکیشن دارید یا قصد دارید بسازید که با سرور شما در ارتباط باشد و بصورت آنلاین کار کند یا به اصطلاح فنی اطلاعات کل اپلیکیشن ها در یک جا متمرکز شود در غیر اینصورت داده های برنامه های موبایلی میتواند در پایگاه داده ی لوکال یا محلی خود گوشی با پایگاه داده هایی مثل Sqlite ذخیره شود درست مثل خیلی از اپلیکیشن هایی که به اینترنت نیازی ندارند. در این آموزش قصد داریم یک وب سرویس PHP RESTful که اطلاعاتش را از پایگاه داده ی MySQL فراخوانی میکند بسازیم .
همچنین ، من یک نمونه کد پروژه اندرویدی را برای استفاده از این سرویس RESTful ارائه می دهم.
در این مثال ما باید از طرف اپلیکیشن اندرویدی درخواست PHP REST API را به سمت سرور ارسال کنیم . در سمت سرور کدهای PHP باید اطلاعات را از پایگاه داده MySQL فراخوانی کرده و آنها را بصورت JSON که یک فرمت داده است به اپلیکیشن اندرویدی تحویل دهد .
مرحله ی بعدی در سمت اپلیکیشن اندروید شما باید بتوانید داده های JSON دریافتی از سمت سرور پارس ( ترجمه ) کنید و در یک ListView ساده نمایش دهید .
تصویر زیر کمک میکند تا مراحل انجام این فرآیند را بهتر درک کنید .
وب سرویس PHP REST API که رکوردهای MySQL را می خواند
ما فرض میکنیم در سمت سرور یک جدول در پایگاه داده MySQL داریم که درون این جدول لیست موبایل ها نگهداری میشود . سمت سرور باید کدی بنویسیم که این لیست را از جدول فراخوانی کند و بصورت JSON به خروجی بفرستد. این REST API ما دارای سه بخش است . REST controller, service class و the DAO .
در ادامه کدهای مثال برای هر بخش که بالا گفتیم را مینویسیم.
کدهای RestController.php
<?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;
}
?>
کدهای فایل MobileRestHanler.php
کلاس سرویس از تابع DAO درخواست میکند تا اطلاعات را از جدول پایگاه داده بخواند . از آنجایی که اپلیکیشن ما داده ها را بصورت JSON نیاز دارد کلاس سرویس باید پاسخ را با فرمت JSON آماده کند .
<?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
<?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 از سمت اپلیکیشن اندرویدی
در این مثال ما یک اپلیکیشن ساده ی اندرویدی میسازیم که قصد دارد به داده های ذخیره شده روی MySQL که از طریق وب سرویس زبان php مبتنی بر REST ساخته شده است دسترسی داشته باشد .
ما یک اکتیویتی به نام MainActivity داریم که درونش یک ListView ساده میسازیم .
برای نمایش داده هایی که از طریق API مربوط به وب سرویس دریافت کردیم باید یک آداپتر یا ListView Adapter بسازیم که وظیفه ی نمایش اطلاعات ذخیره شده در MySQL درون آیتم های ListView را دارد .
ما در اکتیویتی MainActivity بصورت ساده یک AsyncTask میسازیم که وظیفه اش اتصال ما به وب سرویس است .
از HTTPConnectionRequest برای تنظیم پارامترها و ارسال درخواست به سمت وب سرویس استفاده میکنیم .
کد زیر نشان میدهد چطور این کار را انجام دهید .
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
}
و کدهای لیوت یا XML پروژه ی ما نیز به شکل زیر خواهد بود :
<?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
<?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" />
و در نهایت نتیجه ی خروجی این پروژه طبق تصویر زیر است .
require_once("SimpleRest.php");
رو چرا ننوشتی برادر
سلام ممنون از اطلاع رسانیتون