Advertisement
  1. Code
  2. Web Development

Laravel 4: एक Restful API पर एक शुरुआत (अपडेटेड)

Scroll to top
Read Time: 13 min

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

Restful API मुश्किल है! एक सफल डिजाइन करने और लिखने के लिए कई पहलू हैं। उदाहरण के लिए, कुछ विषयों जो आप स्वयं के हैंडलिंग में पा सकते हैं उनमें ऑथेंटिकेशन, हाइपरमीडिया/HATEOS, versioning, रेट लिमिट और कंटेंट नेगोशियेशन शामिल है। इन सभी कॉन्सेप्ट्स से निपटने के बजाय, चलो, REST की मूल बातों पर ध्यान दें। हम बेसिक ऑथेंटिकेशन सिस्टम के पीछे कुछ JSON अंतराल बनाएंगे, और प्रोसेस में कुछ Laravel 4 ट्रिक सीखेंगे।

अगर आपको अपने Laravel डेवलपमेंट में मदद की ज़रूरत है, तो Envato Market पर उपलब्ध कुछ उपयोगी Laravel स्क्रिप्ट और प्लगइन्स आज़माएं।


The App

आइए एक साधारण रीड-इट-लेटर वाले ऐप के लिए API बनाएं। यूज़र्स उन URL को बनाने, रीड, अपडेट और डिलीट करने में सक्षम होंगे जिन्हें वे बाद में पढ़ना चाहते हैं।

गोता लगाने और शुरू करने के लिए तैयार हैं?

Laravel 4 इनस्टॉल करें

Laravel 4 का नया इंस्टॉल बनाएं। यदि आप CLI के साथ काम कर रहे हैं, तो इस क्विकस्टार्ट गाइड को आज़माएं। अन्यथा, हमारे पास Nettuts+ पर एक वीडियो ट्यूटोरियल है जो प्रोसेस को कवर करता है।

हम सुरक्षित पासवर्ड हैशिंग के लिए पहले एन्क्रिप्शन key बनाने जा रहे हैं। आप इस प्रोजेक्ट रूट से इस कमांड को चलाकर आसानी से ऐसा कर सकते हैं:

1
$ php artisan key:generate

वैकल्पिक रूप से, आप अपने app/config/app.php एन्क्रिप्शन कुंजी को सरल बना सकते हैं:

1
/*

2
|--------------------------------------------------------------------------

3
| Encryption Key

4
|--------------------------------------------------------------------------

5
|

6
| This key is used by the Illuminate encrypter service and should be set

7
| to a random, long string, otherwise these encrypted values will not

8
| be safe. Make sure to change it before deploying any application!

9
|

10
*/
11
12
'key' => md5('this is one way to get an encryption key set'),

डेटाबेस

एक बार जब आपके पास Laravel 4 का वर्किंग इनस्टॉल हों, तो हम मस्ती के साथ शुरू कर सकते हैं। हम ऐप का डेटाबेस बनाकर शुरू करेंगे।

इसके लिए केवल दो डेटाबेस टेबल की आवश्यकता होगी:

  1. Users, नाम और पासवर्ड सहित
  2. URLs, url और डिस्क्रिप्शन सहित

डेटाबेस बनाने और पॉप्युलेट करने के लिए हम Laravel के migrations का उपयोग करेंगे।

अपने डेटाबेस को कॉन्फ़िगर करें

app/config/database.php एडिट करें और इसे अपनी डेटाबेस सेटिंग्स से भरें। नोट: इसका मतलब है कि इस एप्लिकेशन के उपयोग के लिए डेटाबेस बनाना। यह आर्टिकल एक MySQL डेटाबेस को मानता है।

1
'connections' => array(
2
3
    'mysql' => array(
4
        'driver'    => 'mysql',
5
        'host'      => 'localhost',
6
        'database'  => 'read_it_later',
7
        'username'  => 'your_username',
8
        'password'  => 'your_password',
9
        'charset'   => 'utf8',
10
        'collation' => 'utf8_unicode_ci',
11
        'prefix'    => '',
12
    ),
13
),

