در مطلب قبلی در مورد فرمت JSON و کاربرد رشته کوئری (Query String) صحبت کردیم. در این مطلب توسط کتابخانه cURL می خواهیم محتوای داده های JSON را از وب دریافت کنیم. cURL در پی اچ پی باز نویسی شده کتابخانه libcurl است. libcurl کتابخانه ای نوشته شده توسط Daniel Stenberg به زبان سی است که این امکان را می دهد تا بتوانیم به انواع سرورها با انواع متفاوت پروتکل ها متصل شویم. درحال حاظر libcurl از انواع پروتکل های زیر پشتیبانی می کند.

http – https – ftp – gopher – telnet – dict ile – ldap

آماده سازی جلسه cURL

cURL در پی اچ پی دارای تعداد زیادی از توابع است که می توانید فهرست آنها را از اینجا ببینید. گام نخست در به کار گیری cURL ایجاد یک جلسه (Session) جدید است که این کار توسط تابع ()curl_init انجام می شود. پس از ایجاد جلسه باید به ترتیب توسط توابع ()curl_setopt و ()curl_exec و ()curl_clode باید درخواست ها را به سرور مقصد اداره کنیم.

تابع ()curl_init یک پارامتر اختیاری را دریافت می کند که این مقدار این پارامتر آدرس URL هدف است. به طور کلی نیازی نیست این پارامتر را مقدار دهی کنیم ولی چیزی که مهم است اینکه با اجرای این تابع یک شی یا متغیر ایجاد می کنیم که به این جلسه cURL اشاره می کند.

پس از ایجاد جلسه cURL باید ویژگی های مختلف را برای آن جلسه تعیین کنیم. برای این منظور از تابع ()curl_setopt استفاده می شود. آرگومان نخست این تابع نام متغیری است که به یک جلسه cURL اشاره می کند. این متغیر را پیش از این و توسط تابع ()curl_init ایجاد کرده بودیم که در این مطلب آنرا ch$ نامگذاری کرده بودیم. بنابراین در توابع بعدی، برای اشاره به یک جلسه، از نام متغیری استفاده می شود که پیش از این از اجرای تابع ()curl_init ایجاد شده بود.

آرگومان دوم تابع ()curl_setopt یک ویژگی را تعیین می کند که می خواهیم برای جلسه فعلی تعیین کنیم. ویژگی هایی که در آرگومان دوم قابل استفاده هستند به فرمت CURLOPT_XXX هستند و همگی از پیش درون پی اچ پی تعریف شده اند. می توانید از اینجا فهرست کامل آنها را مطالعه کنید.

نخستین ویژگی که باید تعریف کنیم، آدرس URL است که می خواهیم محتوای آنرا دریافت کنیم. در این مطلب می خواهیم محتوای JOSN را از یک آدرس به فرمت زیر دریافت کنیم. همانطور که می بینید در انتهای آن یک رشته کوئری وجود دارد که متشکل از دو کلید است. کلید q که پس از آن نام شهر می آید و کلید appid که پس از آن رشته API KEY می آید. بنابراین اگر آدرس زیر را در مرورگر اجرا کنید باید خروجی شکل زیر را ببینید.

بنابراین باید در گام نخست، آدرس URL بالا را به عنوان آرگومان سوم و مطابق کد زیر به تابع ()curl_setopt ارسال کنیم. توجه کنید آرگومان نخست نام متغیر ch$ است که به یک جلسه اشاره می کند. آرگومان دوم CURLOPT_URL و آرگومان سوم رشته ای است که آدرس URL را تعیین می کند.

ویژگی CURLOPT_URL برای تعیین آدرس URL استفاده می شود. با تنظیم این ویژگی تقریبا همه چیز آماده است و می توانیم تابع ()curl_exec را اجرا کنیم. تابع ()curl_exec زمانی فرخوانی می شود که تمامی ویژگی ها توسط تابع ()curl_setopt تنظیم شده اند. توجه کنید به ازای هر ویژگی که می خواهید تنظیم کنید باید یک بار تابع ()curl_setopt را فراخوانی کنید.

همانطور که می بینید تابع ()curl_exec یک آرگومان ورودی دریافت می کند که آن نام متغیری است که به یک جلسه اشاره می کند. تابع ()curl_exec یک درخواست به سرور (آدرس URL) هدف را اجرا می کند. در نهایت پس از اینکه پاسخ دریافت شد آنرا درون یک متغیر ذخیره می کنیم. در این مطلب متغیر را urlContent$ نامگذاری کرده ایم.

توجه کنید تابع ()curl_exec به صورت پیش فرض محتوای بدست آمده را درخروجی نشان می دهد ولی ما می خواهیم خروجی را درون یک متغیر به نام urlContent$ ذخیره کنیم. برای این منظور و پیش از اجرای تابع ()curl_exec باید ویژگی CURLOPT_RETURNTRANSFER را با مقدار ۱ تنظیم کنیم.

