دریافت داده های JSON از یک API خارجی با ()wp_remote_get

دریافت داده های JSON با wp_remote_get

وردپرس برای مدیریت درخواست های HTTP تعدادی تابع مفید و ارزشمند تحت عنوان WP HTTP API در اختیارتان قرار می دهد که به کمک آنها می توانید با API های خارجی ارتباط برقرار کرده و داده های مدنظرتان را ارسال و دریافت کنید.

اگر در حال توسعه افزونه هستید و می خواهید در ساخت آن از سرویس هایی مثل MailChimp، Twitter، Instagram، Google Map و سایر API ها استفاده کنید، HTTP API به طور قابل ملاحظه ای کار شما را آسان می کند.

مجموعه HTTP API از چهار تابع اصلی زیر تشکیل شده است:

  • ()wp_remote_post : برای ارسال داده ها به یک API
  • ()wp_remote_get : برای بازیابی و دریافت داده ها از یک API
  • ()wp_remote_head : برای بازیابی هدر(Header) درخواست HTTP پس از دریافت پاسخ از یک API
  • ()wp_remote_retrieve_body : برای بازیابی بدنه(Body) درخواست HTTP پس از دریافت پاسخ از یک API

لازم به ذکر است که ما در این آموزش فقط به بررسی تابع ()wp_remote_get می پردازیم و از طریق آن داده های JSON را از یک API خارجی دریافت می کنیم.

چرا فرمت JSON؟

اکثر وب سرویس ها و API هایی که با آنها سر و کار خواهید داشت داده های خود را با فرمت JSON (مخفف Javascript Object Notation) ارسال می کنند، البته در گذشته ای نه چندان دور فرمت XML بسیار پرکاربرد بود، اما با ظهور JSON به ندرت از XML در پیاده سازی API ها استفاده می شود، هر چند ممکن است برخی وب سرویس ها از هر دو فرمت پشتیبانی کنند.

در هر صورت هر هدفی که دارید JSON یک فرمتی جهانی است که اکثر زبان های برنامه نویسی می توانند با آن کار کنند، سبک و قابل درک است و شباهت بسیار زیادی به آبجکت های جاوا اسکریپت دارد، اما کلید(Key) و مقادیر(Value) رشته ای حتما باید در داخل دابل کوتیشن قرار داشته باشد.

ساختار کلی کلید و مقدار در JSON بدین صورت است.

{
    "key": "value"
}

نمونه ای از داده های JSON که یک API برگشت داده است.

[
    { "id": 1, "name": "Jack" }, 
    { "id": 2, "name": "Rose" }, 
    { "id": 3, "name": "Jill" }
]

فرمت JSON و PHP

برای استفاده از داده های JSON باید آنها را به فرمتی ترجمه و تبدیل(Translate/Convert/Parse) کنید که برای PHP قابل درک باشد، برای این منظور از تابع ()json_decode استفاده می کنیم.

$users_json = '[
    { "id": 1, "name": "Jack" },
    { "id": 2, "name": "Rose" },
    { "id": 3, "name": "Omid" }
]';

// Translate JSON into an object 
$users_obj = json_decode( $users_json );

foreach ( $users_obj as $user ) {
    echo '<p>' . $user->name . '</p>';
}

// Translate JSON into an array 
$users_array = json_decode( $users_json, true );

foreach ( $users_array as $user ) {
    echo '<p>' . $user['name'] . '</p>';
}

در صورتی که داده های JSON از لحاظ ساختاری هیچ مشکلی نداشته باشند ()json_decode به صورت پیش فرض آنها را به آبجکت تبدیل می کند، اگر به پارامتر دوم این تابع مقدار true پاس دهید داده ها به آرایه انجمنی(Associative Array) کانورت می شوند.

سرویس JSON Place Holder

