Una guida all'API HTTP di WordPress Nozioni di base

In questo tutorial, impareremo l'API HTTP di WordPress e le diverse funzioni che offre per fare richieste HTTP e gestire la risposta.


introduzione

Esistono vari modi per effettuare richieste HTTP con PHP. Ad esempio, i più popolari sono "fopen" e "arricciare"e diversi host web hanno diversi livelli di supporto per loro.Quando sviluppi per WordPress, devi assicurarti che il tuo codice funzioni su quanti più host possibile.È quindi necessaria una soluzione che supporti tutti i diversi metodi di trasporto.

Dalla versione 2.7, WordPress ha implementato il "WP_Http"classe per risolvere questo problema fornendo un'API standardizzata per effettuare richieste HTTP. Questa classe selezionerà e utilizzerà automaticamente l'API di trasporto supportata dall'host Web.

"L'API HTTP di WordPress fornisce una soluzione di compatibilità incrociata. Dovresti sempre usarla, se possibile."


Alcune nozioni di base sulle richieste HTTP

HTTP (acronimo di HyperText Transfer Protocol) è il protocollo utilizzato dai browser Web per trasferire informazioni su Internet. Quando si carica una pagina Web (come questa), si invia una richiesta al server; e poi si ottiene una risposta. Esistono diversi metodi di richiesta (come GET, POST, HEAD, PUT) e anche molti codici di stato di risposta (come il famigerato 404 quando non si trova una pagina).

Non ho intenzione di approfondire questo argomento profondo, ma questo dovrebbe darvi un'idea di base di ciò che faremo: fare una richiesta HTTP a un URL e ottenere la risposta. Certo, puoi farlo con il tuo browser, ma impareremo come farlo all'interno di WordPress. I vantaggi o le possibilità sono illimitate. Puoi fare richieste per afferrare feed, file JSON, dati XML o pagine web complete.

Come accennato in precedenza, WordPress ha una classe che semplifica le chiamate HTTP. Il nome della classe è "WP_Http"e il metodo interessato è"$ Wp_http_instance-> richiesta ($ url)Msgstr "Questo metodo restituisce il risultato della richiesta HTTP che verrà dettagliato in seguito.

 if (! class_exists ('WP_Http')) include_once (ABSPATH. WPINC. '/class-http.php');  $ request = new WP_Http; $ args = array (); $ result = $ request-> request ('http://mysite.com', $ args);

Poiché questo bit di codice è un po 'lungo (e ripetitivo se fai molte richieste), WordPress fornisce una funzione più semplice che fa esattamente la stessa cosa:

 $ arg = array (); wp_remote_request ('http://mysite.com', $ arg);

Nell'array degli argomenti, è possibile specificare uno o più parametri della richiesta. Uno di questi parametri è il metodo di richiesta. Se stai facendo una richiesta "GET":

 $ arg = array ('method' => 'GET'); wp_remote_request ('http://mysite.com', $ arg);

Funziona ancora di più con 3 funzioni ausiliarie aggiuntive per i metodi di richiesta GET, POST e HEAD poiché vengono utilizzati di più:

  • wp_remote_get () - Recupera un URL utilizzando il metodo GET HTTP
  • wp_remote_post () - Recupera un URL utilizzando il metodo POST HTTP
  • wp_remote_head () - Recupera un URL utilizzando il metodo HEAD HTTP

Si consiglia vivamente di utilizzare le funzioni di supporto al posto di WP_Http classe. Questo è quello per cui sono fatti.


Fare la nostra prima richiesta HTTP

Quindi facciamo la nostra prima richiesta HTTP. Ho scelto Bitcoinica come servizio da cui estrarre i dati. Ci sono un paio di ragioni per questo. Innanzitutto, la maggior parte dei tutorial sceglie l'API di Twitter; e in secondo luogo l'API di Bitcoinica è RESTful, semplice e ben documentata. Puoi trovare la documentazione completa dell'API sul loro sito web.

Se non conosci Bitcoinica, è un servizio di trading per Bitcoin (una valuta virtuale). La loro API offre una serie di funzioni: Ottenere l'ultima quotazione per una coppia di valute, effettuare ordini, seguire posizioni, ecc.

La prima richiesta trarrà l'ultima quotazione per una determinata coppia di valute. La documentazione API è abbastanza importante in quanto menziona gli URL per effettuare le chiamate e la risposta prevista. Per semplificare le cose, inserisco il codice in un plugin e impedisco anche a WordPress di caricare il tema. Ciò renderà i risultati più puliti senza ingombrare il codice HTML del tema.

  falso)); var_dump ($ response); Uscita; );

Analisi della risposta HTTP

Quando carichi il tuo blog, dovresti ottenere qualcosa di simile a questo:

 array ('headers' => array ('server' => stringa 'nginx / 0.7.67' (lunghezza = 12) 'date' => stringa 'ven, 09 mar 2012 16:38:30 GMT' (lunghezza = 29 ) 'content-type' => stringa 'application / json; charset = utf-8' (length = 31) 'connection' => string 'close' (length = 5) 'status' => string '200 OK' ( length = 6) 'strict-transport-security' => string 'max-age = 31536000' (lunghezza = 16) 'x-ua-compatible' => stringa 'IE = Edge, chrome = 1' (lunghezza = 16) 'etag' => string '"578a43c47f9d9d5f4159bcd1a6f63f06"' (length = 34) 'cache-control' => string 'max-age = 0, privato, must-revalidate' (lunghezza = 35) 'x-request-id' = > string '07bb51e7df9f0a4a50718fa7af21cc76' (length = 32) 'x-runtime' => stringa '0.007439' (lunghezza = 8) 'x-rack-cache' => stringa 'miss' (lunghezza = 4)) 'corpo' => string '"buying": 4.89989, "pair": "BTCUSD", "selling": 4.9639' (length = 51) 'response' => array ('code' => int 200 'message' => string ' OK '(length = 2))' cookies '=> array (vuoto)' filename '=> null)

