2015-01-09 4 views
1

Я довольно новичок в Slim, и до сих пор не было проблем - все работало так, как ожидалось, до этой проблемы. Я искал и искал, но я не должен искать в нужном месте.Тонкие ответные заголовки, возвращающие текст/html вместо приложения/json

Я использую AngularJS с Slim и NotORM. Пока у меня работает аутентификация пользователя, и я работаю над простой формой обновления состояния, которая сохраняет таблицу базы данных - «сообщение». Сама форма проста и содержит только элемент textarea с ng-моделью, установленным в message.text. Когда представляется, doPost (сообщение) называется в контроллере:

$scope.doPost = function(message) { 
     Data.post('message', { 
      message: message 
     }).then(function(results) { 
      Data.toast(results); 
      loadRemoteData(); 
     }, function(error) { 
      console.log('message failed to send: ' + error); 
     }); 
     $scope.message = { 
      content: '' 
     } 
    } 

Мой код в службе данных (Data.post ('сообщение')) является:

var obj = {}; 
obj.post = function (q, object) { 
    return $http.post(serviceBase + q, object) 
    .then(function(results) { 
     return results.data; 
    }, 
    function(error) { 
     console.log('failed -->' + results.data + '<--'); 
    }); 
}; 
return obj; 

И тогда PHP:

$app->post('/message', function() use ($app, $db) { 
    $response = array(); 
    $r = json_decode($app->request->getBody()); 
    $userid = $_SESSION['uid']; 
    $displayname = $_SESSION['displayname']; 
    verifyRequiredParams(array('text'), $r->message); 
    $message = $db->post(); 
    $data = array(
     'userid' => $uid, 
     'displayname' => $displayname, 
     'text' => $r->message->text 
    ); 

    $result = $message->insert($data); 

    if($result != NULL) { 
     $response['status'] = 'success'; 
     $response['message'] = 'Post successful'; 
     $response['id'] = $result['id']; 
     echoResponse(200, $response); 
    } else { 
     $response["status"] = "error"; 
     $response["message"] = "Failed to create message. Please try again"; 
     echoResponse(200, $response); 
    } 
}); 

И в echoResponse():

function echoResponse($status_code, $response) { 

    $app = \Slim\Slim::getInstance(); 

    // Http response code 
    $app->status($status_code); 

    // setting response content type to json 
    $app->contentType('application/json'); 

    echo json_encode($response); 
} 

И это в значительной степени относится к коду. Ошибок нет, но message.text не отправляет в базу данных, и ответ возвращается пустым. Я создал другую форму на странице, содержащую поле ввода текста типа, и он отлично работает, используя дублированные методы. Я пробовал все, что мог придумать, и то, что выделяется для меня, это Content-Type от Response-Header - это как-то text/html вместо application/json (тестовая форма показывает json). Таблица, которую я пытаюсь опубликовать, выглядит следующим образом:

CREATE TABLE IF NOT EXISTS `post` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`userid` int(11) NOT NULL, 
`displayname` varchar(50) CHARACTER SET utf8, 
`text` text CHARACTER SET utf8, 
`date` timestamp DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; 

Любая помощь будет оценена. Благодарю.

Вот заголовки:

Response Headers 
Access-Control-Allow-Head... origin, x-requested-with, content-type 
Access-Control-Allow-Meth... PUT, GET, POST, DELETE, OPTIONS 
Access-Control-Allow-Orig... * 
Connection Keep-Alive 
Content-Length 0 
Content-Type text/html 
Date Fri, 09 Jan 2015 11:52:12 GMT 
Keep-Alive timeout=5, max=92 
Server Apache/2.2.26 (Unix) DAV/2 PHP/5.4.30 mod_ssl/2.2.26 OpenSSL/0.9.8za 
X-Powered-By PHP/5.4.30 

Request Headers 
Accept application/json, text/plain, */* 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Content-Length 32 
Content-Type application/json;charset=utf-8 
Cookie PHPSESSID=g9ooedu5kk513pk5f5djug42c4 
Host localhost 
Referer localhost 
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:34.0) Gecko/20100101 Firefox/34.0 
+0

Какая версия Слим вы используете? Если вы измените его на: 'header ('Content-Type: application/json'),' это работает? – Philip

+0

Также обратите внимание на [documentation] (http://docs.slimframework.com/#Response-Headers). –

+0

@Philip Я использую Slim v2.3.5 - Я пробовал 'header ('Content-Type: application/json');' , а также '$ app-> response() -> header (' Content-Type ',' application/json '); ' и каждый способ дает тот же результат - никакой ошибки и никакого ответа вообще. Я использую Firebug, и вообще нет ответной вкладки. Который, мне кажется странным, потому что звонок не вызывает ошибку. Кроме того, как я уже сказал, есть еще одна «тестовая» форма, которую я реализовал выше формы проблемы на той же странице, которая отлично работает, в то время как это дает мне текст типа содержимого/html в заголовке ответа. @ Davide Pastore Спасибо. Пробовал это. – user1362339

ответ

0

Вы должны захватить $ ответа, потому что это защищаемый объект ...

$response = $app->response(); 
$response->header('Content-Type', 'application/json'); 

$app->render(
    file_get_contents($app->config('templates') . $template), $myPageVars 
); 

Я выбираю фактически отработать JSON в шаблон, а чем сброс данных PHP непосредственно. Позволяет позже изменять ваши фиды данных без завинчивания с источником данных.

2

Вы можете установить глобальное содержание Тонкий приложение с помощью этого метода:

$app->contentType('application/json'); 
0

Нет принял ответ, так и для записи из документации (Слим 3):

$newResponse = $oldResponse->withHeader('Content-type', 'application/json'); 
+0

Пожалуйста, отформатируйте свой код. Когда вы редактируете свой пост, вы увидите красивый большой желтый блок справа, рассказывающий вам, как это сделать :) – Frits

Смежные вопросы