【问题标题】:Ajax response is JSON on server and STRING on local computer with CakePHP, why?Ajax 响应在服务器上是 JSON,而在本地计算机上使用 CakePHP 是 STRING,为什么?
【发布时间】:2014-04-15 09:24:30
【问题描述】:

在本地和服务器上,我使用相同的代码得到不同的结果。

我的结果在本地以字符串形式到达,而在服务器上,相同的代码返回 JSON 对象。谁能告诉我为什么?

javascript:

$.post(
    url, // Various urls of type '/users/add_secondary_email_ajax'
    data,
    function(res){
        if (typeof(res.success)=='undefined'){
            ModalManager.update_body_html(res);
        }else{
            callback_success(res);
        }
    }
);  

CakePHP:

$this->autoRender = false; 
$this->RequestHandler->respondAs('json');
echo json_encode( array('success'=>true) ); // this arrives as string locally
return;     

我在我的另一台电脑上也有这个工作,但不是这台电脑。会不会是一些 PHP 设置?

两台电脑的 Browser 和 CakePHP 版本相同 (2.2.3)。

我发现 PHP 和 Apache 版本之间存在差异。也可以是设置,但我不知道在哪里看。

损坏的计算机上的标题:

Request URL:localhost/alert_subscribers/subscribe_ajax
Request Method:POST
Status Code:200 OK

Request Headers 
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,bg;q=0.6
Connection:keep-alive
Content-Length:153
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:timezoneoffset=-120; viewedJobsGuest=[24]; __atuvc=13%7C11%2C46%7C12; CAKEPHP=dfbf9407743d43eb619a42aa5dbda735; toolbarDisplay=hide
Host:jobsadvent.dev
Origin:URL:localhost
Referer:URL:localhost/search
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36
X-Requested-With:XMLHttpRequest

Form Data
data[title]:the title
data[email]:fake2@hotmail.com
data[alert]:1

Response Headers 
Connection:Keep-Alive
Content-Length:57
Content-Type:text/html
Date:Fri, 21 Mar 2014 10:19:06 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.26 (Unix) DAV/2 PHP/5.4.24 mod_ssl/2.2.26 OpenSSL/0.9.8y
X-Powered-By:PHP/5.4.24

工作计算机上的标题

Request URL:http://domain.com/alert_subscribers/subscribe_ajax
Request Method:POST
Status Code:200 OK

Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,bg;q=0.6
Connection:keep-alive
Content-Length:162
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:__atuvc=1%7C10%2C5%7C11; timezoneoffset=-120; CAKEPHP=sb3013ffk40h7o1jhsl8ulqfj4; toolbarDisplay=hide
Host:domain.com
Origin:http://domain.com
Referer:http://domain.com/search
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36
X-Requested-With:XMLHttpRequest

Form Data 
data[title]:the title
data[email]:fake@hotmail.com
data[alert]:1

Response Headers 
Connection:close
Content-Length:57
Content-Type:application/json
Date:Fri, 21 Mar 2014 10:24:32 GMT
Server:Apache/2.2.15 (CentOS)
X-Powered-By:PHP/5.3.3

routes.php 文件完全相同,包含以下行:

Router::parseExtensions('json');

【问题讨论】:

  • 是否设置了正确的application/json 标头?
  • 嗯,不 - 计算机 1 是 application/json,另一台是 text/html。两者都有我在那里发布的相同代码。
  • 您请求的 URL 是什么。你忘了提到那条重要的信息。另外:您应该始终提及您正在使用的确切 cakephp 版本。
  • 我更新了 CakePHP 版本。还在代码块中添加了 url 作为注释。
  • 两个安装的配置方式相同吗?特别是路由和解析扩展?

标签: php ajax json cakephp


【解决方案1】:

请参阅jQuery.post() 文档。您可以使用第四个参数 (dataType) 来强制 jQuery 强制响应正确的数据类型。如果您想要返回一个对象,则需要将其设置为等于 'json'

【讨论】:

  • 我知道dataType 参数,但在另一台机器上它可以在没有它的情况下工作。同样在某些情况下,我希望服务器返回 HTML 而不是 JSON。
  • 您是否在另一台机器上使用相同的浏览器/版本?
  • 是的,当然。问题描述的 PHP 和浏览器版本。
  • 鉴于问题陈述,问题不是来自客户端。你的回答是一个修复,而不是他的问题的答案。一个内容类型是application/json而另一个是text/html的原因需要调查。
【解决方案2】:

好吧,不-计算机 1 是 application/json,另一台是 text/html。两者都有我在那里发布的相同代码。

你的问题。 jQuery 使用响应的 Content-Type 标头作为指导。