Questa è la risposta HTTP completa. In realtà, è in testo normale, ma WordPress lo semplifica in questo array. Di seguito è la vera risposta HTTP

 HTTP / 1.1 200 OK Server: nginx / 0.7.67 Data: ven, 09 mar 2012 21:32:09 GMT Content-Type: application / json; charset = utf-8 Transfer-Encoding: chunked Connessione: keep-alive Stato: 200 OK Strict-Transport-Security: max-età = 31536000 X-UA-compatibile: IE = Edge, chrome = 1 ETag: "93b5e5de369c0a1d83a16aa5a787b60d" Cache- Controllo: max-età = 0, privato, deve rivalidare X-Request-Id: e4332f7b46ef751703d817216b7816d1 X-Runtime: 0,008076 X-Rack-Cache: miss "coppia": "BTCUSD", "vendita": 4.96854, "acquisto" : 4.86172

La prima riga (nella risposta HTTP in chiaro) è la versione del protocollo HTTP e il codice di stato della risposta. Quello che segue è l'intestazione della risposta, un insieme di coppie chiave e valore, e quindi il corpo della risposta. WordPress organizza queste informazioni nell'array di risposta.

Gestione degli errori

Ma cosa succede se qualcosa va storto e non possiamo connetterci al server? Ciò può accadere per vari motivi, ad esempio il server è inattivo, richiede troppo tempo per rispondere o la verifica del certificato SSL non riesce. In questo caso, WordPress restituisce a WP_error oggetto che spiega l'errore.

 object (WP_Error) [33] (public 'errors' => array ('http_request_failed' => array (0 => stringa 'Impossibile risolvere host: www.bitcoinicau.com; Host non trovato' (lunghezza = 59))) public 'error_data' => array (vuoto))

Una versione migliorata del nostro script potrebbe essere:

  falso)); if (! is_wp_error ($ response)) echo $ response ['body'];  Uscita; );

is_wp_error controlla se la variabile passata è a WP_Error oggetto. Questo non è sufficiente, tuttavia, per sapere che la risposta restituita è valida e di successo. Un 404 (Pagina non trovata) o 503 (Servizio non disponibile) è una risposta valida. È necessario un ulteriore controllo del codice di stato della risposta. Ciò dipenderà principalmente dal servizio o dal sito Web al quale si stanno facendo richieste.

WordPress ha ancora più funzioni di aiuto che recuperano i dati dalla risposta HTTP.

  • wp_remote_retrieve_body () - Recupera solo il corpo dalla risposta.
  • wp_remote_retrieve_header () - Fornisce una singola intestazione HTTP in base al nome della risposta.
  • wp_remote_retrieve_headers () - Restituisce tutte le intestazioni HTTP in una matrice per l'elaborazione.
  • wp_remote_retrieve_response_code () - Fornisce il numero per la risposta HTTP. Questo dovrebbe essere 200, ma potrebbe essere 4xx o anche 3xx in caso di fallimento.
  • wp_remote_retrieve_response_message () - Restituisce il messaggio di risposta in base al codice di risposta.

La matrice di argomenti

Puoi avere un grado più elevato di controllo sulle tue query HTTP. Il secondo argomento prende una serie di coppie chiave / valore. Ecco un riassunto dei più importanti:

  • metodo - quando si utilizza il wp_remote_request metodo, è necessario specificare quale metodo di richiesta si sta utilizzando (GET, POST, HEAD, PUT, ecc.). Il valore predefinito è GET
  • tempo scaduto - Il tempo in secondi prima che WordPress interrompa la connessione e restituisca un errore. Il valore predefinito è 5 secondi, che è un tempo relativamente breve se ci si connette con un server lento e occupato.
  • reindirizzamento - Specifica i tempi per seguire un reindirizzamento prima di rinunciare. L'importo predefinito è anche 5.
  • biscotti - Una serie di valori di cookie passati al server.

Per un elenco completo e più dettagliato, controlla HTTP_API "Other_Arguments nel sito Web del codice WordPress.

Verifica del certificato SSL

Se hai guardato attentamente il codice sopra, noterai che sto già utilizzando il secondo argomento nel wp_remote_get funzione e impostazione dell 'sslverify'proprietà di false. L'ho fatto perché il mio server web non ha installato le autorizzazioni di alcun certificato e quindi non ne riconoscerà nessuno. Se vuoi verificare l'host a cui ti stai connettendo prima di effettuare la connessione, avrai bisogno di un elenco di autorità dei certificati installate nel tuo server web.

I browser Web riconoscono una varietà di autorità dei certificati. Una volta verificato il certificato, il browser Web è felice e mostra un'icona con il lucchetto verde in alto. (L'icona differisce da un browser all'altro ma è quasi sempre verde e la maggior parte delle volte a sinistra della barra degli indirizzi)

Se il certificato viene rifiutato, la connessione fallisce e a WP_Error oggetto viene restituito.

Conclusione

Questa era un'introduzione all'API HTTP di WordPress. In questo tutorial, abbiamo imparato le basi del fare una richiesta HTTP e leggere la risposta. Nel prossimo tutorial, impareremo come utilizzare l'API HTTP per creare un gateway di pagamento PayPal ed elaborare pagamenti di pagamento express.