در نهایت و پس از بدست آوردن محتوای آدرس URL باید با فراخوانی تابع ()curl_close جلسه باز شده cURL را ببنید. این تابع نیز نام یک متغیری را دریافت می کند که به یک جلسه cURL اشاره دارد. بنابراین روند فراخوانی توابع cURL به صورت زیر است.

تبدیل محتوای JSON به آرایه انجمنی پی اچ پی

توسط تابع ()curl_exex از کتابخانه cURL توانستیم محتوای JOSN را از آدرس URL درون متغیر ذخیره کنیم. توجه کنید داده هایی که بدست آوردیم به فرمت JSON هستند و از این رو درون برنامه پی اچ پی قابل استفاده نمی باشند، بنابراین باید از تابعی به نام ()json_decode استفاده کنیم تا فرمت JSON را به یک آرایه انجمنی تبدیل کنیم.

بنابراین نام متغیری که حاوی داده های json است را به تابع ()json_decode ارسال کرده ایم. در کد بالا متغیر  jsonData$ در واقع یک آرایه انحمنی است. کلیدهای آرایه انجمنی ایجاد شده از اجرای تابع ()json_decode برابر با کلیدهای درون داده JSON هستند.

برای اینکه محتوای آرایه انجمنی را متوجه شوید می توانید از تابع ()printf_r استفاده کنید. به طور کلی در پی اچ پی سه تابع به نام ()print_r و ()var_dump و ()var_export هر یک محتوای یک متغیر (به خصوص آرایه ای) را به صورت خوانا تر و قابل درک تر توسط کاربران نمایش می دهد. ما در ادامه همین مطلب از تابع ()var_export استفاده کرده ایم.

اگر به اولین شکل در همین مطلب نگاه کنید می توانید محتوای JSON خروجی را ببینید. بنابراین کلید coord در خروجی JSON معادل یک کلید در آرایه انجمنی است. مقدار کلید coord در فرمت json مجدد یک نوع  JSON است که خودش دارای دو کلید به نام های lon و lat است. اما در آرایه انجمنی چگونه این JSON درونی و دو کلید آنرا نمایش داده می شود.

مطابق خروجی زیر که نتیجه اجرای دستور زیر است می توانید تک تک المان های آرایه که شامل کلیدها و مقادیر آنها است را ببینید.

به طور مثال مقدار کلید coord یک زیر آرایه انجمنی با دو کلید به نام های lon و lat است که مقدار این دو کلید دیگر مقادیر عددی است. پس اگر بخواهیم به مقدار عددی کلید lat دسترسی پیدا کنیم و مثلا آنرا درون یک متغیر جدید ذخیره کنیم باید به صورت زیر عمل کنیم.

اما در مورد المان بعدی که نام کلید آن weather است. این المان چیزی است که در مطلب بعدی از آن برای بدست آوردن اطلاعات پایه ای وضعیت آب و هوا استفاده می کنیم. اگر دقت کنید می بینید که مقدار کلید weather عدد صفر است و به این معنی است که تک عنصری است که شماره اندیس آن عدد صفر است. حال خود این تک عنصر یک آرایه انجمنی با چهار کلید به نام های id و main و description و  icon است.

بنابراین اگر بخواهیم اطلاعات وضعیت آب و هوا را از مقدار کلید weather بدست آوریم باید مثلا کد زیر را استفاده کنیم. با دقت به کد زیر می بینید که اولا به کلید weather دسترسی پیدا می کنیم و سپس به تک عنصر درون آن و از طریق اندیس ۱ دسترسی پیدا کرده ایم و در نهایت به کلید description از همان تک عنصر با اندیس صفر دسترسی پیدا کرده ایم.

در مطلب بعدی از طریق همین خروجی بالا و نام کلیدهای درون آرایه انجمنی برای بدست آوردن و نمایش وضعیت آب و هوا استفاده کرده ایم.

همیشه یکی از سه تابع ()print_r یا ()var_dump و یا ()var_export را استفاده کنید تا بتوانید ساده تر و خواناتر محتوای یک آرایه را بخوانید ومتوجه شوید در غیر این صورت در زمان دسترسی به مقدارها با مشکل مواجه می شوید.

جمع بندی

بنابراین ابتدا با توابع کتابخانه ای cURL محتوای JSON را از یک URL خواندیم و سپس محتوای بدست آمده را درون یک متغیر به نام urlContent$ ذخیره کردیم. برای استفاده از کتابخانه cURL ابتدا باید توسط تابع ()curl_init یک جلسه ایجاد کنیم . نتیجه فراخوانی تابع درون یک متغیر ذخیره می شود که از این پس توسط همین متغیر به جلسه اشاره می کنیم.

پس از آن و طبق نیاز با در هر مرتبه از فراخوانی تابع ()curl_setopt ویژگی های متفاوت جلسه مانند آدرس URL را تنظیم کنیم و پس از تنظیم تمامی موارد باید ابتدا تابع ()curl_exec را فراخوانی و سپس تابع ()curl_close را فراخوانی کنیم. در نهایت محتوای JSON بدست آمده را توسط تابع ()json_decode به یک آرایه انجمنی پی اچ پی تبدیل می کنیم.

دانلود کد Laravel PHP Json Part1