XML-JSON内容协商


XML-JSON content negotiation

我希望只显示以下页面中的某些内容:http://sc2ranks.com/api/psearch/am/MxGPezz/1t/division/Felanis%20Sierra?appKey=sentinelgaming.net。到目前为止,我可以使用下面的php显示一些内容,但它甚至不是正确的数字。有人能告诉我如何在这个XML网页上显示这个玩家的"成就点"吗?

$url = 'http://sc2ranks.com/api/psearch/am/MxGPezz/1t/division/Felanis%20Sierra?appKey=sentinelgaming.net';
$xml = file_get_contents($url);
echo $xml->achievement-points;

感谢

此文件的内容类型因Accept标头或format查询参数而异。看来您至少可以检索XML或JSON。

file_get_contents()获得的默认值将是JSON,因为它不包括Accept请求标头,但从浏览器获得的默认为XML,因为浏览器通常在其Accept请求标头中包括XML mime类型。

获取JSON:

$url = 'http://sc2ranks.com/api/psearch/am/MxGPezz/1t/division/Felanis%20Sierra?appKey=sentinelgaming.net';
// &format=json is not strictly necessary,
// but it will give you fewer surprises
$json = file_get_contents($url.'&format=json');
$records = json_decode($json);
echo $records[0]->achievement_points, "'n";

获取XML:

$sxe = simplexml_load_file($url.'&format=xml');
echo (string) $sxe->record->{'achievement-points'}, "'n";

要使用$sxe对象,请参阅此SimpleXML备忘单。

您可以设置Accept标头,而不是使用format参数。您还可以在获取url时添加一些抽象,以便检索内容类型和编码。请参阅下面的示例。

function get_url($url, $context=null) {
    $response = file_get_contents($url, false, $context);
    $ctypeheaders = preg_grep('/^Content-Type:'s/i', $http_response_header);
    $ctype = NULL;
    if ($ctypeheaders) {
        $ctype = end($ctypeheaders);
        $ctype = end(explode(':', $ctype, 2));
        $ctype = explode(';', $ctype, 2);
        $charset = isset($ctype[1]) ? $ctype[1] : '';
        if ($charset && preg_match('/charset's*='s*([^'s]+)/i', $charset, $matches)) {
            $charset = $matches[1];
        }
        $ctype[1] = $charset;
        $ctype = array_map('trim', $ctype);
    }
    return array($response, $ctype);
}

然后,您可以像这样使用get_url()

// With no accept header, just see what we get:
list($content, $contenttype) = get_url($url);
list($type, $encoding) = $contenttype;
// $type will be 'application/xml' or 'application/json'
// $encoding is very handy to know too
// Or we can specify an accept header:
$opt_accept_xml = stream_context_create(array(
    'http' => array(
        'header' => "Accept: application/xml'r'n"
    )
));
list($content, $contenttype) = get_url($url, $opt_accept_xml);

可能:

    echo $xml->record[0]->achievement-points;