我正在尝试将服务器数据解析为REST API作为post存储在数据库中。但数据似乎没有得到解析。如果我按如下方式对网址进行硬编码,则数据将成功发布,
$.ajax({
url: 'index.php/rest/resource/questions/uId/1/qTitle/TestQ/qBody/TestBody/qTag/1',
uccess: function(data) {
alert(data);
},
type: "post"
});
但是,如果我尝试按如下方式动态插入数据,则不起作用:
$.ajax({
url: 'index.php/rest/resource/questions/',
data: { 'uId\/':qUserId, '\/qTitle\/':qTitle, '\/qBody\/':qBody, '\/qTag\/':'1' },
success: function(data) {
alert(data);
},
type: "post"
});
这个问题可能有一个简单的解决方案,但我无法从我在网上找到的资源中获得任何积极的结果。
修改
当我在浏览器上使用硬编码数据手动粘贴查询时,如下所示,
index.php/rest/resource/questions/uId/1/qTitle/TestQ/qBody/TestBody/qTag/1
T提交要存储在数据库中的数据。我的要求是通过ajax调用中的变量将变量动态插入到url中:)
编辑2
休息控制器代码
<?php
class Rest extends CI_Controller {
function __construct()
{
parent::__construct();
$this->load->model('student');
$this->load->helper('url');
}
// we'll explain this in a couple of slides time
public function _remap()
{
// first work out which request method is being used
$request_method = $this->input->server('REQUEST_METHOD');
switch (strtolower($request_method)) {
case 'post' : $this->doPost(); break;
default:
show_error('Unsupported method',404); // CI function for 404 errors
break;
}
}
public function doPost(){
$args = $this->uri->uri_to_assoc(2);
switch ($args['resource']) {
case 'questions' :
$res = $this->student->askQ($args);
if ($res === false) {
echo json_encode(array('error' => 'unable to post','status' => 1));
}
else {
echo json_encode(array('status' => 0));
}
break;
default:
show_error('Unsupported resource',404);
}
echo 'posted';
}
}
?>
从Rest Controller
使用的学生模型<?php
class Student extends CI_Model {
function __construct()
{
parent::__construct();
$this->load->database();
}
public function askQ($args)
{
$timeVal = date( "Y-m-d H:i:s", mktime(0, 0, 0));
$qVotes = 0;
$qStatus = 1;
if (!isset($args['uId']) || !isset($args['qTitle']) || !isset($args['qBody']) || !isset($args['qTag'])) {
return false;
}
$this->db->insert('questions',array('userId' => $args['uId'],'questionTitle' => $args['qTitle'],'questionBody' => $args['qBody'],'tagQuestionId' => $args['qTag'],'postDate' => $timeVal,'status' => $qStatus,'votes' => $qVotes));
return true;
}
}
?>
答案 0 :(得分:1)
你也应该讲一下你的REST服务器。您的示例产生了明显不同的HTTP请求,我认为您的服务器代码不能同时处理这两个:
您的第一个示例发送此类HTTP请求:
POST /index.php/rest/resource/questions/uId/1/qTitle/TestQ/qBody/TestBody/qTag/1 HTTP/1.1
Host: some.server.invalid
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 0
没有内容,只有目标网址。
您的第二个示例发送此类HTTP请求:
POST /index.php/rest/resource/questions/ HTTP/1.1
Host: some.server.invalid
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 68
uId%2F=123&%2FqTitle%2F=some+title&%2FqBody%2F=body+txt&%2FqTag%2F=1
您的目标网址不同,然后数据位于请求正文中。
如果你将ajax方法更改为GET,那么jQuery会将参数添加到url,但它仍然不等同于你的硬编码请求:
GET /index.php/rest/resource/questions/?uId%2F=123&%2FqTitle%2F=some+title&%2FqBody%2F=body+txt&%2FqTag%2F=1 HTTP/1.1
Host: some.server.invalid
的更新强>
因此,如果要求使您的第一个请求动态化,则必须手动构建目标网址:
$.ajax({
url: 'index.php/rest/resource/questions/uId/'+qUserId
+'/qTitle/'+encodeURIComponent(qTitle)
+'/qBody/'+encodeURIComponent(qBody)+'/qTag/1',
success: function(data) {
alert(data);
},
type: "post"
});
但是,如果您应该更改服务器代码,可能值得考虑。如果您要发送博客文章或类似内容,则不应将其放在网址中。您应该将其作为正确的POST请求发送。所以,我会设计REST API,以便它接受这个请求:
$.ajax({
url: 'index.php/rest/resource/questions/',
data: { 'uId':qUserId, 'qTitle':qTitle, 'qBody':qBody, 'qTag':'1' },
success: function(data) {
alert(data);
},
type: "post"
});
该示例发送此类HTTP请求:
POST /index.php/rest/resource/questions/ HTTP/1.1
Host: some.server.invalid
Content-Length: 47
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
uId=123&qTitle=some+title&qBody=body+txt&qTag=1
答案 1 :(得分:0)
您可以通过编码参数
来执行以下操作var data = 'uId/='+qUserId+'&/qTitle/='+qTitle+'&/qBody/='+qBody+'&/qTag/=1';
data = encodeURI(data);
$.ajax({
type: "post",
url: 'index.php/rest/resource/questions/',
data: data,
success: function(data) {
alert(data);
}
});
答案 2 :(得分:0)
当您使用data
$.ajax
时,结果会作为表单数据添加(因为您使用type: "post"
)。
从你的问题来看,似乎你想要:
$.ajax({
url: 'index.php/rest/resource/questions/uId/'+qUserId+'/qTitle/'+qTitle+'/qBody/'+qBody+'/qTag/1',
success: function(data) {
alert(data);
},
type: "post"
});
但是,我应该指出,使用data
是POST
的更好选择 - 如果您要发送大量数据然后查看POST
数据,则会调用在服务器上(例如PHP中的$_POST['qBody']
)