为什么AJAX调用不仅不能在iOS上运行,在其他所有地方都可以正常运行?

时间:2019-06-13 08:53:16

标签: javascript php jquery ios ajax

我正在使用jQuery和PHP从头开始创建一些AJAX星级,并且意识到在任何地方它都可以正常工作,但不能在iOS上运行。我检查了一些插件(jRating),并遇到了同样的问题。它将数据发送到服务器(PHP),但在错误:处理程序上返回Error Undefined。

我已经尝试了几乎所有其他平台和浏览器(Linux-chrome,FF,Opera; Windows-IE,Edge; Android-Chrome,Opera),并且一切正常。 iOS上的浏览器无法正常运行。值得一提的是,该服务器位于Amazon Cloudfront之后。但是我让它传递了原始服务器中的所有标头,并且我可以在Chrome开发者控制台中看到正确的Access-Control-Allow-Origin标头。

我还搜索并尝试了所有有关缓存和相对URL,JSON数据类型等的建议,但都没有碰到运气。我也尝试过将随机参数添加到POST URL中-不走运。

有时候,假设每三分之一的请求都能够返回正确的数据。

我的JS代码:

$('.mystars.ajax input').on('click', function(e){
  e.preventDefault();
  var form = $(this).parent();

  $.ajax({
    type: "POST",
    url: 'my/ajax/url',
    context: this,
    cache: false,
    dataType: 'json',
    headers: { "cache-control": "no-cache" },
    async: true,
    crossDomain: true,
    data: form.serialize(),
    xhrFields: {
      withCredentials: true
    },
    success: function(data)
    {
      alert('xhr success');
      // parse show message to user according to server response.
    },
    error: function(jqXhr, textStatus, errorThrown) {
      alert("Rate problem. Error: " + jqXhr.responseText + ", textStatus: " + textStatus + ", errorThrown: " +  errorThrown)
    },
    complete: function(){
      console.log('compete');
    }
  });
});

这是服务器响应代码的一部分:

$myResponse['error'] = false;
$myResponse['message'] = 'Everything is just fine';
if (isset($_SERVER['HTTP_ORIGIN'])) {
  header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
  header('Access-Control-Allow-Credentials: true');
  header('Access-Control-Max-Age: 86400');
  header('Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS');
}
header('Content-Type: application/json');
echo json_encode($myResponse);
exit(0);

它应该写成功,但它会提示费率问题。错误:未定义。 textStatus:错误,错误抛出:

1 个答案:

答案 0 :(得分:0)

我相信您正在本地计算机上进行测试。

当您在计算机上进行测试时,“ my / ajax / url”指的是同一域。因此,假设您的测试网站位于http://localhost/mywebsite上,那么AJAX将命中完整的绝对URL,即“ http://localhost/mywebsite/my/ajax/url

在您的iOS(我相信它是另一台设备,例如iPhone /平板电脑/笔记本电脑/等)上,当AJAX尝试点击“ http://localhost/mywebsite/my/ajax/url”时,它试图在同一设备中找到该URL (iphone /平板电脑/笔记本电脑/等),而不是托管网站的计算机。

所以:

  1. 确保您设置了正确的URL。 在AJAX之前对完整的绝对URL(例如“ http://localhost/mywebsite/my/ajax/url”而不是“ my / ajax / url”)发出警报。
  2. 在您的PHP中,第一行输入:echo "hi from server"; exit;,在AJAX成功函数中,输入此输入:alert(data);

检查您是否正在将AJAX发送到正确的URL(#1),并从正确的服务器(#2)接收