نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی
  • خانه
  • برنامه ها
  • درخواست اول به api. رویکرد صحیح برای استفاده از Vkontakte API

درخواست اول به api. رویکرد صحیح برای استفاده از Vkontakte API

اولین مراحل بسیار ساده است: یک مخزن ایجاد کنید و یک گوهر ساده را در آن مقداردهی اولیه کنید. می توان با دستور bundle gem gem_name یک Gem جدید ایجاد کرد و یک مخزن در Github ایجاد کرد. اتفاقاً اینجاست: https://github.com/Fodoj/groovehq.

اول از همه، من قابلیت احراز هویت درخواست‌ها را به GrooveHQ API اضافه می‌کنم و سپس یک حداقل می‌نویسم. کد مورد نیازبرای دریافت لیست تمام بلیط ها خوشبختانه، مستندات مربوط به API این سرویس دقیق و قابل درک است، بنابراین ایجاد یک درخواست GET دشوار نخواهد بود.

حداقل مشتری

من با نوشتن یک GrooveHQ کوچک شروع می کنم :: کلاس Client که مسئول ایجاد درخواست های API خواهد بود. سازنده این کلاس خواهد گرفت نشانه دسترسی.

# ./lib/groovehq/client.rb ماژول GrooveHQ کلاس Client def initialize (access_token = nil) @access_token = access_token || انتهای انتهایی ENV ["GROOVEHQ_ACCESS_TOKEN"]

نحوه دسترسی به API

اکنون باید نحوه دسترسی به API را بیابیم. تا به اینجا، من هرگز از httparty gem برای درخواست استفاده نکرده ام. تجربه من محدود به کتابخانه های RestClient و Faraday است. من فکر نمی کنم وجود داشته باشد یک تفاوت بزرگاز کدام کتابخانه استفاده کنم، اما برای جالب تر کردن روند، httparty را انتخاب می کنم. علاوه بر این، او ستاره های زیادی در GitHub دارد :)

در واقع از فارادی متنفرم.

من خط زیر را به groovehq.gemspec اضافه می کنم:

# ./groovehq.gemspec # ... مشخصات. add_dependency "httparty" # ...

و bundle install را اجرا کنید. فقط برای اتصال httparty در داخل باقی مانده است. / Lib / groovehq.rb:

انجام اولین درخواست API

برای بررسی اینکه همه چیز طبق انتظار کار می کند، یک متد perform_request اضافه می کنم که مسیر را به نقطه API می برد و JSON را با نتیجه درخواست برمی گرداند. همانطور که در مستندات API نشان داده شده است، برای مجوز، از هدر HTTP مجوز استفاده خواهم کرد. من گزینه ای با پارامتر query را دوست ندارم، زیرا برای درخواست های POST کار نمی کند.

# ./lib/groovehq/client.rb # ... def perform_request (path) url = "https://api.groovehq.com/v1/ # (مسیر)" پاسخ = HTTParty. دریافت (url، headers: ("Authorization" => "Bearer # (@access_token)")) JSON. تجزیه (پاسخ. بدنه) پایان # ...

بیایید با اجرای دستور bundle exec irb در پوشه gem بررسی کنیم که آیا همه چیز همانطور که باید کار می کند یا خیر. سپس کدهای زیر را یکی یکی اجرا می کنیم:

نیاز به "./lib/groovehq.rb" client = GrooveHQ :: Client. مشتری جدید ("your_access_token"). perform_request ("من") # me معمولاً مسئول بازگرداندن اطلاعات مربوط به مالک نشانه است

در نتیجه، اگر از نشانه دسترسی صحیح استفاده شود، هش چیزی شبیه به این را در کنسول دریافت خواهید کرد:

("عامل" => ("ایمیل" => " [ایمیل محافظت شده]"," first_name "=>" Kirill "," last_name "=>" Shirinkin "," href "=> "https://api.groovehq.com/v1/agents/ [ایمیل محافظت شده]" , "پیوندها" => ("بلیط" => ("href" => "https://api.groovehq.com/v1/tickets?assignee=fodojyko%40gmail.com" } } } }

به نظر می رسد که ما یک نسخه حداقل کاری از جواهر داریم! commit با تغییرات اینجاست: f7d9eef.

روش #perform_request برای چیزی بیشتر از اشکال‌زدایی ایجاد شده است، بنابراین شامل موارد دیگری نمی‌شود خلقت صحیحرشته های پیوند

