Advertisement
  1. Code
  2. APIs

Ang Paggawa ng Iyong Startup: Ang Pagdidisenyo ng isang RESTful na API

Scroll to top
Read Time: 16 min
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Running Multiple Domains
Building Your Startup With PHP: Bootstrap Your Home Page

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Ang tutorial na ito ay bahagi ngserye tungkol sa pagbuo ng iyong startup gamit ang PHP sa Envato Tuts+. Sa seryeng ito, gagabayan ko kayo sa paglulunsad ng isang startup mula sa konsepto sa kasalukuyan gamit ang aking Meeting Planner app bilang isang makatotohanan na halimbawa.  Bawat hakbang sa kahabaan ng proseso, ibibigay ko ang open-source code ng aking Meeting Planner app bilang halimbawa kung saan maaari mong malaman ang pinagmulan. Tatalakayin ko din angmga isyu tungkol sa negosyo kung meron tayong madaanan.

Bakit Kailangang Gumawa ng API para sa Iyong Startup?

Ang pangunahing dahilan kung bakit ako maglalagay ng API sa Meeting Planner ngayon ay upang makalikha ng pundasyon sa paggawa ng iOS mobile application. Ang mobile app ay gagamit ng API para makarehistro at maka-log in ng mga user at pagkatapos pahintulutan ang mga ito na makapag-iskedyul ng pagtitipon.

Ang mga API ay mayroon din na sekundaryong epekto upang ikaw ay matulungang makapag-isip muli at makapaghanda nang mas mainam para sa lahat ng kowd na iyong sinulat. Tiyak na may mga lugar sa loob ng kowd ng Meeting Planner na naging kumplikado. Ngayon, gagawin ko itong mas simple muli para sa mga mobile app upang makopya ang mga feature na nasa itaas ng fray.

Maaari din na magkaroon ng ibang dahilan ang paggawa ng API sa hinaharap. Halimbawa, gusto kong pahabain ang mga uri ng pagtitipon at kaganapan na maaaring maiskedyul sa Meeting Planner ng mga third-party developers—na magbibigay pahintulot sa kanila na mangolekta at magbahagi ng karagdagang datos sa proseso. 

Bilang paalala, ang lahat ng mga code para sa Meeting Planner ay nakasulat sa Yii2 Framework para sa PHP.  Kung gusto mong matuto nang iba pa tungkol sa Yii2, tingnan ang aming parallel series Programming Sa Yii2.

Bago ako tumungo sa API kowd, nais kong hikayatin kayong subukan na magtakda ng inyong unang pagtitipon upang malaman ninyo ang aking sinasabi.

Kung mayroon kayong mga katanungan tungkol sa tutoryal o aplikasyon nito, ako ay sumasagot sa talakayan sa ibaba, at maaari din kayong makipag-ugnayan sa akin sa @lookahead_io sa Twitter. Ako ay laging bukas para sa mga bagong tampok na ideya para sa Meeting Planner at pati na rin sa mga mungkahi para sa mga susunod na episode ng mga serye.

Ang Pagdidisenyo ng Iyong API

Nang ako ay naghahanda sa paggawa ng API, mayroong mga iba’t-ibang konsepto na kailangan kong maintindihan. Tinalakay ko ang ilan sa mga ito sa Programming sa Pamamagitan ng Yii2: Ang Paggawa ng isang RESTful na API (Envato Tuts+)

Una, kinailangan kong lumikha ng endpoint para sa API kung saan papasok ang lahat ng mga tawag mula sa mga mobile app. Nagpasya akong gumamit ng isang independent na third tree sa Yii Advanced Application framework, e.g. https://api.meetingplanner.io sa halip na https://meetingplanner.io/api/. Ito ay nagbibigay ng maayos na paghihiwalay ng API kowd mula sa iba pang mga serbisyo.