माइग्रेशन फ़ाइलें बनाएं

1
$ php artisan migrate:make create_users_table --table=users --create
2
$ php artisan migrate:make create_urls_table --table=urls --create

ये कमांड्स मूल माइग्रेशन स्क्रिप्ट सेट अप करते हैं जिन्हें हम डेटाबेस टेबल बनाने के लिए उपयोग करेंगे। अब हमारा काम उन्हें सही टेबल कॉलम से भरना है।

app/database/migrations/SOME_DATE_create_users_table.php एडिट करें और up() मेथड में जोड़ें:

1
public function up()
2
{
3
    Schema::create('users', function(Blueprint $table)
4
    {
5
        $table->increments('id');
6
        $table->string('username')->unique();
7
        $table->string('password');
8
        $table->timestamps();
9
    });
10
}

ऊपर, हम एक यूजरनाम (जो यूनिक होना चाहिए), एक पासवर्ड, साथ ही टाइमस्टैम्प सेट कर रहे हैं। इसे सेव करें, और अब app/database/migrations/SOME_DATE_create_urls_table.php एडिट करें, और up() मेथड में जोड़ें:

1
public function up()
2
{
3
    Schema::create('urls', function(Blueprint $table)
4
    {
5
        $table->increments('id');
6
        $table->integer('user_id');
7
        $table->string('url');
8
        $table->string('description');
9
        $table->timestamps();
10
    });
11
}

इस स्निपेट में एकमात्र महत्वपूर्ण नोट यह है कि हम user_id फ़ील्ड के माध्यम से url और users टेबल के बीच एक लिंक बना रहे हैं।

सैंपल यूज़र्स को जोड़ें

हम कुछ सैंपल यूज़र्स को बनाने के लिए Laravel के seeds का उपयोग कर सकते हैं।

app/database/seeds फ़ोल्डर में एक फ़ाइल बनाएं जिसमें टेबल के समान नाम है; हमारे मामले में, UserTableSeeder.php। इसमें जोड़ें:

1
<?php
2
3
class UserTableSeeder extends Seeder {
4
5
    public function run()
6
    {
7
        DB::table('users')->delete();
8
9
        User::create(array(
10
            'username' => 'firstuser',
11
            'password' => Hash::make('first_password')
12
        ));
13
14
        User::create(array(
15
            'username' => 'seconduser',
16
            'password' => Hash::make('second_password')
17
        ));
18
    }
19
20
}

इसके बाद, सुनिश्चित करें कि डेटाबेस सीड होने पर seeder क्लास को चलाया जाता है। app/database/seeds/DatabaseSeeder.php एडिट करें:

1
public function run()
2
{
3
    Eloquent::unguard();
4
5
    // Add or Uncomment this line

6
    $this->call('UserTableSeeder');
7
}

माइग्रेशन को चलाएं

यहां उन दो टेबल्स को बनाने का तरीका बताया गया है, और हमारे सैंपल यूज़र्स को इन्सर्ट करें।

1
// Create the two tables

2
$ php artisan migrate
3
4
// Create the sample users

5
$ php artisan db:seed

Models

Laravel 4 उत्कृष्ट Eloquent ORM का उपयोग जारी रखता है। इससे डाटाबेस को संभालने की प्रक्रिया एक स्नैप कॉल (चुटकी बजा कर) करेगी। हमें प्रति टेबल एक मॉडल की आवश्यकता होगी।

सौभाग्य से, Laravel User मॉडल सेटअप के साथ आता है, तो चलिए अपने urls टेबल के लिए एक मॉडल बनाते हैं।

app/model/Url.php फाइल बनाएं और एडिट करें।

1
<?php
2
3
class Url extends Eloquent {
4
5
    protected $table = 'urls';
6
7
}