افزودن ساختار

بعدش چی؟

وظیفه بعدی من اضافه کردن هر چه بیشتر منابع به دنبال اسناد API خواهد بود. در مورد مشکلاتی که در این فرآیند با آن مواجه خواهم شد - در مقاله بعدی.

نمونه ای از درخواست API که 20 رویداد نزدیک در مسکو و سن پترزبورگ را برمی گرداند:

https://api.timepad.ru/v1/events.json?limit=20&skip=0&cities=Moscow,Sankt-Petersburg&fields=location&sort=+starts_at

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

https: // - دسترسی به API فقط از طریق https امکان پذیر است، هنگام تلاش برای دریافت داده از طریق http، خطای 400 نمایش داده می شود. این به شما امکان می دهد یکپارچگی داده ها را تضمین کنید و از انتقال هرگونه اطلاعات حساس به صورت رمزگذاری نشده جلوگیری کنید.

api.timepad.ru/v1 - Timepad API در یک دامنه جداگانه قرار دارد، نسخه سازی در آدرس تعبیه شده است. این کار به این دلیل انجام می شود که اگر نسخه 2 ظاهر شد، انتقال به آن اختیاری خواهد بود و نسخه اول تا زمانی که مشتری دارد به کار خود ادامه می دهد.

/ رویدادها یک منبع رویداد، یکی از منابع اصلی API است. با استفاده از آن، می‌توانید به پایگاه داده‌های سخنرانی‌ها، سمینارها، کنسرت‌ها، کنفرانس‌ها، گردهمایی‌ها و جلساتی که از طریق Timepad برگزار می‌شوند، دسترسی داشته باشید و به یکی از ده‌ها روش ممکن فیلتر کنید.

Json - نشانه ای از قالب داده مورد نظر. Json و html پشتیبانی می شوند. اگر چیزی مشخص نشده باشد، API فرمت را به طور خودکار شناسایی می کند: html در مرورگر، json در همه موارد دیگر.

& sort = + starts_at - مرتب سازی بر اساس تاریخ شروع رویداد به ترتیب صعودی. همچنین امکان مرتب سازی بر اساس چندین پارامتر دیگر وجود دارد.

انتخاب فیلدهایی برای نمایش

رویداد API فقط برخی از پرکاربردترین فیلدهای رویداد را نمایش می‌دهد: عنوان، دسته، تاریخ شروع، پیوند، پوستر.

برای نمایش سایر فیلدهای رویداد، باید آنها را در پارامتر فیلدهایی که با کاما از هم جدا شده اند، مشخص کنید، به عنوان مثال:

در نتیجه چنین درخواستی بعلاوهفیلدهای پیش‌فرض همچنین یک شی مکان رویداد و یک شی داده اضافی را در مورد وضعیت ثبت رویداد برای رویداد درج می‌کنند. اشیاء داخلییا به طور کامل نمایش داده نمی شود، یا به طور کامل نمایش داده می شود، قسمت فیلدها بر محتوای آنها تأثیر نمی گذارد.

لیست فیلدهایی که می توانند نمایش داده شوند را می توان در اسناد آنلاین مشخص شده پیدا کرد اختیاریمانند تصویر:

مرتب سازی مقادیر

Timepad API از مرتب سازی بر اساس یکی از فیلدهای زیر پشتیبانی می کند:

نام
شروع میشود از
شهر
ارجاع_درصد
ایجاد شده در
شناسه

نام فیلد مرتب سازی باید در درخواست مشخص شود، به عنوان مثال:

برای مرتب سازی به ترتیب نزولی، باید - قبل از نام فیلد را مشخص کنید، به عنوان مثال:
https://api.timepad.ru/v1/events?sort=-id

هنگام مرتب‌سازی به ترتیب صعودی، می‌توانید به صورت اختیاری قبل از نام یک علامت مثبت نشان دهید، برای مثال،

صفحه بندی

هر لیستی در API به صفحات تقسیم می شود. برای کنترل آنها پارامترهای زیر وجود دارد:

محدود - تعداد عناصر برای بازگشت
skip - تعداد مواردی که باید رد شوند

