درخواست های HTTP در وردپرس

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

توابع _wp_remote

اغلب درخواست های HTTP از طریق توابع wp_remote_get، wp_remote_post و wp_remote_head که به ترتیب برای درخواست های GET، POST و HEAD تعریف شده اند، می توانند به اجرا در آیند.

این توابع به صورت یکسان عمل می کنند:

1) درخواست HTTP توسط متد ناشناس اجرا می شود

2) دو پارامتر ورودی می پذیرند: پارامتر اول آدرس URL که اجباری است و پارامتر دوم آرایه ای از آرگومان های درخواست.

3) پاسخ دریافتی به صورت آرایه یا شی است.

< ?php
        
$get_result  = wp_remote_get( $url, $args );
$post_result = wp_remote_post( $url, $args );
$head_result = wp_remote_head( $url, $args );
        
? >

با توجه به شباهت عملکرد این درخواست ها می توان همگی این درخواست ها را از طریق تابع دیگری به نام wp_remote_request و با تنظیم آرگومان روش درخواست به اجرا در آورد:

< ?php
        
$get_result  = wp_remote_request( $url, array( 'method' = >  'GET' ) );
$post_result = wp_remote_request( $url, array( 'method' = >  'POST' ) );
$head_result = wp_remote_request( $url, array( 'method' = >  'HEAD' ) );
        
? >  

در ادامه به بحث در مورد پارامترهای ورودی این توابع و داده های برگشتی آنها می پردازیم.

پارامترهای ورودی

پارامتر اول این توابع آدرس URL سایتی است که درخواست به آن ارسال می گردد. پروتکل آدرس می تواند HTTP یا HTTPS باشد. پارامتر دوم تابع آرایه ای از آرگومان های مرتبط با درخواست است که مقادیر پیش فرض آنها به صورت زیر است:

< ?php
        
$defaults = array (
    'method' = >  'GET',
    'timeout' = >  5,
    'redirection' = >  5,
    'httpversion' = >  '1.0',
    'user-agent' = >  'WordPress/3.1; http://example.com/',
    'blocking' = >  true,
    'headers' = >  array (),
    'cookies' = >  array (),
    'body' = >  NULL,
    'compress' = >  false,
    'decompress' = >  true,
    'sslverify' = >  true,
)
        
? >   

در این آرایه method بیانگر روش درخواست، timeout مهلت زمانی برای ایجاد ارتباط با سرور، user-agent بیانگر ارسال کننده درخواست، headers آرایه ای از هدرهای اضافی، cookies آرایه ای از مقادیر کوکی ارسالی به سرور و body بیانگر بدنه درخواست که شامل داده ارسالی به سرور است که میتواند به صورت رشته یا آرایه باشد. شما می توانید پیش از ارسال درخواست این مقادیر پیش فرض را تغییر دهید:

< ?php
        
$args = array(
    'user-agent' = >  'Mozilla/5.0 (Windows NT 5.1; en-US) Firefox/3.6.8',
);
        
$result = wp_remote_get( $url, $args );
        
? >

مقادیر بازگشتی توابع _wp_remote

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

درخواست ناموفق:

یک شی از کلاس WP_Error برگردانده می شود که شامل کد خطا و پیام خطا است. برای تشخیص اینکه پاسخ برگشتی یک شی خطا است می توان از تابع is_wp_error استفاده نمود. همچنین برای دریافت پیام خطا از شی برگشتی می توان از متد get_error_message استفاده نمود.

< ?php
        
$bad_urls = array(
   'malformed',
   'http://0.0.0.0/',
   'irc://example.com/',
   'http://inexistant',
);
        
foreach( $bad_urls as $bad_url ) {
    $response = wp_remote_head( $bad_url, array('timeout'= > 1) );
    if( is_wp_error( $response ) ) {
        $error = $response- > get_error_message();
        echo " < p > $bad_url returned:  < br/ >  $error  < /p > ";
    }
}
        
? > 

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

درخواست موفق:

در صورت اجرای موفق درخواست، پاسخ دریافتی آرایه ای چند بعدی شامل چهار بخش headers، body، response و cookies خواهد بود.

بخش headers : شامل اطلاعاتی در مورد جزییات پاسخ سرور است.

بخش body: بدنه پاسخ سرور که معمولا شامل محتوای HTML است اما می تواند به صورت داده JSON یا XML کد شده نیز باشد.

بخش response: شامل کد پاسخ دریافتی و جزییات مربوط به آن است که معمولا برای معتبر بودن پاسخ دریافتی کنترل می شود. (کد 200 نشان دهنده پاسخی معتبر است)

بخش cookies: در صورتی که سرور بخواهد امکان ذخیره اطلاعات کوکی را برای درخواست دهنده فراهم کند، اطلاعات کوکی را در این بخش قرار می دهد.

در وردپرس توابعی برای استخراج اطلاعات هر یک از این بخش ها در نظر گرفته شده است. پاسخ دریافتی از سرور باید به عنوان پارامتر ورودی به این توابع ارسال گردد.

Wp_remote_retrieve_response_code: کد پاسخ دریافتی را بر می گرداند.

Wp_remote_retrieve_response_message: پیام پاسخ دریافتی را بر می گرداند.

Wp_remote_retrieve _body: بدنه پاسخ را به صورت رشته بر می گرداند.

Wp_remote_retrieve_headers: تمامی هدرهای پاسخ سرور را برمی گرداند.

Wp_remote_retrieve_header: یک هدر خاص را از پاسخ سرور بر می گرداند. نام هدر به عنوان پارامتر دوم باید ذکر شود.

< ?php
        
