2014-02-08 7 views
0

Я не совсем уверен, как это объяснить, но я экспериментирую с созданием собственного API. В настоящий момент все работает хорошо, выполняя запросы cURL или запросы JQuery AJAX.Пользовательский PHP «API» JSON response jQuery

Моя проблема заключается в том, что я вижу использование других API-интерфейсов, которые вы указываете для ответа JSON в корневых аргументах объекта jQuery. С моим API я должен указать, что я хочу ответ JSON в аргументе данных. Как именно API собирает этот аргумент JSON? Пример:

$.ajax({ 
    url: 'url', 
    type: 'POST', 
    data: {dataType : 'json'}, //I need this for PHP to know I want a JSON response 
    dataType: 'json' //how do other APIs grab this on the API side? 
}). 
done(function(response){ 
    console.log(response); 
}); 

В PHP я могу только перенести объект данных VIA $ _POST. Если я удалю объект данных из запроса AJAX, я не верну данные. Итак, что мне делать в PHP для получения «корневого» аргумента dataType, чтобы знать, как вернуть JSON?

<?php echo serialize($_POST) ?> 
+0

Если я удаляю объект данных из запроса AJAX, я не получаю данные обратно - '$ _POST' несет данные, которые вам нужны. Итак, если вы удалите его, как вы можете получить данные? –

ответ

2

При установке dataType, JQuery отправляет эту информацию как часть заголовка Accept, это, вероятно, выглядит примерно так: Accept: application/json, text/javascript, */*; q=0.01.

На PHP стороне вещей, вы можете получить доступ к нему с $_SERVER суперглобальной:

$accept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null; 
if ($accept && false !== stripos($accept, 'application/json')) { 
    // send back JSON 
} 

Если вам случится использовать компонент HttpFoundation Symfony, он имеет некоторые полезные средства для борьбы с Accept заголовками:

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\AcceptHeader; 

$r = Request::createFromGlobals(); 
$accept = AcceptHeader::fromString($r->headers->get('Accept') ?: '*/*'); 
if ($accept->has('application/json')) { 
    // send json 
} elseif ($accept->has('application/xml')) { 
    // send xml 
} else { 
    // send whatever 
} 
+0

Прохладный спасибо будет проверить это –