CakePHP docs 似乎表明 $this->RequestHandler->respondAs() 如果你通过它application/json 而不仅仅是json 可能会更好。

【讨论】:

  • 试过这个。它仍然返回字符串。它也没有解释为什么它在两台计算机上有所不同:\
  • 您是否检查了标头以查看是否正确发送?您是否研究过他们的 Web 服务器之间的差异,而不仅仅是 PHP 和浏览器?
  • 你能给出关于在网络服务器上寻找什么的想法吗?
【解决方案3】:

JSON 解析应该可以修复它。

$.post(
    url, // Various urls of type '/users/add_secondary_email_ajax'
    data,
    function(res){
        var result = JSON.parse(res);
        if (typeof(result.success)=='undefined'){
            ModalManager.update_body_html(res);
        }else{
            callback_success(res);
        }
    }
);  

【讨论】:

    【解决方案4】:

    可能是您的 apache 设置的问题:

    Apache sending incorrect response header for .js files 上给出的答案表明您需要类似的东西

    <FilesMatch \.php$>
        SetHandler application/x-httpd-php
    </FilesMatch>
    

    获取正确的内容类型。

    【讨论】:

    • 我正要发同样的,XD
    • 请注意,您应该指定它进入 .htaccess(以防他们没有注意到)
    【解决方案5】:

    这可能会很麻烦,但在真正担心的事情发生之前不要担心。

    事实陈述:您的一台服务器的行为符合预期,而另一台则不然。

    根据您的错误的表现方式,这听起来很像您没有足够具体地指定您的请求,或者您的服务器出现故障Content Negotiation

    这里有两个基本的东西你可能已经知道了:请求者的“Accept”标头允许用户代理指定它愿意接收的内容类型,以及服务器解释该请求的能力并适当地提供服务。如果没有明确设置 Accept 标头,则 text\html 是默认响应类型。

    Accept Header: RFC2616 Hypertext Transfer Protocol Section 14.1

    Accept request-header 字段可用于指定某些媒体 响应可接受的类型。接受标头可以是 用于表示请求被特别限制为一个小的 一组所需的类型,如对内联请求的情况 图片。 星号“”字符用于将媒体类型分组为范围, 其中“/”表示所有媒体类型,“type/”表示所有 该类型的子类型。媒体范围可以包括媒体类型 适用于该范围的参数。

    您为每个请求设置的接受标头表明您不在乎服务器为您提供什么。您可以尝试将您的接受标头设置为 application/json 并查看“损坏的”服务器是否可以解释它并为您服务。如果这可行,那么您似乎只是遇到了与服务器默认其响应类型的方式不一致的问题。这甚至看起来就是你要求它做的事情。您说您接受所有响应类型。如果你不指定具体的东西,服务器给你的最合理的类型是 text/html

    MIME Types: RFC 2046 Multipurpose Internet Mail Extensions

    JSON: RFC 4627 The application/json Media Type for JavaScript Object Notation (JSON)

    如果设置 Accept 标头对您不起作用,您将需要检查服务器的 MIME 类型注册,以确保 [application\json] 已注册和配置。这不是一个深奥的配置主题,因此它应该可以在任何服务器的配置文档中找到。

    如果这两种方法都不起作用,那么解决方案是拔掉有问题的机器,把它带到建筑物的顶部,and throw it as far as you can.

    【讨论】:

      【解决方案6】:

      我会在您的 $.POST 请求中设置 contentType 和 dataType。

      $.POST({
          contentType : "application/x-www-form-urlencoded; charset=UTF-8",
          dataType : "json"
      }) 
      

      【讨论】:

        【解决方案7】:
        1. 调用api时: $.post(); “dataType”参数应该设置为“json”。如果不指定,ajax会智能猜测(xml、json、script、text、html...)。见手册here

        那么 ajax 是如何猜测数据类型的呢? 有一个响应头“Content-Type:”,服务器通过它告诉客户端什么是数据类型。我认为,ajax 需要这个头来猜测数据类型。 这是您损坏的计算机的响应:

        Content-Type:text/html
        

        这是您的工作计算机的响应:

        Content-Type:application/json
        

        如果你不想指定$.post()的参数“dataType”,你可以改变响应头,改变的方法肯定有很多,像这样:

        <?php
           header("Content-Type:application/json");
        ?>
        

        【讨论】:

          猜你喜欢
          • 2021-10-12
          • 1970-01-01
          • 2018-05-26
          • 2022-06-14
          • 1970-01-01
          • 2014-09-11
          • 1970-01-01
          • 1970-01-01
          • 2013-11-21
          相关资源
          最近更新 更多