ऑथेंटिकेशन

Laravel के filters हमारे लिए ऑथेंटिकेशन संभाल सकते हैं। विशेष रूप से, Laravel अब बेसिक ऑथेंटिकेशन फ़िल्टर के साथ आता है, जिसे हम अपने API रिक्वेस्ट्स के साथ उपयोग करने के लिए क्विक ऑथेंटिकेशन मॉडल के रूप में उपयोग कर सकते हैं।

यदि आप app/filter.php खोलते हैं, तो आप देखेंगे कि यह ऐसा दिखता है:

1
Route::filter('auth.basic', function()
2
{
3
    return Auth::basic();
4
});

हमें बस एक एडजस्टमेंट करने की जरूरत है। डिफ़ॉल्ट रूप से, यह फ़िल्टर यूजर की पहचान करने के लिए "email" फ़ील्ड को ढूंढता है। चूंकि हम ईमेल के बजाय यूजरनाम का उपयोग कर रहे हैं, इसलिए हमें उस प्रेफरेंस को एडजस्ट करने की आवश्यकता है। Auth::basic() कॉल को हमारे यूजरनाम फ़ील्ड को पैरामीटर के रूप में बदलें:

1
Route::filter('auth.basic', function()
2
{
3
    return Auth::basic("username");
4
});

Routes

आइए इसका परीक्षण करें। testauth नामक एक रूट बनाएं, और सुनिश्चित करें कि हमारे auth.basic फ़िल्टर इससे पहले चलता है।

app/routes.php एडिट करें:

1
Route::get('/authtest', array('before' => 'auth.basic', function()
2
{
3
    return View::make('hello');
4
}));

हम इसे एक curl रिक्वेस्ट के साथ परीक्षण कर सकते हैं। अपने टर्मिनल से, Laravel के निर्माण को इंगित करने का प्रयास करें। मेरे में, ऐसा लगता है (आपका URL शायद अलग होगा!):

1
$ curl -i localhost/l4api/public/index.php/authtest
2
HTTP/1.1 401 Unauthorized
3
Date: Tue, 21 May 2013 18:47:59 GMT
4
WWW-Authenticate: Basic
5
Vary: Accept-Encoding
6
Content-Type: text/html; charset=UTF-8
7
8
Invalid credentials

जैसा कि आप देख सकते हैं, एक अनऑथॉरिज़ रिक्वेस्ट का पता लगाया गया है और एक "Invalid Credentials" मैसेज 401 स्टेटस कोड के साथ रीटर्न कर दिया गया है। इसके बाद, बेसिक ऑथेंटिकेशन सहित प्रयास करें।

1
$ curl --user firstuser:first_password localhost/l4api/public/index.php/authtest
2
HTTP/1.1 200 OK
3
Date: Tue, 21 May 2013 18:50:51 GMT
4
Vary: Accept-Encoding
5
Content-Type: text/html; charset=UTF-8
6
7
<h1>Hello World!</h1>

इसने काम कर दिया!

इस बिंदु पर, हमारे API का बेसलाइन काम पूरा हो जाता है। हमारे पास है:

  • इनस्टॉल किया गया Laravel 4
  • हमारे डेटाबेस बना लिया
  • हमारे मॉडल बना लिया
  • एक ऑथेंटिकेशन मॉडल बना लिया

फंक्शनल रिक्वेस्ट को बनाना

आप Laravel के RESTful कंट्रोलर्स से परिचित हो सकते हैं। वे अभी भी Laravel 4 में मौजूद हैं; हालांकि, हम Laravel के Resourceful Controllers का भी उपयोग कर सकते हैं, जो कुछ paradigm सेटअप करते हैं जिनका उपयोग हम एक कंसिस्टेंट API इंटरफ़ेस बनाने के लिए कर सकते हैं। हम एक रिसोर्सफुल कंट्रोलर का उपयोग करेंगे।

