【问题标题】:JQuery JSON Calls To PHP WebService Always Runs "Error" CallbackJQuery JSON 调用 PHP WebService 总是运行“错误”回调
【发布时间】:2014-01-08 06:32:28
【问题描述】:

我现在很头疼,因为我整天都遇到这个问题,但仍然无法解决。我在 Google 和 StackOverflow 上看了几个小时,尝试了很多方法(包括从 JSON 更改为 JSONP,检查 PHP 的标头,localhost 测试),询问朋友等,但我仍然卡住了。也许只是一个细节,我不知道。

我正在开发一个 Android 移动应用程序,为此,我在主机(比如 example.com)上有一个 PHP 网络服务,它工作正常,因为我使用 PHP WS JSON 客户端进行了测试。问题是我现在使用 jQuery、JSON 和 Ajax 从我计算机上的 JS 文件调用这个 WS,我从 Google Chrome 的调试器控制台得到以下响应:

  • 就绪状态:4
  • 状态文本:“确定”
  • responseText:(我需要的,没有错误)

但是在服务器的响应中,我总是收到错误回调,而不是成功。我读它是因为服务器无法正确解析 JSON,但我真的不知道。

我的代码留给你。

来自 CLIENT.JS:

$.ajax({
    type: "POST",
    crossDomain: true,
    contentType: "application/json utf-8",
    dataType: "json",
    url: "http://www.example.com/ws/webservice.php/" + methodName,
    data: JSON.stringify(window.parameterArray),

    success: function (response)
        {
            alert('Success!');
            window.resultVar = "Success! " + response;
            console.log(response);
        },
    error: function (response)
        {
            alert('Error');
            window.resultVar = "Error: " + response;
            console.log(response);
        }
});

来自 SERVER.PHP:

<?php
header('Access-Control-Allow-Origin: *');  //I have also tried the * wildcard and get the same response
header("Access-Control-Allow-Credentials: true");
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type, Content-Range, Content-Disposition, Content-Description');
header('Content-type: application/json; charset=utf-8');

require_once "mobilefuncts.php";

$methodName = str_replace($_SERVER["SCRIPT_NAME"]."/", "", $_SERVER["REQUEST_URI"]);

if (isset($methodName))
{
   $param = (array)json_decode($HTTP_RAW_POST_DATA);

   $access = new MobileAccess();  //From mobilefuncts.php
   $result = call_user_func_array(array($access,$methodName), $param);   //Calls the method

   echo json_encode($result);
}
?>

有谁知道可以做什么?也许,正如我之前所说,问题只是一个细节。我真的不知道,我对这种事情有点陌生。

感谢正手!

更新:

我刚刚意识到 Chrome 控制台告诉我这个:

GET http://localhost:81/.../cordova_plugins.json 404 (Not Found)

这可能是问题的原因吗?

更新 2:

看这里,我有线索。我在错误函数中添加了更多参数,得到了这个结果:

(error的变化是从function(response)function(jqXHR, textStatus, errorThrown))

jqXHR.responseText: [an array with the info I'm asking]
errorThrown: "SyntaxError: Unexpected token"

【问题讨论】:

  • contentType: "application/json utf-8" 缺少分号?
  • “响应”在说什么?
  • 'response' 说,除其他外,我在主帖上的内容:readyState:4 status:200 statusText:“OK” responseText:(我需要什么,没有错误)

标签: javascript php jquery json web-services


【解决方案1】:

因为您正在进行跨域调用,所以需要使用 JSONP。 PHP 服务器必须形成如下所示的响应:callback(jsonSyntax);

【讨论】:

  • 谢谢,T McKeown!确实,这是解决问题的方法。等我得到15个声望点我就给你正确的投票,呵呵。再次感谢,我希望我吸取了教训。
【解决方案2】:

改变

contentType: "application/json utf-8",

contentType: "application/json; charset=utf-8",

您的contentType 标头格式错误导致您的服务器错误地解释您的POST 请求的内容。

【讨论】:

  • 对不起,Brad M,但此解决方案不起作用。实际上,我更改了该说明以尝试解决该问题,因为几天前我就遇到过这种情况。不管怎么说,还是要谢谢你!你给了我片刻希望:)
【解决方案3】:

尝试将 JQuery URL 更改为:

http://www.example.com/ws/webservice.php/methodName

收件人:

http://www.example.com/ws/webservice.php?method=methodName

然后尝试从 PHP 的 $_GET['method'] 中读取它,我认为这应该是你的问题

【讨论】:

  • 不,同样的结果。事情是 WS 正确获取方法,但回调有问题。 responseText 正在工作,因为它得到了我想要的东西,但它是在“错误”回调而不是“成功”中出现的。无论如何,谢谢,Elhussein Hashem。
【解决方案4】:

只需将您的响应更改为文本,然后将文本解析为 JSON,例如:

var json = JSON.parse(data);

【讨论】:

  • 我不明白这种方法。我唯一能想到的是在响应上使用 JSON.parse (确实,我必须在某处使用),但问题是解析应该在成功或错误回调中调用,不是吗?因此它不起作用,因为我在成功回调上所做的任何事情都不会发生。我做对了吗?
  • 我没有关注...在婴儿步骤中执行此操作...如果您无法让您的服务器返回 JSON,那么我将继续前进并将结果作为文本获取然后解析对于 JSON,错误是错误将是文本...我有类似的问题,我的 ashx 处理程序没有以 JSON 形式返回,所以我将它作为字符串接收并解析它。
  • 收到 404 错误意味着找不到某些资源....是您正在加载的cordova.json 吗???
  • 还是您通过 AJAX 调用的那个 URL?
  • 确实如此,在移动应用程序的主文件中。它必须是文件的一部分:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
相关资源
最近更新 更多