بنابراین، به عنوان مثال، اگر رویدادها را تا 10 دریافت کنید، درخواست ها به این صورت خواهند بود:
https://api.timepad.ru/v1/events?limit=10
https://api.timepad.ru/v1/events?limit=10&skip=10
https://api.timepad.ru/v1/events?limit=10&skip=20
https://api.timepad.ru/v1/events?limit=10&skip=30
...
و غیره

در این مورد، پاسخ به این صورت است:

("مجموع": "123"، "ارزش ها": [...])

مجموع تعداد کل عناصر در انتخاب را نشان می دهد و مقادیر شامل عناصر مربوط به تنظیمات صفحه بندی هستند.

زمینه های خالی

API به طور پیش فرض فیلدهایی با مقادیر خالی را حذف می کند (آرایه های خالی، خطوط خالی، خالی). در مواردی که به مقادیر خالی نیاز دارید، باید پارامتر show_empty_fields را با مقدار true مشخص کنید.

سلام، هابر!

در یک زمان، با گشت و گذار در اینترنت برای استفاده منطقی از Vkontakte API، چیزی قابل فهم پیدا نکردم، تنها کتابخانه هایی که یافتم بدون استفاده از روش های پذیرفته شده عمومی و بدون استفاده از آن پیاده سازی شدند. کد زیبا... تصمیم گرفتم این سوء تفاهم را اصلاح کنم و کتابخانه خودم را برای کار با Vkontakte API نوشتم.
جزئیات و رویکردهای پر جنب و جوش تحت حاکمیت.

اتفاقاً Vk API کاملاً خوب پیاده سازی شده است، به استثنای برخی از نکات غیر منطقی که بعداً به آنها اشاره خواهم کرد. اما امروز ما در مورد کیفیت صحبت نمی کنیم، بلکه در مورد یک برنامه خاص صحبت می کنیم.

فوراً لازم است رزرو کنید، علاوه بر توضیحات، تکه هایی از کدهای کاری را به کتابخانه خود خواهم آورد، پیوندی که در پایان مقاله به آن خواهم داد. کتابخانه بر روی دومی اجرا می شود نسخه پایدار 5.5، اگر ژنراتورها را از دریافت دسته ای جدا کنید، باید روی 5.4 کار کند.

  • مجوز سرور (به اصطلاح مجوز سایت)
  • مجوز مشتری (مستقل)
  • مجوز سرور برنامه
جالب ترین مورد برای توسعه دهنده دو مورد اول است. اولی به شما اجازه می دهد تا یک کاربر را در سایت مجوز دهید و کلید دسترسی او را دریافت کنید، دومی به شما اجازه می دهد تا برنامه خود را مجوز دهید، به عنوان مثال Dekstop یا Mobile. با نگاهی به آینده، گزینه دوم در اختیار ما قرار می دهد فرصت های بزرگو اولی، تنها بخش کوچکی از آنهاست.

الگوریتم برای به دست آوردن در حالت اول به اجرای نکات زیر کاهش می یابد:

  • ما پیوندی را برای مجوز کاربر نمایش می دهیم که مطابق با اسناد قالب بندی می کنیم
  • کاربر آن را دنبال می کند و وارد می شود
  • کاربر با کد پارامتر GET به REDIRECT_URI برنامه ما هدایت می شود
  • برنامه ما باید یک درخواست به API حاوی کد برای دریافت رمز دسترسی کاربر ارسال کند
  • API یا با یک شی حاوی نشانه دسترسی یا یک خطا پاسخ می دهد.

نمونه‌ای از کدهایی که با آن می‌توانید این کار را انجام دهید، کار دشواری نیست.

$ auth = getjump \ Vk \ Auth :: getInstance (); $ auth-> setAppId ("3470411") -> setScope ("SCOPE") -> setSecret ("SECRET CODE") -> setRedirectUri ("http: //localhost/test.php"); نشانه $ = $ auth-> startCallback (); printf ("LINK"، $ auth-> getUrl ());

فرض بر این است که دامنه ما لوکال هاست و فایل فعلی test.php است. اگر همه چیز به خوبی پیش رفت، متغیر توکن $ ما حاوی کلید دسترسی کاربری است که مجوز را گذرانده است.

از لحظه ای که کلید دسترسی داریم، می توانیم اجرا کنیم درخواست های API... منطق کلی درخواست ساده است، شما یک درخواست ساخته شده خاص را به URL API ارسال می کنید. درخواست باید حاوی نام متد و آرگومان ها باشد.

api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN

فهرست روش ها، این یکی از چیزهای غنی در API است. در آن می‌توانید روش‌هایی را بیابید که برای کارشان نیازی به کلید دسترسی ندارند، بنابراین می‌توانید بدون دریافت آن با آنها تماس بگیرید.

هنگام استفاده از یک کتابخانه، باید یک شی پایه ایجاد کنیم، مانند زیر:
$ vk = getjump \ Vk \ Core :: getInstance () -> apiVersion ("5.5") -> setToken ($ token);

چند نمونه پرس و جو با استفاده از کتابخانه:

دقیقاً 100 شیء حاوی داده های کاربر از 1 تا 100 در هر کدام از تابع ناشناس عبور می کند. توجه داشته باشید که اگر فراخوانی تابع را حذف کنیم، هیچ درخواستی انجام نمی شود، همه به این دلیل است که یک شی برگردانده می شود که دارای روش های جادویی __call و __get overridden است. ، که به ما امکان می دهد زمانی که واقعاً به آن نیاز داریم درخواستی ارائه دهیم.
$ vk-> درخواست ("users.get"، ["user_ids" => محدوده (1، 100)]) -> هر کدام (تابع ($ i، $ v) (اگر ($ v-> last_name == "" ) بازگشت؛ چاپ $ v-> last_name.
"; });

یکی از چیزهایی که ما را با استفاده از ژنراتورها آشکار می کند، واکشی دسته ای است. یعنی فقط زمانی که به آن نیاز داشته باشیم داده ها را دریافت می کنیم. مثال زیر به ما این امکان را می دهد که همه پیام های خود را دریافت کنیم، درخواست های 100. مراقب باشید، روشاز شما می خواهد که حقوقی برای پیام ها داشته باشید، برنامه های کاربردی مستقل، همان مجوز و بر این اساس، انتقال کلید دسترسی.
foreach ($ vk-> درخواست ("messages.get") -> دسته (100) به عنوان داده $) ($ data-> هر (تابع ($ i، $ m) (اگر (isset ($ m-> بدنه) ) چاپ $ m-> بدنه. PHP_EOL;)))

روش خوبیهکه در API یافت می شود - اجرا کردن... این یک پارامتر کد را به عنوان آرگومان می گیرد، کد نوعی شبه جاوا اسکریپت است که به ما امکان می دهد کد خود را در سمت سرور اجرا کنیم، و همچنین به ما اجازه می دهد تا رویه های ذخیره شده ای را که می توانیم هنگام ویرایش برنامه خود ایجاد کنیم، اجرا کنیم.

من نتوانستم این مورد را نادیده بگیرم و آن را در کتابخانه پیاده کردم. به طور خلاصه، این امکان را به شما می دهد که چندین پرس و جو را به صورت یکجا اجرا کنید. نگاه کن مثال بعدیکد

$ js1 = $ vk-> درخواست ("messages.get"، ["count" => 200، "offset" => 0 * 200]) -> toJs (); // یک شی از نوع VkJs $ js2 = $ vk-> درخواست ("messages.get"، ["count" => 200، "offset" => 1 * 200]) -> toJs (); $ js3 = $ vk-> درخواست ("messages.get"، ["count" => 200، "offset" => 2 * 200]) -> toJs (); $ js4 = $ vk-> درخواست ("messages.get"، ["count" => 200، "offset" => 3 * 200]) -> toJs (); $ js1 -> append ($ js2) // js2 را به js1 اضافه می کنیم -> append ($ js3) -> append ($ js4) -> execute () // می خواهیم این کار را انجام دهیم (در واقع RequestTransaction را برمی گرداند) - > پاسخ // درخواست فقط اکنون اجرا می شود -> هر (تابع ($ i, $ v) // اولین تابع ناشناس برای عبور از تمام عناصر آرایه دریافتی از اجرا (آرایه ای از 4 عنصر، 4 درخواست) مورد نیاز است ) ($ v-> هر ( تابع ($ c, $ d) (// بعد از حلقه کردن تمام 200 پیام در هر آرایه if (isset ($ d-> body)) چاپ $ d-> بدن؛ // چاپ یک پیام در صورت وجود چنین فیلدی));) );

همانطور که قول داده بودیم، یکی از آن سوءتفاهم هایی است که ممکن است با آن مواجه شوید نسخه فعلیروش API (5.21).

مقالات مرتبط برتر