Ikalawa, kinailangan kong magdisenyo ng seguridad sa API. Sa tutoryal ngayon, ipapakita ko sa inyo ang simple na alpha security na aming ginagamit, ngunit ito ay aming pagtitibayin sa paglipas ng panahon, at maaari akong sumulat tungkol dito sa hinaharap. Mayroong aspeto sa seguridad kung paano namin ginagamit at pinapadala ang mga API key at hiling, ngunit mahalaga din na tiyak na ipinapatupad ng API ang aplikasyon ng mga protocol sa seguridad. Halimbawa, ang isang user ay hindi maaaring humiling sa mga kalahok ng pagtitipon kung hindi siya ang nag-organisa ng pagtitipon o hindi siya isa sa mga kalahok.

Ikatlo, nais kong maghanda ng API kowd para sa mga bersyon. Halimbawa, ang lumang iOS application na hindi pa nababago ay maaaring gumamit ng API v1.0, habang ang mas bagong update ay maaaring gumamit ng API v2.0. Ang Yii ay nagbibigay ng mga paraan sa paggawa nito, ngunit hindi ko pa ipinapatupad ang mga ito sa kasalukuyang disenyo.

Ikaapat, hangga’t maaari nais kong sumunod sa pamantayan ng REST. Iyan ay sinimulan ko ng gawin ngunit ito ay nangangailangan pa ng mas maraming pananaliksik upang ganap na maipatupad.

At ang panghuli, sa ngayon, kailangan kong alamin ang lawak ng functionality na maibibigay ng API. Sa simula, para sa pag-unlad ng mobile application, ako ay nag-pokus sa paglikha ng read-only functionality. Ang tutoryal ngayon at ang kowd ay nakatuon sa aplikasyon ng read-only functionality, i.e. pagpapakita sa akin ng pagtitipon ng isang user. Ngunit kabilang din dito ang pagrerehistro ng mga user. Sa hinaharap, kami ay maglalagay ng mas maraming mga write function tulad ng paglilikha ng pagtitipon, paglalagay ng kalahok, paglalagay ng lugar ng pagtitipon, at pag-aayos ng imbitasyon, at iba pa.

Kaya ituring ang tutoryal na ito na unang hakbang tungo sa isang matatag, at kumpletong serbisyo ng API para sa ating application.

Ang Paggawa ng API

Ang Paglikha ng API Service Tree

Building Your Startup - the API treeBuilding Your Startup - the API treeBuilding Your Startup - the API tree

Ang Meeting Planner ay gumagamit ng Yii Advanced Application framework, na kinabibilangan ng isang front-end tree para sa application at isang back-end tree para sa administratibong bahagi, at kami ay gagawa ng third tree para sa API.

Inilarawan ko kung paano ito ginawa sa Programming sa Pamamagitan ng Yii2: Ang Paggawa ng isang RESTful na API (Envato Tuts+)

Una, kinopya ko ang back-end tree at lahat ng may kaugnayan sa environment settings:

1
$ cp -R backend api
2
$ cp -R environments/dev/backend/ environments/dev/api
3
$ cp -R environments/prod/backend/ environments/prod/api

At naglagay ako ng @api alias sa /common/config/bootstrap.php:

1
<?php
2
Yii::setAlias('@common', dirname(__DIR__));
3
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
4
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
5
Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
6
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');

Sunod, magsisimula kaming lumikha ng core functionality.

Ang Pagtitibay ng API

Ako ay lumikha ng ilan sa mga pangunahing seguridad habang ginagawa namin at sinusubukan ang iOS application. Ito ay aking pagtitibayin sa hinaharap.

Ang lahat ng mga API call ay dapat may isang app_id at app_secret. Ito ay ipapadala sa anyo ng HTTPS. Subalit, walang garantiya na ito ay aming mapapangalagaan, kaya kami ay nagdisenyo ng application na tutulong upang ang mga keys na ito ay hindi matuklasan. 

Sa sandaling ito, pinalawak ko ang mp.ini file in /var/secure upang isama ang mga ito:

1
...
2
sentry_key_public = "xxxxxxxx"
3
sentry_key_private = "xxxxxx"
4
sentry_id ="nnnnnn"
5
app_id = "xnxnxnxxnxnxn"
6
app_secret ="xnxnxnxnxnxnxnxnxnxnxnxnxnxnxnxnxn"

Pagkatapos, ako ay lumikha ng isang Service.php model upang mapangasiwaan ang beripikasyon ng mga key na ito. Habang pinagtitibay namin ito, ako ay kinakailangan lamang magbago ng isang piraso ng kowd.

