Написание API для обработки XML и JSON. Я хочу, чтобы ответ был в формате, который использует запрос.
Пример — заголовок запроса API имеет: Accept: application/xml
Проблема в том, что ответ всегда имеет Content-Type: application/json
,
Я хочу это вернуть Content-Type: application/xml
Это код:
public function setHeaders() {
$headerType = $this->app->request->headers->get('Accept');
switch($headerType){
case "application/xml":
$this->app->response->headers->set("Content-Type",'application/xml');
default:
// default type is application/json
$this->app->response->headers->set("Content-Type",'application/json');
}
}
# 404 errors
$app->notFound(function () use ($app) {
$logMessage = sprintf("404 Not Found: URI: %s", $app->request->getPath());
$app->log->debug($logMessage);
$error = new \SMSTester\ErrorVO(2,"Request doesn\'t exist, check the manual.");
$app->parser->setHeaders();
$app->halt(404,$app->parser->outputParse($error));
});
outputParse
возвращает следующую строку:
<xml>
<error>true</error>
<errorType>Request doesn\'t exist, check the manual.</errorType>
<errorMessage>2</errorMessage>
</xml>
Проблема в том, что вы не используете break
выйти из вашего switch
после срабатывания правильного случая (при условии, что $headerType
на самом деле устанавливается на application/xml
) Так что ваши default
case также работает и отменяет любые изменения, сделанные в первом случае.
public function setHeaders() {
$headerType = $this->app->request->headers->get('Accept');
switch($headerType){
case "application/xml":
$this->app->response->headers->set("Content-Type",'application/xml');
break; //Break here prevents the next case from firing
default:
// default type is application/json
$this->app->response->headers->set("Content-Type",'application/json');
}
}
Или же
$this->app->response->withHeader("Content-Type",'application/xml');
Настоящее время…