रिसोर्सफुल कंट्रोलर में प्रत्येक मेथड को संभालने के लिए यहां एक ब्रेकडाउन दिया गया है। कृपया ध्यान दें कि आप /resource/create और /resource/{id}/edit routes को हटा सकते हैं, क्योंकि हमें किसी API में 'create' या 'edit' फ़ॉर्म दिखाने की आवश्यकता नहीं होगी।

एक रिसोर्सफुल कंट्रोलर बनाएँ

1
$ php artisan controller:make UrlController

इसके बाद, कंट्रोलर का उपयोग करने के लिए एक रूट को निर्धारित करें, और प्रत्येक रूट को ऑथेंटिकेटेड करने की आवश्यकता है।

app/routes.php एडिट करें और जोड़ें:

1
// Route group for API versioning

2
Route::group(array('prefix' => 'api/v1', 'before' => 'auth.basic'), function()
3
{
4
    Route::resource('url', 'UrlController');
5
});

वहां कुछ चीजें हो रही हैं।

  1. यह http://example.com/api/v1/url पर किए गए रिक्वेस्ट्स का जवाब देने जा रहा है।
  2. अगर हमें हमारे API का विस्तार करने की ज़रूरत है, तो यह हमें अतिरिक्त रूट जोड़ने की अनुमति देता है। उदाहरण के लिए, यदि आप यूजर एन्ड-पॉइंट जोड़ते हैं, जैसे /api/v1/user
  3. हमारे API को वर्जेनिंग (versioning) करने के लिए एक नेमिंग मैकेनिज्म भी है। यह हमें पुराने वर्जन को ब्रेक किये बिना नए API वर्जन को रोल करने का मौका देता है - हम बस एक v2 रूट ग्रुप बना सकते हैं, और इसे एक नए कंट्रोलर को पॉइंट कर सकते हैं!

नोट: आप अधिक एडवांस API वर्जनिंग तकनीकों पर विचार करना चाहेंगे, जैसे एक Accept हेडर या सबडोमेन का उपयोग करना जो आपको अलग-अलग API वर्जन को अलग कोड बेस पॉइंट करने में मदद कर सकता है।

फंक्शनलिटी जोड़ें

नयी app/controller/UrlController.php फ़ाइल एडिट करें:

1
// Edit this:

2
public function index()
3
{
4
    return 'Hello, API';
5
}

आइए इसका परीक्षण करें:

1
$ curl -i localhost/l4api/public/index.php/api/v1/url
2
HTTP/1.1 401 Unauthorized
3
Date: Tue, 21 May 2013 19:02:59 GMT
4
WWW-Authenticate: Basic
5
Vary: Accept-Encoding
6
Content-Type: text/html; charset=UTF-8
7
8
Invalid credentials.
9
10
$ curl --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url
11
HTTP/1.1 200 OK
12
Date: Tue, 21 May 2013 19:04:19 GMT
13
Vary: Accept-Encoding
14
Content-Type: text/html; charset=UTF-8
15
16
Hello, API

अब हमारे पास ऑथेंटिकेशन के साथ एक रिसोर्सफुल कंट्रोलर है, और फंक्शनलिटी जोड़ने के लिए तैयार हैं।

एक URL बनाएँ

app/controller/UrlController.php एडिट करें:

1
/**

2
 * Store a newly created resource in storage.

3
 *

4
 * @return Response

5
 */
6
public function store()
7
{
8
    $url = new Url;
9
    $url->url = Request::get('url');
10
    $url->description = Request::get('description');
11
    $url->user_id = Auth::user()->id;
12
13
    // Validation and Filtering is sorely needed!!

14
    // Seriously, I'm a bad person for leaving that out.

15
16
    $url->save();
17
18
    return Response::json(array(
19
        'error' => false,
20
        'urls' => $urls->toArray()),
21
        200
22
    );
23
}