1
class Service extends Model
2
{
3
    public static function verifyAccess($app_id,$app_secret) {
4
      if ($app_id == Yii::$app->params['app_id']
5
        && $app_secret == Yii::$app->params['app_secret']) {
6
            Yii::$app->params['site']['id']=SiteHelper::SITE_SP;
7
            return true;
8
        } else {
9
          return false;
10
        }
11
      }

Sunod, ako ay lumikha ng beforeAction sa lahat ng mga API controller upang magamit muli ang paraan na nasa itaas:

1
public function beforeAction($action)
2
    {
3
      // your custom code here, if you want the code to run before action filters,

4
      // which are triggered on the [[EVENT_BEFORE_ACTION]] event, e.g. PageCache or AccessControl

5
      if (!parent::beforeAction($action)) {
6
          return false;
7
      }
8
      if (Service::verifyAccess(Yii::$app->getRequest()->getQueryParam('app_id'),Yii::$app->getRequest()->getQueryParam('app_secret'))) {
9
        return true;
10
      } else {
11
        echo 'your api keys are from the dark side';
12
        Yii::$app->end();
13
      }
14
    }

Ang mga pangunahing limitasyon dito ay ang pagpapadala ng mga security key sa bawat call at walang lagda ang mga query parameter. Ang pagpapadala nito sa pamamagitan ng HTTPS ay nakakatulong, ngunit hindi ito lubos na ligtas. Ito ay pagtitibayin ko sa hinaharap.

Ang Rehistrasyon at Login

Ang dalawang API calls lamang na lubos na umaasa sa mga API key ay ang rehistrasyon at login. Ang mga mobile user ay maaaring magrehistro sa pamamagitan ng OAuth at maaaring ipadala sa atin ang kanilang OAuth service tokens, o kaya maaari nilang ibigay sa atin ang kanilang email address.

Sa oras na ito ay matanggap, ang bawat user ay bibigyan ng isang natatanging token, at ang token na ito ay titiyakin ang mga API call ng user sa hinaharap.

Mayroon pa akong kailangang gawin upang mapabuti ang seguridad nito, ngunit hindi ko matatalakay ito ngayon.

Narito ang paunang kowd para makapagrehistro ang isang user gamit ang API at makalikha ng isang token:

1
public static function signupUser($email, $firstname='',$lastname='') {
2
      $username = $fullname = $firstname.' '.$lastname;
3
      if ($username == ' ') $username ='ios';
4
      if (isset($username) && User::find()->where(['username' => $username])->exists()) {
5
        $username = User::generateUniqueUsername($username,'ios');
6
      }
7
      $password = Yii::$app->security->generateRandomString(12);
8
        $user = new User([
9
            'username' => $username, // $attributes['login'],

10
            'email' => $email,
11
            'password' => $password,
12
            'status' => User::STATUS_ACTIVE,
13
        ]);
14
        $user->generateAuthKey();
15
        $user->generatePasswordResetToken();
16
        $transaction = $user->getDb()->beginTransaction();
17
        if ($user->save()) {
18
            $ut = new UserToken([
19
                'user_id' => $user->id,
20
                'token' => Yii::$app->security->generateRandomString(40),
21
            ]);
22
            if ($ut->save()) {
23
                User::completeInitialize($user->id);
24
                UserProfile::applySocialNames($user->id,$firstname,$lastname,$fullname);
25
                $transaction->commit();
26
                return $user->id;
27
            } else {
28
                print_r($auth->getErrors());
29
            }
30
        } else {
31
            $transaction->rollBack();
32
            print_r($user->getErrors());
33
        }
34
    }

Ang UserToken ay isang natatanging 40-numero na random string, na lalong mas mahirap hulaan kaysa paniwalaan na ang Amerika ay hihirangin si Donald Trump bilang kanilang pinuno.

1
$ut = new UserToken([
2
    'user_id' => $user->id,
3
    'token' => Yii::$app->security->generateRandomString(40),
4
    ]);
5
            

Ang Meeting Controller

Ngayon, tingnan natin ang mga calls para sa bawat lugar ng API, na humihiling ng impormasyon tungkol sa pagtitipon. Narito ang unang bahagi ng /api/controllers/MeetingController.php:

1
<?php
2
3
namespace api\controllers;
4
5
use Yii;
6
use yii\web\Controller;
7
use yii\web\NotFoundHttpException;
8
use yii\filters\VerbFilter;
9
use yii\web\Response;
10
use api\models\MeetingAPI;
11
use api\models\Service;
12
13
class MeetingController extends Controller
14
{
15
    public function behaviors()
16
    {
17
        return [
18
            'verbs' => [
19
                'class' => VerbFilter::className(),
20
                'actions' => [
21
                    'delete' => ['POST'],
22
                ],
23
            ],
24
        ];
25
    }
26
27
    public function beforeAction($action)
28
    {
29
      // your custom code here, if you want the code to run before action filters,

30
      // which are triggered on the [[EVENT_BEFORE_ACTION]] event, e.g. PageCache or AccessControl

31
      if (!parent::beforeAction($action)) {
32
          return false;
33
      }
34
      if (Service::verifyAccess(Yii::$app->getRequest()->getQueryParam('app_id'),Yii::$app->getRequest()->getQueryParam('app_secret'))) {
35
        return true;
36
      } else {
37
        echo 'your api keys are from the dark side';
38
        Yii::$app->end();
39
      }
40
    }

Mapapansin sa itaas kung paano ang bawat kilos ay nagpapatunay na ang mga token ay tama.

Pagkatapos, ang bawat API call para sa mga Pagtitipon ay binalangkas na magkakahawig, tulad ng ipinapakita sa ibaba (purihin ang aking pagtatangka at disiplina):

1
public function actionList($app_id='', $app_secret='',$token='',$status=0) {
2
  Yii::$app->response->format = Response::FORMAT_JSON;
3
  return MeetingAPI::meetinglist($token,$status);
4
}
5
6
public function actionHistory($app_id='', $app_secret='',$token='',$meeting_id=0) {
7
  Yii::$app->response->format = Response::FORMAT_JSON;
8
  return MeetingAPI::history($token,$meeting_id);
9
}
10
11
public function actionMeetingplaces($app_id='', $app_secret='',$token='',$meeting_id=0) {
12
  Yii::$app->response->format = Response::FORMAT_JSON;
13
  return MeetingAPI::meetingplaces($token,$meeting_id);
14
}
15
16
public function actionMeetingtimes($app_id='', $app_secret='',$token='',$meeting_id=0) {
17
  Yii::$app->response->format = Response::FORMAT_JSON;
18
  return MeetingAPI::meetingtimes($token,$meeting_id);
19
}
20
21
public function actionMeetingplacechoices($app_id='', $app_secret='',$token='',$meeting_place_id=0) {
22
  Yii::$app->response->format = Response::FORMAT_JSON;
23
  return MeetingAPI::meetingplacechoices($token,$meeting_place_id);
24
}
25
26
public function actionMeetingtimechoices($app_id='', $app_secret='',$token='',$meeting_time_id=0) {
27
  Yii::$app->response->format = Response::FORMAT_JSON;
28
  return MeetingAPI::meetingtimechoices($token,$meeting_time_id);
29
}
30
31
public function actionNotes($app_id='', $app_secret='',$token='',$meeting_id=0) {
32
  Yii::$app->response->format = Response::FORMAT_JSON;
33
  return MeetingAPI::notes($token,$meeting_id);
34
}
35
36
public function actionSettings($app_id='', $app_secret='',$token='',$meeting_id=0) {
37
  Yii::$app->response->format = Response::FORMAT_JSON;
38
  return MeetingAPI::settings($token,$meeting_id);
39
}
40
41
public function actionCaption($app_id='', $app_secret='',$token='',$meeting_id=0) {
42
  Yii::$app->response->format = Response::FORMAT_JSON;
43
  return MeetingAPI::caption($token,$meeting_id);
44
}
45
46
public function actionDetails($app_id='', $app_secret='',$token='',$meeting_id=0) {
47
  Yii::$app->response->format = Response::FORMAT_JSON;
48
  return MeetingAPI::details($token,$meeting_id);
49
}
50
51
public function actionReminders($app_id='', $app_secret='',$token='')
52
{
53
  Yii::$app->response->format = Response::FORMAT_JSON;
54
  return MeetingAPI::reminders($token);
55
}

Sa oras na ito, ang bawat call ay kinabibilangan ng $app_id, ng $app_secret at ng $token para sa mga nakalog-in na user. Ito ay aking babaguhin para sa seguridad sa hinaharap. Ito ay ligtas, ngunit hindi ito subok na ligtas.

Tingnan natin ang actionList, na naglilista ng filtering ng pagtitipon ng isang user gamit ang $status argument upang masala ang mga ito.

1
public function actionList($app_id='', $app_secret='',$token='',$status=0) {
2
  Yii::$app->response->format = Response::FORMAT_JSON;
3
  return MeetingAPI::meetinglist($token,$status);
4
}

Sa huli, ang API ay maaaring limitahan ang bilang ng mga request ng pagtitipon sa bawat status, i.e. ipakita sa akin ang mga 15 bagong pagtitipon sa planning mode ng isang user. 

Ang lahat ng paraan ng Pagtitipon ay nilikha batay sa MeetingAPI model. Narito ang kowd para sa meetinglist() method:

1
<?php
2
3
namespace api\models;
4
5
use Yii;
6
use yii\base\Model;
7
use common\models\User;
8
use common\components\MiscHelpers;
9
use api\models\UserToken;
10
use frontend\models\Meeting;
11
use frontend\models\MeetingLog;
12
use frontend\models\MeetingPlace;
13
use frontend\models\MeetingTime;
14
use frontend\models\MeetingReminder;
15
use frontend\models\MeetingSetting;
16
use frontend\models\MeetingNote;
17
18
class MeetingAPI extends Model
19
{
20
    public static function meetinglist($token,$status) {
21
      $user_id = UserToken::lookup($token);
22
      if (!$user_id) {
23
        return Service::fail('invalid token');
24
      }
25
      if ($status == Meeting::STATUS_PLANNING || $status == Meeting::STATUS_SENT) {
26
        $queryStatus =[Meeting::STATUS_PLANNING,Meeting::STATUS_SENT];
27
      } else {
28
        $queryStatus = $status;
29
      }
30
      // get calling user's timezone

31
      $timezone = MiscHelpers::fetchUserTimezone($user_id);
32
      $meeting_list = Meeting::find()
33
        ->joinWith('participants')
34
        ->where(['owner_id'=>$user_id])
35
        ->orWhere(['participant_id'=>$user_id])
36
        ->andWhere(['meeting.status'=>$queryStatus])
37
        ->distinct()
38
        ->orderBy(['created_at'=>SORT_DESC])
39
        ->all();
40
      $meetings=[];
41
      foreach ($meeting_list as $m) {
42
        $x = new \stdClass();
43
        $x->id = $m->id;
44
        $x->owner_id= $m->owner_id;
45
        $x->meeting_type = $m->meeting_type ;
46
        $x->subject = $m->subject ;
47
        $x->message = $m->message ;
48
        $x->identifier = $m->identifier ;
49
        $x->status = $m->status ;
50
        $x->created_at = $m->created_at ;
51
        $x->logged_at = $m->logged_at ;
52
        $x->sequence_id = $m->sequence_id ;
53
        $x->cleared_at = $m->cleared_at;
54
        $x->site_id = $m->site_id ;
55
        if ($status >= Meeting::STATUS_CONFIRMED) {
56
          $x->chosenTime=Meeting::getChosenTime($m->id);
57
          $x->caption = $m->friendlyDateFromTimestamp($x->chosenTime->start,$timezone,true,true).' '.$m->getMeetingParticipants();
58
          $x->chosenPlace = Meeting::getChosenPlace($m->id);
59
          if ($x->chosenPlace!==false) {
60
            $x->place = $x->chosenPlace->place;
61
            $x->gps = $x->chosenPlace->place->getLocation($x->chosenPlace->place->id);
62
            $x->noPlace = false;
63
          } else {
64
            $x->place = false;
65
            $x->noPlace = true;
66
            $x->gps = false;
67
          }
68
        } else {
69
          $x->chosenTime=0;
70
          $x->chosenPlace = 0;
71
          $x->caption = $m->getMeetingParticipants();
72
        }
73
        $meetings[]=$x;
74
        unset($x);
75
      }
76
      return $meetings;
77
    }

Una, ang paraan na ito ay magpapatunay na ang token ay pagmamay-ari ng user:

1
$user_id = UserToken::lookup($token);
2
      if (!$user_id) {
3
        return Service::fail('invalid token');
4
      }      

Narito ang kowd para sa UserToken::lookup():

1
public static function lookup($token) {
2
  // lookup token for user_id

3
  $ut = UserToken::find()
4
    ->where(['token'=>$token])
5
    ->one();
6
    if (!is_null($ut)) {
7
      return $ut->user_id;
8
    } else {
9
      return false;
10
    }
11
  }

Pagkatapos, sinusuri namin ang filter para sa $status at kinukuha ang $timezone ng user:

1
if ($status == Meeting::STATUS_PLANNING || $status == Meeting::STATUS_SENT) {
2
        $queryStatus =[Meeting::STATUS_PLANNING,Meeting::STATUS_SENT];
3
      } else {
4
        $queryStatus = $status;
5
      }
6
      // get calling user's timezone

7
      $timezone = MiscHelpers::fetchUserTimezone($user_id);
8
      

At sa huli, kami ay gumagawa ng listahan ng mga pagtitipon ng user at ito ay mano-manong binabago sa iba’t-ibang mga bagay:

1
$meeting_list = Meeting::find()
2
        ->joinWith('participants')
3
        ->where(['owner_id'=>$user_id])
4
        ->orWhere(['participant_id'=>$user_id])
5
        ->andWhere(['meeting.status'=>$queryStatus])
6
        ->distinct()
7
        ->orderBy(['created_at'=>SORT_DESC])
8
        ->all();
9
      $meetings=[];
10
      foreach ($meeting_list as $m) {
11
        $x = new \stdClass();
12
        $x->id = $m->id;
13
        $x->owner_id= $m->owner_id;
14
        $x->meeting_type = $m->meeting_type ;
15
        $x->subject = $m->subject ;
16
        $x->message = $m->message ;
17
        $x->identifier = $m->identifier ;
18
        $x->status = $m->status ;
19
        $x->created_at = $m->created_at ;
20
        $x->logged_at = $m->logged_at ;
21
        $x->sequence_id = $m->sequence_id ;
22
        $x->cleared_at = $m->cleared_at;
23
        $x->site_id = $m->site_id ;
24
        if ($status >= Meeting::STATUS_CONFIRMED) {
25
          $x->chosenTime=Meeting::getChosenTime($m->id);
26
          $x->caption = $m->friendlyDateFromTimestamp($x->chosenTime->start,$timezone,true,true).' '.$m->getMeetingParticipants();
27
          $x->chosenPlace = Meeting::getChosenPlace($m->id);
28
          if ($x->chosenPlace!==false) {
29
            $x->place = $x->chosenPlace->place;
30
            $x->gps = $x->chosenPlace->place->getLocation($x->chosenPlace->place->id);
31
            $x->noPlace = false;
32
          } else {
33
            $x->place = false;
34
            $x->noPlace = true;
35
            $x->gps = false;
36
          }
37
        } else {
38
          $x->chosenTime=0;
39
          $x->chosenPlace = 0;
40
          $x->caption = $m->getMeetingParticipants();
41
        }
42
        $meetings[]=$x;
43
        unset($x);
44
      }
45
      return $meetings;

Habang mayroong mas madaling paraan para balangkasin ang resulta ng database upang maibalik sa API, ang pagbabago ng pinaka-komplikadong table, ang Meeting, nang mano-mano ay nagpapahintulot sa akin na kontrolin ang mga resulta ng API na ibibigay sa mga programmer. Ito ay isang pagkakataon sa akin para mapabuti at gawing simple ang API mula sa orihinal na kowd at database properties.

Halimbawa, may kowd na kailangan ang Meeting Planner upang makalikha ng mga sub-heading sa interface ng user na hindi nakalagay sa database. Sa halip na asahan ang iOS application na kopyahin ang komplikadong kowd, kami ay lumilikha na lamang ng sub-heading at ito ay ibinabalik sa resulta ng mga API.

Ang Paggawa ng API Calls

Narito ang unang paraan upang gumawa at sumubok ng mga API call. Halimbawa, kung gawin ko ang sumusunod na URL call: 

1
http://apix.meetingplanner.io/meeting/list/?app_id=xxx&app_secret=xxxxx&token=yyyy

Iyon ay gagana. Ngunit, upang ito ay subukan at paganahin, gumagamit ako ng Postmanng Chrome app extension, na tunay na kapaki-pakinabang.

Narito kung paano gawin ang API call sa pamamagitan ng Postman UX:

Building Your Startup - Postman API RequestsBuilding Your Startup - Postman API RequestsBuilding Your Startup - Postman API Requests

At narito ang resulta:

Building Your Startup - Postman API ResultsBuilding Your Startup - Postman API ResultsBuilding Your Startup - Postman API Results

Iyan ay isang madaling paraan upang tingnan ang unang resulta ng development server na nagpapakita ng lahat ng aking pagtitipon:

1
[
2
  {
3
    "id": 207,
4
    "owner_id": 1,
5
    "meeting_type": 0,
6
    "subject": "New Mtg to Test",
7
    "message": "",
8
    "identifier": "dAefqLGi",
9
    "status": 20,
10
    "created_at": 1475285105,
11
    "logged_at": 1476642100,
12
    "sequence_id": "0",
13
    "cleared_at": 1475780470,
14
    "site_id": 0,
15
    "chosenTime": 0,
16
    "chosenPlace": 0,
17
    "caption": "with Jeff Reifman and b1@lookahead.me"
18
  },
19
  {
20
    "id": 206,
21
    "owner_id": 1,
22
    "meeting_type": 150,
23
    "subject": "Ignore - just testing",
24
    "message": "",
25
    "identifier": "ITJpSmlo",
26
    "status": 20,
27
    "created_at": 1474706654,
28
    "logged_at": 1474706702,
29
    "sequence_id": "0",
30
    "cleared_at": 1474706732,
31
    "site_id": 0,
32
    "chosenTime": 0,
33
    "chosenPlace": 0,
34
    "caption": "with Jeff Reifman and jimmyblack@gmail.com"
35
  },
36
  {
37
    "id": 205,
38
    "owner_id": 1,
39
    "meeting_type": 110,
40
    "subject": "Our Upcoming Meeting Test",
41
    "message": "",
42
    "identifier": "vkVPWVmH",
43
    "status": 20,
44
    "created_at": 1474677013,
45
    "logged_at": 1474921968,
46
    "sequence_id": "0",
47
    "cleared_at": 1474920744,
48
    "site_id": 0,
49
    "chosenTime": 0,
50
    "chosenPlace": 0,
51
    "caption": "with Jeff Reifman and tanyaryan@lookahead.me"
52
  },
53
  ...

Iyan lamang sa ngayon. Maaari niyong tingnan ang paglabas ng API tree at makita ang iba pang mga paraan. Habang pinagtitibay ko ang seguridad at pinagbubuti ang functionality ng API, susubukan kong sumulat pa ng marami tungkol dito.

Ang Pagtingin sa Hinaharap

Nawa kayo ay natuwa sa tutoryal ngayon. Malinaw naman na ang API ay lalago at magbabago habang  ang mobile development ay nagpapatuloy. Gaya ng nabanggit ko kanina, pagtitibayin at palalawakin ko ang functionality.

Muli, kung hindi ka pa nakakagawa, halina’t magtakda ng iyong unang pagtitipon gamit ang Meeting Planner. Ngayon na!

Maaari din kayong makipag-ugnayan sa akin sa @lookahead_io. Ako ay laging bukas sa bagong mga tampok na ideya at mga paksa sa mga susunod na tutoryal. O subukan ang aming helpdesk at magbukas ng isang bug report o feature request ticket. 

Manatiling nakatutok sa lahat ng ito at sa iba pang mga darating na tutoryal sa pamamagitan ng panonood ng Building Your Startup With PHP series. 

Related Links

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.