Menangkap data jarak jauh API cuaca
The msg
, yang Anda tunjukkan dalam pertanyaan Anda pada dasarnya adalah hasil dari API cuaca. Dan dikatakan, bahwa tidak ada data tersedia untuk lokasi Anda.
Hal pertama yang ingin Anda lakukan adalah penelitian di Codex dan "WP HTTP API" .
Cara kanan / WP untuk mengambil data jarak jauh
Setelah Anda belajar tentang WP HTTP API, Anda akan melihat bahwa cara umum untuk melakukannya adalah (disederhanakan seperti ini):
$response = wp_remote_request( 'http://example.com?some=parameter', array(
'ssl_verify' => true
) );
Jika ada kesalahan (seperti yang ditunjukkan pada contoh Anda), maka Anda dapat menangkapnya menggunakan WP_Error
kelas:
is_wp_error( $response ) AND printf(
'There was an ERROR in your request.<br />Code: %s<br />Message: %s',
$response->get_error_code(),
$response->get_error_message()
);
Maka saatnya untuk mendapatkan data yang sesuai. Ini akan menunjukkan 200
dan OK
, jika semuanya di sisi jarak jauh berhasil. PENTING: Data jarak jauh kemungkinan tidak mengikuti standar selain yang internal. Jadi mungkin ada kesalahan, tetapi Anda masih akan mendapatkan 200/OK
pesan positif kembali dari mereka.
$response_code = wp_remote_retrieve_response_code( $response );
$response_status = wp_remote_retrieve_response_message( $response );
Dapatkan hasilnya
Akhirnya saatnya untuk memeriksa hasilnya. Pertama, kita menyingkirkan ruang putih terdepan / tertinggal. Dalam sampel berikut, Anda melihat cara menggunakan WP HTTP API untuk memeriksa header. Jika kita ketahuan JSON
, maka kita pergi dengan json_decode()
dan jika kita punya XML
, maka kita pergi dengan SimpleXML
kelas asli PHP .
// Prepare the data:
$content = trim( wp_remote_retrieve_body( $response ) );
// Convert output to JSON
if ( strstr( wp_remote_retrieve_header( $response, 'content-type' ), 'json' ) )
{
$content = json_decode( $content );
}
// … else, after a double check, we simply go with XML string
elseif ( strstr(
wp_remote_retrieve_header( $response, 'content-type' ),
'application/xhtml+xml'
) )
{
// Lets make sure it is really an XML file
// We also get cases where it's "<?XML" and "<?xml"
if ( '<?xml' !== strtolower( substr( $content, 0, 5 ) ) )
return false;
// Also return stuff wrapped up in <![CDATA[Foo]]>
$content = simplexml_load_string( $content, null, LIBXML_NOCDATA );
}
// If both didn't work out, then we maybe got a CSV, or something else...
Dalam hal file CSV, Anda harus menemukan solusi khusus atau mencari kelas PHP pada jalinan. Tapi jujur: Jika mereka menggunakan CSV, lebih mudah untuk mencari layanan lain.
Cache data dengan Transient
The API Transient menawarkan cara yang cukup bagus untuk melakukan hal ini:
// Set Transient
$transient = set_transient(
'Your cache key',
$content,
60*60*6
);
Anda kemudian dapat menangkap transient dengan get_transient()
.
Kesalahan Umum
Kesalahan yang sering dijumpai adalah verifikasi SSL tidak berfungsi. Dengan senang hati Anda dapat menyalakan / mematikannya dengan mudah:
// ON:
add_filter( 'https_ssl_verify', '__return_true' );
// OFF:
add_filter( 'https_ssl_verify', '__return_false' );
Ada satu hal yang cukup lucu, karena Anda akan tahu ketika memeriksa file inti yang sesuai: Core juga mendapat filter untuk permintaan lokal . Tapi jangan tertipu oleh yang satu ini. Filter ini hanya dimaksudkan untuk digunakan jika Anda A) menyediakan layanan jarak jauh dari dalam instalasi WP Anda dan B) juga mengkonsumsinya sendiri! Saya tahu, ini bisa menjadi #WTF?!
momen yang cukup sulit bagi Anda untuk menggunakan pengaturan verifikasi SSL yang berbeda antara instalasi lokal Anda dan lingkungan produksi / server Anda, tetapi juga memiliki ide di baliknya: Ini untuk menguji layanan yang Anda gunakan berikan diri Anda seperti yang saya jelaskan kepada komunitas WP G + di sini .
// Debug your own service without SSL verification.
add_filter( 'https_local_ssl_verify', '__return_false' );
Men-debug permintaan & hasilnya
Tanpa diggin terlalu jauh ke dalam proses pembaruan, tetapi WP HTTP API menggunakan kelas WP_HTTP. Ini juga menawarkan hal yang menyenangkan: Sebuah kait debug.
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
Di mana $response
juga bisa menjadi WP_Error
objek yang mungkin memberi tahu Anda lebih banyak.
Catatan: Dari tes singkat, filter ini tampaknya hanya (karena alasan tertentu) berfungsi jika Anda menempatkannya sedekat mungkin dengan tempat Anda benar-benar melakukan permintaan. Jadi mungkin Anda perlu meneleponnya dari dalam panggilan balik di salah satu filter di bawah ini.
Y TIDAK ADA CURL?
Mudah. Semua kegembiraan "WP HTTP API", yang telah saya perlihatkan di atas, pada dasarnya adalah pembungkus berbasis fungsi untuk WP_HTTP
internal kelas, yang bertindak sebagai kelas dasar (dan akan diperluas untuk skenario yang berbeda). The memperpanjang WP_HTTP_*
kelas yang Fsockopen
, Streams
, Curl
, Proxy
, Cookie
, Encoding
. Jika Anda mengaitkan panggilan balik ke 'http_api_debug'
-aksi, maka argumen ketiga akan memberi tahu Anda kelas mana yang digunakan untuk permintaan Anda. Anda tidak harus memanggil kelas secara langsung. Cukup gunakan fungsinya.
Untuk sebagian besar permintaan API jarak jauh / HTTP, ini adalah WP_HTTP_curl
kelasnya, yang merupakan pembungkus untuk curl
perpustakaan asli PHP .
Di dalam WP_HTTP_curl
Kelas, Anda akan menemukan request()
metodenya. Metode ini menawarkan dua filter untuk mencegat perilaku SSL: Satu untuk permintaan lokal 'https_local_ssl_verify'
dan satu untuk permintaan jarak jauh 'https_ssl_verify'
. WP kemungkinan akan mendefinisikan local
sebagai localhost
dan apa yang Anda dapatkan di return
dari get_option( 'siteurl' );
.
get_transient()
- tetapi dengan permintaan API: seperti yang diberikan oleh pesan kesalahan. Selain menyarankan Anda menggunakanwp_remote_post
Anda hanya perlu memastikan bahwa permintaan yang dikirim adalah valid.