यह एक और curl रिक्वेस्ट के साथ परीक्षण करने का समय है। यह एक POST रिक्वेस्ट भेजेगा, जो उपरोक्त बनाए गए store() मेथड से मेल खाएगा।

1
$ curl -i --user firstuser:first_password -d 'url=http://google.com&description=A Search Engine' localhost/l4api/public/index.php/api/v1/url
2
HTTP/1.1 201 Created
3
Date: Tue, 21 May 2013 19:10:52 GMT
4
Content-Type: application/json
5
6
{"error":false,"message":"URL created"}

कूल! चलिए अपने दोनों यूज़र्स के लिए कुछ और बनाते हैं।

1
$ curl --user firstuser:first_password -d 'url=http://fideloper.com&description=A Great Blog' localhost/l4api/public/index.php/api/v1/url
2
3
$ curl --user seconduser:second_password -d 'url=http://digitalsurgeons.com&description=A Marketing Agency' localhost/l4api/public/index.php/api/v1/url
4
5
$ curl --user seconduser:second_password -d 'url=http://www.poppstrong.com/&description=I feel for him' localhost/l4api/public/index.php/api/v1/url

इसके बाद, आइए URL रिट्रीव करने के लिए मेथड्स को बनाएं।

1
/**

2
 * Display a listing of the resource.

3
 *

4
 * @return Response

5
 */
6
public function index()
7
{
8
    //Formerly: return 'Hello, API';

9
10
    $urls = Url::where('user_id', Auth::user()->id)->get();
11
12
    return Response::json(array(
13
        'error' => false,
14
        'urls' => $urls->toArray()),
15
        200
16
    );
17
}
18
19
/**

20
 * Display the specified resource.

21
 *

22
 * @param  int  $id

23
 * @return Response

24
 */
25
public function show($id)
26
{
27
    // Make sure current user owns the requested resource

28
    $url = Url::where('user_id', Auth::user()->id)
29
            ->where('id', $id)
30
            ->take(1)
31
            ->get();
32
33
    return Response::json(array(
34
        'error' => false,
35
        'urls' => $url->toArray()),
36
        200
37
    );
38
}

आइए उनका परीक्षण करें:

1
$ curl --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url
2
{
3
    "error": false,
4
    "urls": [
5
       {
6
            "created_at": "2013-02-01 02:39:10",
7
            "description": "A Search Engine",
8
            "id": "2",
9
            "updated_at": "2013-02-01 02:39:10",
10
            "url": "http://google.com",
11
            "user_id": "1"
12
        },
13
        {
14
            "created_at": "2013-02-01 02:44:34",
15
            "description": "A Great Blog",
16
            "id": "3",
17
            "updated_at": "2013-02-01 02:44:34",
18
            "url": "http://fideloper.com",
19
            "user_id": "1"
20
        }
21
    ]
22
}
23
24
$ curl --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url/1
25
{
26
    "error": false,
27
    "urls": [
28
        {
29
            "created_at": "2013-02-01 02:39:10",
30
            "description": "A Search Engine",
31
            "id": "2",
32
            "updated_at": "2013-02-01 02:39:10",
33
            "url": "http://google.com",
34
            "user_id": "1"
35
        }
36
    ]
37
}

लगभग हो गया। आइए अब यूज़र्स को URL हटाने की अनुमति दें।

1
/**

2
 * Remove the specified resource from storage.

3
 *

4
 * @param  int  $id

5
 * @return Response

6
 */
7
public function destroy($id)
8
{
9
    $url = Url::where('user_id', Auth::user()->id)->find($id);
10
11
    $url->delete();
12
13
    return Response::json(array(
14
        'error' => false,
15
        'message' => 'url deleted'),
16
        200
17
        );
18
}

अब, हम एक DELETE रिक्वेस्ट का उपयोग करके एक URL को डिलीट सकते हैं:

1
$ curl -i -X DELETE --user firstuser:first_password localhost/l4api/public/index.php/api/v1/url/1
2
HTTP/1.1 200 OK
3
Date: Tue, 21 May 2013 19:24:19 GMT
4
Content-Type: application/json
5
6
{"error":false,"message":"url deleted"}

अंत में, आइए यूज़र्स को URL अपडेट करने दें।

1
/**

2
 * Update the specified resource in storage.

3
 *

4
 * @param  int  $id

5
 * @return Response

6
 */
7
public function update($id)
8
{
9
    $url = Url::where('user_id', Auth::user()->id)->find($id);
10
11
    if ( Request::get('url') )
12
    {
13
        $url->url = Request::get('url');
14
    }
15
16
    if ( Request::get('description') )
17
    {
18
        $url->description = Request::get('description');
19
    }
20
21
    $url->save();
22
23
    return Response::json(array(
24
        'error' => false,
25
        'message' => 'url updated'),
26
        200
27
    );
28
}

URL अपडेट का परीक्षण करने के लिए, चलाएं:

1
$ curl -i -X PUT --user seconduser:second_password -d 'url=http://yahoo.com' localhost/l4api/public/index.php/api/v1/url/4
2
HTTP/1.1 200 OK
3
Date: Tue, 21 May 2013 19:34:21 GMT
4
Content-Type: application/json
5
6
{"error":false,"message":"url updated"}
7
8
// View our changes
9
$ curl --user seconduser:second_password localhost/l4api/public/index.php/api/v1/url/4
10
{
11
    "error": false,
12
    "urls": [
13
        {
14
            "created_at": "2013-02-01 02:44:34",
15
            "description": "I feel for him",
16
            "id": "3",
17
            "updated_at": "2013-02-02 18:44:18",
18
            "url": "http://yahoo.com",
19
            "user_id": "1"
20
        }
21
    ]
22
}

और बस

अब हमारे पास पूरी तरह से काम करने वाली API की शुरुआत है। मुझे आशा है कि आपने Laravel 4 के साथ एक API कैसे चलाना है, इस बारे में बहुत कुछ सीखा है।

संक्षेप में, हमने इस लेसन में निम्न को प्राप्त किया:

  1. Laravel को इनस्टॉल करना
  2. माइग्रेशन और सीडिंग का उपयोग कर डेटाबेस बनाना
  3. Eloquent ORM मॉडल का प्रयोग करना
  4. बेसिक Auth के साथ ऑथेंटिकेशन करना
  5. API वर्जन सहित रूट सेट करना
  6. रिसोर्सफुल कंट्रोलर्स का उपयोग कर API की फंक्शनलिटी को बनाना

अगले स्टेप्स

यदि आप अपने API को एक पायदान पर पुश करना चाहते हैं, तो आप निम्न में से किसी एक को अगले स्टेप के रूप में देख सकते हैं।

  1. वेलिडेशन (हिंट: Laravel में एक वेलिडेशन लाइब्रेरी है)।
  2. API-रिक्वेस्ट एरर हैंडलिंग - API रिक्वेस्ट्स पर HTML रिस्पांस प्राप्त करना अभी भी संभव है (हिंट: Laravel एरर हैंडलिंग, साथ ही कंटेंट नेगोशियेशन।)
  3. कंटेंट नेगोशियेशन - स्वीकृति हेडर के लिए सुनना। (हिंट: Laravel की Request क्लास आपको रिक्वेस्ट हैंडर्स देगी)।
  4. API क्राफ्ट Google ग्रुप को देखें।
  5. विभिन्न प्रकार के कैशिंग के बारे में जानें और वेलिडेशन कैशिंग आपके API को कैसे सुधार सकता है।
  6. अपने कोड को यूनिट टेस्ट करें।
  7. Apigee एक महान API रिसोर्स को देखें।
  8. Envato Market पर उपलब्ध कुछ उपयोगी Laravel स्क्रिप्ट और प्लगइन्स को आज़माएं।
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.