
7折
减价出售
¥799
wp_remote_retrieve_body()
是WordPress HTTP API中的核心函数,专门用于从wp_remote_*
系列函数返回的响应中提取正文内容。
/**
* 从HTTP响应中检索正文内容
*
* @param array|WP_Error $response HTTP响应数组或WP_Error对象
* @return string 响应正文内容,如果响应无效则返回空字符串
*/
function wp_remote_retrieve_body($response) {
if (is_wp_error($response) || !isset($response['body'])) {
return '';
}
return $response['body'];
}
$response = wp_remote_get('https://api.example.com/data');
$body = wp_remote_retrieve_body($response);
if (!empty($body)) {
$data = json_decode($body, true);
// 处理数据...
}
function safe_retrieve_body($response) {
// 检查响应有效性
if (is_wp_error($response)) {
error_log('API请求错误: ' . $response->get_error_message());
return false;
}
// 检查HTTP状态码
$status_code = wp_remote_retrieve_response_code($response);
if ($status_code != 200) {
error_log("API返回异常状态码: {$status_code}");
return false;
}
// 获取并验证正文
$body = wp_remote_retrieve_body($response);
if (empty($body)) {
error_log('API返回空响应正文');
return false;
}
return $body;
}
// 使用示例
if ($body = safe_retrieve_body($response)) {
$data = json_decode($body, true);
// 处理数据...
}
function get_response_with_content_type($response) {
$content_type = wp_remote_retrieve_header($response, 'content-type');
$body = wp_remote_retrieve_body($response);
if (strpos($content_type, 'application/json') !== false) {
return json_decode($body, true);
} elseif (strpos($content_type, 'application/xml') !== false) {
return simplexml_load_string($body);
} elseif (strpos($content_type, 'text/csv') !== false) {
return str_getcsv($body);
}
return $body;
}
function stream_large_response($url, $save_path) {
$response = wp_remote_get($url, [
'stream' => true,
'filename' => $save_path,
'timeout' => 300
]);
if (is_wp_error($response)) {
return false;
}
// 即使使用流传输,仍可获取部分元数据
$content_length = wp_remote_retrieve_header($response, 'content-length');
$content_type = wp_remote_retrieve_header($response, 'content-type');
return [
'path' => $save_path,
'size' => $content_length,
'type' => $content_type
];
}
function handle_chunked_response($response) {
$body = wp_remote_retrieve_body($response);
$transfer_encoding = wp_remote_retrieve_header($response, 'transfer-encoding');
if (strtolower($transfer_encoding) === 'chunked') {
// 手动处理分块编码数据
$unchunked = '';
$pos = 0;
$len = strlen($body);
while ($pos < $len) {
// 获取块大小行
$nl = strpos($body, "\r\n", $pos);
if ($nl === false) break;
$line = substr($body, $pos, $nl - $pos);
$pos = $nl + 2;
// 16进制块大小
$chunk_size = hexdec($line);
if ($chunk_size == 0) break;
// 读取块数据
$unchunked .= substr($body, $pos, $chunk_size);
$pos += $chunk_size + 2; // 跳过CRLF
}
return $unchunked;
}
return $body;
}
function get_cached_response_body($url, $expiration = 3600) {
$transient_key = 'api_res_' . md5($url);
$cached = get_transient($transient_key);
if ($cached !== false) {
return $cached;
}
$response = wp_remote_get($url);
$body = wp_remote_retrieve_body($response);
if (!empty($body)) {
set_transient($transient_key, $body, $expiration);
}
return $body;
}
function process_large_body($url) {
// 使用临时文件处理大响应
$tmp_file = wp_tempnam();
$response = wp_remote_get($url, [
'stream' => true,
'filename' => $tmp_file
]);
if (is_wp_error($response)) {
@unlink($tmp_file);
return false;
}
// 使用生成器逐行处理文件
$processor = function($file) {
$handle = fopen($file, 'r');
if (!$handle) return;
while (($line = fgets($handle)) !== false) {
yield $line;
}
fclose($handle);
@unlink($file);
};
return $processor($tmp_file);
}
// 使用示例
$lines = process_large_body('https://example.com/large-file.txt');
if ($lines) {
foreach ($lines as $line) {
// 处理每一行数据...
}
}
function log_api_response($response, $context = '') {
$log_data = [
'timestamp' => current_time('mysql'),
'context' => $context,
'is_error' => is_wp_error($response),
'error' => is_wp_error($response) ? $response->get_error_message() : null,
'status_code' => wp_remote_retrieve_response_code($response),
'headers' => wp_remote_retrieve_headers($response),
'body_sample' => substr(wp_remote_retrieve_body($response), 0, 500) // 记录前500字符
];
error_log('API响应日志: ' . print_r($log_data, true));
}
function validate_api_response($response) {
if (is_wp_error($response)) {
return [
'valid' => false,
'error' => $response->get_error_message(),
'type' => 'wp_error'
];
}
$status_code = wp_remote_retrieve_response_code($response);
$body = wp_remote_retrieve_body($response);
$validation = [
'valid' => true,
'status_code' => $status_code,
'content_type' => wp_remote_retrieve_header($response, 'content-type'),
'body_length' => strlen($body)
];
// 检查JSON响应有效性
if (strpos($validation['content_type'], 'application/json') !== false) {
json_decode($body);
$validation['json_valid'] = (json_last_error() === JSON_ERROR_NONE);
}
// 状态码检查
if ($status_code < 200 || $status_code >= 300) {
$validation['valid'] = false;
$validation['error'] = "Invalid status code: {$status_code}";
}
return $validation;
}
function fetch_remote_json($url) {
$response = wp_remote_get($url);
// 基础验证
if (is_wp_error($response)) {
return $response;
}
$status_code = wp_remote_retrieve_response_code($response);
$body = wp_remote_retrieve_body($response);
// 处理成功响应
if ($status_code === 200) {
$data = json_decode($body, true);
if (json_last_error() === JSON_ERROR_NONE) {
return $data;
}
return new WP_Error('invalid_json', 'Invalid JSON response');
}
// 处理错误响应
$error_data = [
'status' => $status_code,
'response' => $body
];
// 尝试解析错误详情
$json_error = json_decode($body, true);
if (is_array($json_error) && isset($json_error['message'])) {
$error_data['message'] = $json_error['message'];
}
return new WP_Error('api_error', 'API request failed', $error_data);
}
function download_and_verify_file($url, $expected_hash) {
$response = wp_remote_get($url, ['timeout' => 300]);
if (is_wp_error($response)) {
return $response;
}
$status_code = wp_remote_retrieve_response_code($response);
$body = wp_remote_retrieve_body($response);
if ($status_code !== 200) {
return new WP_Error('download_failed', "Download failed with status: {$status_code}");
}
// 验证文件完整性
$actual_hash = md5($body);
if ($actual_hash !== $expected_hash) {
return new WP_Error('hash_mismatch', "File hash mismatch. Expected: {$expected_hash}, Actual: {$actual_hash}");
}
// 保存文件
$upload_dir = wp_upload_dir();
$filename = basename(parse_url($url, PHP_URL_PATH));
$filepath = trailingslashit($upload_dir['path']) . $filename;
if (file_put_contents($filepath, $body) === false) {
return new WP_Error('file_save', "Could not save file to {$filepath}");
}
return [
'path' => $filepath,
'url' => trailingslashit($upload_dir['url']) . $filename,
'size' => strlen($body)
];
}
wp_remote_retrieve_body
前,先用is_wp_error()
检查响应对象wp_remote_retrieve_response_code()
确保请求成功Content-Type
头信息正确解析响应体'stream' => true
参数)通过深入理解wp_remote_retrieve_body
函数及其相关技术,开发者可以构建出健壮的远程请求处理系统,有效整合各种Web服务和API接口。
减价出售
减价出售
减价出售
减价出售
电话咨询
1855-626-3292
微信咨询