$url = 'http://www.example.com/bleh';
        
// Send GET request
$response = wp_remote_get( $url );
        
// Check for server response
if( is_wp_error( $response ) ) {
        
    $code = $response- > get_error_message();
    wp_die( 'Requests could not execute. Error was: ' . $code );
        
}
        
// Check that the server sent a “404 Not Found” HTTP status code
if( wp_remote_retrieve_response_code( $response ) == 404 ) {
        
    wp_die( 'Link not found' );
        
}
        
// So far, so good
echo 'Link found';
        
? >     

فیلترهای درخواست HTTP  

در این بخش به معرفی برخی از فیلترهای مهم درخواست های HTTP می پردازیم.

فیلتر http_headers_useragent

این فیلتر امکان تغییر آرگومان user-agnet را برای تمامی درخواست ها فراهم می آورد.

< ?php
        
// Hook into the filter that sets user agent for HTTP requests
add_filter( 'http_headers_useragent', 'bmpt_myplugin_user_agent' );
        
// Set your own user agent
function bmpt_myplugin_user_agent() {
    global $wp_version;
        
    return "WordPress version $wp_version ; ".
           "Need a WordPress specialist? Contact us! ".
           "Studio www.example.com";
}
        
? >

دریافت پاسخ JSON از سرور 

فرمت پاسخ JSON یکی از فرمت هایی است که بسیاری از وب سرورها حال حاضر از آن استفاده می کنند. JSON یک ساختار داده متنی به شکل نام: مقدار است. یکی از دلایل محبوبیت آن آسانی تولید و تفسیر داده ها در این قالب است. توابع json_encode و json_decode به ترتیب امکان تبدیل داده به رشته کدشده به فرمت json و تبدیل رشته کدشده json به شی یا آرایه را فراهم می آورد.

پارامتر اول تابع json_decode، رشته کدشده به فرمت json و پارامتر دوم تابع که اختیاری است تعیین کننده فرمت داده برگشتی به صورت شی یا آرایه است. مقدار پارامتر دوم این تابع به صورت پیش فرض false است که داده را به صورت شی برمی گرداند.

< ?php
        
// Convert JSON string to an object
$json_object = json_decode( $json );
$followers   = $json_object- > followers_count;
$last_tweet  = $json_object- > status- > text;
        
// Convert JSON string to an array: pass bool true as second parameter
$json_array = json_decode( $json, true );www.it-ebooks.info
$followers   = $json_array['followers_count'];
$last_tweet  = $json_array['status']['text'];
        
? >   

مثال: دریافت تعداد فالورها از سرور توئیتر

<?php
// Define the Twitter username. Edit this.
define( 'BMPT_TI_USERNAME', 'ozh' );
                
// Poll Twitter API
// Return array of (follower count, last tweet), or false on error
function bmpt_ti_ask_twitter() {
        
    // Send GET request to Twitter API
    $api_url = 'http://api.twitter.com/1/users/show.json?screen_name=';
    $api_response = wp_remote_get( $api_url . urlencode( BMPT_TI_USERNAME ) );
        
    // Get the JSON object
    $json = wp_remote_retrieve_body( $api_response );
        
    // Make sure the request was successful or return false
    if( empty( $json ) )
        return false;
        
    // Decode the JSON object
    // Return an array with follower count and last tweet
    $json = json_decode( $json );
        
    return array(
        'followers'  = >  $json- > followers_count,
        'last_tweet' = >  $json- > status- > text
    );
}
?>

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

ارسال درخواست به سرور با متد POST

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

< ?php
/*
Plugin Name: Simple Tumblr Backup
Plugin URI: http://example.com/
Description: Backup posts to a Tumblr account as you publish them        
// Edit this:
define( 'BMPT_STB_TUMBLR_EMAIL', 'email@example.com' );
define( 'BMPT_STB_TUMBLR_PASSW', '132456' );
        
// Actions when new post is published
add_action( 'draft_to_publish',   'bmpt_stb_newpost' );
add_action( 'pending_to_publish', 'bmpt_stb_newpost' );
add_action( 'future_to_publish',  'bmpt_stb_newpost' );
        
// Function called when new post. Expecting post object.
function bmpt_stb_newpost( $post ) {
        
    // Get post information
    $post_title   = $post- > post_title;
    $post_content = $post- > post_content;
        
    // URL of the Tumblr API
    $api = 'http://www.tumblr.com/api/write';
        
    // Data for the POST request
    $data = array(
           'email' = >  BMPT_STB_TUMBLR_EMAIL,
        'password' = >  BMPT_STB_TUMBLR_PASSW,
            'type' = >  'regular',
           'title' = >  $post_title,
            'body' = >  $post_content
    );
        
    // Do the POST request
    $response = wp_remote_post( $api,
        array(
            'body' = >  $data,
            'timeout' = >  20
        )
    );
        
    // All done!
}
               
? >  

در مثال فوق، با همزمان با انتشار پست در وب سایت نسخی از آن بر روی سایت tumblr نیز ایجاد می گردد. در تابع فوق اطلاعات لازم برای ایجاد مطلب جدید در tumblr در آرایه $data مقداردهی شده و با توجه به اینکه روش ارسال متد POST است، $data در بخش body آرگومان ارسالی تابع wp_remote_post قرار می گیرد. هوک اکشن های draft_to_publish، pending_to_publish و future_to_publish که در این مثال از آنها استفاده شد به ترتیب هنگام تغییر وضعیت انتشار پست وردپرس از حالت draft به منتشرشده، در حال بررسی (pending) به منتشرشده و future به منتشرشده به اجرا در می آیند.

پست های مرتبط

Leave a Comment