【问题标题】:Forward slash in ajax call url dataajax 调用 url 数据中的正斜杠
【发布时间】:2013-12-31 22:04:21
【问题描述】:

我正在尝试将服务器数据解析为 REST API 作为要存储在数据库中的帖子。但是数据似乎没有被解析。如果我按如下方式对 url 进行硬编码,则数据将成功发布,

$.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;
    }
}   
?>

【问题讨论】:

  • 您在“成功”功能上缺少一个“s”。不知道这会如何工作=D
  • @m59 :D 我看到了,感谢您指出 :) 但仍然没有发布数据

标签: javascript php ajax rest


【解决方案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    


更新

因此,如果要求使您的第一个请求动态化,您必须手动构建目标 url:

$.ajax({
    url:  'index.php/rest/resource/questions/uId/'+qUserId
         +'/qTitle/'+encodeURIComponent(qTitle)
         +'/qBody/'+encodeURIComponent(qBody)+'/qTag/1',
    success: function(data) {
      alert(data);
    },
    type: "post"      
});


不过,考虑是否应该更改服务器代码可能是值得的。如果您要发送博客文章或类似内容,则不应将其放在 url 中。您应该将其作为正确的 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

【讨论】:

  • 嗨,我为上述 ajax 调用添加了控制器和模型代码.. :)
  • @Hasitha 我不熟悉 CI,但如果你想使用 POST 方法,你对数据的访问似乎是 $this-&gt;input-&gt;post 而不是 $this-&gt;url。 IE。如果使用您的原始代码,$this-&gt;input-&gt;post('uId/') 应该给您 uId。如果使用我的最后一个例子,$this-&gt;input-&gt;post('uId') 给你 uId。
  • 谢谢。您的答案涉及 URL 连接 url: 'index.php/rest/resource/questions/uId/'+qUserId +'/qTitle/'+encodeURIComponent(qTitle) +'/qBody/'+encodeURIComponent(qTitle)+'/qTag/1' 成功了 :) 再次感谢 :)
【解决方案2】:

当您使用$.ajaxdata 时,结果将作为表单数据添加(因为您使用type: "post")。

从你的问题来看,似乎你想要:

$.ajax({
  url: 'index.php/rest/resource/questions/uId/'+qUserId+'/qTitle/'+qTitle+'/qBody/'+qBody+'/qTag/1',
  success: function(data) {
    alert(data);
  },
  type: "post"      
});

但是,我应该指出,如果您要发送大量数据,然后只需查看服务器上的 POST 数据(例如 @ 987654329@ 在 PHP 中)

【讨论】:

  • 感谢您的回复,我一开始尝试了这个解决方案。但没有帮助:(再次感谢回复
  • @Hasitha 我怀疑这与q 变量的内容有关。您能否设置一个jsFiddle,其中包含无效代码的值?
  • 我希望我能,但他的问题是这是一个带有 php 的 MVC 项目。同样使用您的解决方案会在 web 控制台 firefox 中出现错误请求。 :(
  • @Hasitha:然后尝试仅记录 url(在执行 $.ajax 之前):console.log('index.php/rest/resource/questions/uId/'+qUserId+'/qTitle/'+qTitle+'/qBody/'+qBody+'/qTag/1') 并发布结果。错误请求通常是由于 url 无效。
【解决方案3】:

您可以通过编码参数执行以下操作

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);
   }
 });  

【讨论】:

  • 非常感谢您的回复,但它说它不能发布:(不知道是什么原因
猜你喜欢
  • 2015-08-11
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2016-10-29
相关资源
最近更新 更多