در این مرحله برای اینکه بتوانیم روش استفاده از تابع ()wp_remote_get را در عمل بررسی کنیم لازم است به یک سرویس رایگان به نام JSONPlaceholder متصل شویم، این سرویس تعدادی REST API جعلی برای آزمایش و نمونه سازی در اختیارمان قرار می دهد.

در تصویر زیر لیست منابع شبیه سازی شده JSONplaceholder را مشاهده می کنید، روی هر کدام از لینک ها که کلیک کنید داده های مربوطه با فرمت JSON بارگذاری خواهد شد.

سرویس JSONPlaceholder

تابع ()wp_remote_get

از بین ۶ منبعی که JSONPlaceholder ارائه داده است ما API لیست نوشته ها(Posts) را انتخاب کردیم، حالا با استفاده از ()wp_remote_get داده های مربوط به نوشته ها را از سرور JSONPlaceholder دریافت می کنیم. برای این منظور URL نوشته ها را به ()wp_remote_get پاس می دهیم.

$response = wp_remote_get( 'https://jsonplaceholder.typicode.com/posts' );

تابع wp_remote_get() بر اساس URL مشخص شده با سرور ارتباط برقرار می کند و آرایه ای شامل هدر درخواست(Headers)، کوکی(Cookies)، بدنه درخواست(Body) و وضعیت پاسخ سرور(Response) را دریافت کرده و در متغیر $response ذخیره می کند.

برای بررسی این موضوع حتما مقدار $response را در خروجی مشاهده کنید.

echo '<pre>';
print_r( $response );
echo '</pre>';

بسیار خب، قبل از اینکه اقدامی بر روی لیست نوشته ها انجام دهیم مطمئن می شویم که هیچ خطایی در فرآیند ارتباط و دریافت داده ها از سرور JSONPlaceholder اتفاق نیفتاده باشد، خوشبختانه تابع ()wp_remote_get در صورت بروز خطا یک آبجکت WP_Error برگشت می دهد که برای بررسی وجود خطا بسیار عالی است.

پس کدهای بالا را به صورت زیر تغییر می دهیم.

$response = wp_remote_get( 'https://jsonplaceholder.typicode.com/posts' );
if ( !is_wp_error( $response ) && $response['response']['code'] == 200 ) {
     // Todo ... 
}

پس از بررسی اینکه درخواست ما هیچگونه خطایی ندارد به سراغ داده های دریافتی می رویم، همانطور که در بالا اشاره کردیم مقادیر مختلفی در متغیر $response وجود دارد، ما فقط به بدنه(Body) درخواست احتیاج داریم چرا که لیست نوشته ها با فرمت JSON در آنجا نگهداری می شود.

حالا به کمک تابع ()wp_remote_retrieve_body داده های JSON را از متغیر $response استخراج می کنیم و در متغیر $body قرار می دهیم.

$response = wp_remote_get( 'https://jsonplaceholder.typicode.com/posts' );
if ( !is_wp_error( $response ) && $response['response']['code'] == 200 ) {
    $body = wp_remote_retrieve_body( $response );
}

در حال حاضر داده هایی که منتظرش بودیم در متغیر $body قرار دارد، تنها کاری که باید انجام دهیم تبدیل JSON به فرمتی قابل خواندن است.

$response = wp_remote_get( 'https://jsonplaceholder.typicode.com/posts' );
if ( !is_wp_error( $response ) && $response['response']['code'] == 200 ) {
    $body = wp_remote_retrieve_body( $response );
    $posts = json_decode( $body );
}

پس از decode کردن داده های JSON حالا می توانیم با آن مثل هر آبجکت یا آرایه ای در PHP رفتار کنیم، همانطور که ملاحظه می کنید با حلقه foreach عنوان پست و ۲۰ کاراکتر از محتوای پست را نمایش دادیم.

$response = wp_remote_get( 'https://jsonplaceholder.typicode.com/posts' );

