Я довольно новичок в 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
Какая версия Слим вы используете? Если вы измените его на: 'header ('Content-Type: application/json'),' это работает? – Philip
Также обратите внимание на [documentation] (http://docs.slimframework.com/#Response-Headers). –
@Philip Я использую Slim v2.3.5 - Я пробовал 'header ('Content-Type: application/json');' , а также '$ app-> response() -> header (' Content-Type ',' application/json '); ' и каждый способ дает тот же результат - никакой ошибки и никакого ответа вообще. Я использую Firebug, и вообще нет ответной вкладки. Который, мне кажется странным, потому что звонок не вызывает ошибку. Кроме того, как я уже сказал, есть еще одна «тестовая» форма, которую я реализовал выше формы проблемы на той же странице, которая отлично работает, в то время как это дает мне текст типа содержимого/html в заголовке ответа. @ Davide Pastore Спасибо. Пробовал это. – user1362339