if ( !is_wp_error( $response ) && $response['response']['code'] == 200 ) {

    $body = wp_remote_retrieve_body( $response );
    $posts = json_decode( $body );

    if ( !empty( $posts )) {

        echo '<ul>';
        foreach ( $posts as $post ) {
            echo '<li>Post Title: ' . $post->title . '</li>';
            echo '<li>Post Content: ' . wp_trim_words( $post->body, 20 ) . '</li>';
        }
        echo '</ul>';
        
    }

}

جمع بندی

API مدنظر شما هر چه که باشد، اگر داده های خود را با فرمت JSON در اختیارتان قرار می دهد مراحل کلی چیزی است که در این آموزش بررسی کردیم.

  1. دریافت داده های JSON با تابع ()wp_remote_get
  2. بررسی خطاهای احتمالی
  3. بازیابی بدنه درخواست با تابع ()wp_remote_retrieve_body
  4. تبدیل داده های JSON به یک آرایه یا آبجکت

برچسب ها
سعید یاورنیا 117 نوشته 118 دیدگاه

توسعه دهنده وب، کارشناس ارشد نرم افزار.

دیدگاه ‌ها

  • amirdotf ۲۱ اردیبهشت ۱۳۹۹ - ۰۳:۱۹

    با سلام

    من پروژه ایی دارم برای طراحی سایت قطغات خودرو
    اظهارات کارفرما بدین شرح است :

    ارسال اطلاعات هر محصول به صورت خودکار و پریودیک از نرم افزار حسابداری به سمت
    سایت که این کار با همکاری یک برنامه نویس انجام شده و اطالعات به فرمت json آماده
    ارسال به درگاه سایت می باشد.که فیلد های اطالعاتی عبارت اند از:

    ۱ نام کاال –
    ۲ کد کاال –
    ۳ شماره فنی –
    ۴ تعداد موجودی مقدار موجودی نمایش داده نشود.
    ۵ نام التین عبارت انگلیسی
    ۶ واحد فرعی )نوع بسته بندی مثالً کارتن یا بسته…(
    ۷ ضریب واحد فرعی )تعداد در آن بسته بندی(
    ۸ قیمت عمده فروشی )نمایش فقط برای مشتریان خاص شرکت(
    ۹ قیمت خورده فروشی ) نمایش برای عموم مردم(
    ۱۰ دوره وصول
    )که همان مهلت پرداخت هر محصول می باشد که
    بسته به نوع برند متفاوت می باشد برای مثال برند
    کروز به صورت نقدی و برند GISP 3 ماه و برند
    دیناپارت ۴ ماه(
    )نمایش فقط برای مشتریان خاص شرکت(
    ۱۱ واحد اصلی دست یا عدد

    راهی هست که این اطلاعات رو بگیرم و به وو کامرس بدم
    خواهش میکنم راهنمایی کنید🙏

  • amirdotf ۲۲ اردیبهشت ۱۳۹۹ - ۰۲:۲۰

    فوق العاده متشکر

    فقط دو لینکی که در آخر گذاشتید ، هیچکدوم باز نمی شوند

    من هیچ اطلاعاتی در این باره ندارم
    می شه منبعی رو معرفی کنید که آموزش کار با این افزونه رو ساده توضیح بده؟
    باز هم ممنون.

    • سعید یاورنیا ۲۲ اردیبهشت ۱۳۹۹ - ۱۱:۰۱

      خواهش می کنم دوست عزیز.
      متاسفانه برای مشاهده لینک ها vpn لازمه، منابع فارسی آموزش کار با افزونه ووکامرس زیاده، کافیه گوگل کنید.
      اما برای توسعه ووکامرس که شما در حال حاضر به اون نیاز دارید باید از مستندات وب سایت ووکامرس، منابع خارجی و یوتیوب استفاده کنید.

دیدگاهتان را بنویسید.

نشانی ایمیل شما منتشر نخواهد شد، بخش‌های موردنیاز با * مشخص شده‌اند.