2014-10-03 9 views
1

Я не могу получить этот запрос, чтобы сделать что-либо, кроме сбоя. Я использовал завиток и панель инструментов веб-разработчика для проверки созданного URL, WD всегда говорит, что ответ возвращается правильно как 200. Я попытался изменить типы контента на текст, октет-поток и прокомментировать его. Я также принял ответ JSON и подтвердил его с помощью JSONLint.JQuery .ajax Получить запрос всегда не удается

Код, который я использую, это;

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=utf-8"> 
    <link rel="stylesheet" type="text/css" href="css/testing.css"> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" ></script> 
    <script type="text/javascript"> 
    $(function(){ 
     $("body").append("<p>Testing.....</p>"); 
     var test= {latitude:"37.0205",longitude:"-7.969141667",startDate:"09-01-2014",endDate:"09-02-2014"}; 
     var url="<hidden>"; 

     $.ajax({ 
      url : url, 
      type: "GET", 
      data : test, 
      dataType:"json", 
      contentType:"application/json", 
      success: function(data,status) 
      { 
       $("body").append("<p>Success"+JSON.stringify(data)+"</p>"); 
       $("body").append("<p>Success"+status+"</p>"); 
      }, 
      error: function (jqXhr,textStatus,errorThrown) 
      { 
       $("body").append("<p>Failure " + JSON.stringify(jqXhr)+"----- "+ textStatus+ "----- "+ errorThrown+"</p>"); 
      } 
     }); 
     $("body").append("<p>input"+JSON.stringify(test)+"</p>"); 
    }); 
    </script> 
</head> 
<body> 
    <h1>Weather test</h1> 

</body> 
</html> 

Выход в веб-браузере от функции ошибки является "Сбой {" readyState ": 0," responseText ":"», "Статус": 0, "его статуса": "ошибка"} - --- ошибка ----- "

заголовок имеет форму,

HTTP/1.1 200 OK Cache-Control: частный, макс возраста = 0 Сервер: Microsoft-IIS/7.5 X-AspNet-версия: 4.0.30319 X-Powered-By: ASP.NET Дата: Пт, 03 окт 2014 11:57:47 GMT Контент-длина: 25328

и был взят с использованием curl -ivs -raw для URL со всеми соответствующими параметрами получения. Действительный JSON следовал сразу после этого. Я обеспокоен тем, что не иметь тип контента, возможно, это бросает это.

Я знаю, что есть много других подобных вопросов, но я попытался сначала пройти их и применить полученные уроки. Если у вас есть другие предложения, я буду очень благодарен.

Спасибо,

+0

Что значение 'url'?В частности, для другого источника (например, другого домена) используется страница, на которой выполняется скрипт? – apsillers

+0

Просто попробовал это, без изменений, но спасибо. – James

+0

@ На самом деле 'data: test,' преобразует объект 'test' в URL-параметры с помощью' $ .param'. Это нормальное поведение. – Regent

ответ

7

Как вы писали, I'm running the web-page on a server on my home machine and the url is for a different, external server not under my control.

Это обычно означает, что Same origin policy правило работает здесь.

Это не позволяет отправлять cross-domain ajax request так просто.

Если вам действительно нужно отправить запрос на перекрестный домен ajax, взгляните на JSONP или CORS.

+1

В дополнение к этому вы можете проверять уведомления об ошибках через firebug в firefox. Он показывает подсказки, как использовать кросс-домен ajax/запросы –

+0

Чтобы решить проблему, если причина была такой, как предлагалось @BogdanBurim, вы должны добавить HTTP-заголовок Access-Control-Allow-Origin со значением * в ответ на действие url. –

1

Если вы можете получить URL-адрес, используя curl, но ваш вызов ajax возвращает ошибку в вашем браузере, это означает, что URL-адрес не поддерживает CORS (Cross-origin resource sharing) и возвращает заголовок ответа без разрешения Allow-Control-Allow-Origin для вашего домена.

Поскольку URL-адрес предназначен для другого внешнего сервера, который не под вашим контролем, вы не можете включить заголовок Allow-Control-Allow-Origin, поэтому вы не можете правильно решить эту проблему на уровне client/javascript.

Однако решение прост, если вы можете создать PHP-скрипт на своем сервере, который использует завиток для извлечения этого внешнего URL-адреса, и изменить ваш ajax для вызова этого скрипта PHP. Таким образом, ваш ajax вызовет локальный URL-адрес, и больше нет проблемы с междоменным доступом.

Вы можете создать PHP-скрипт и назовите его 'local.php', замените 'your_external_url' с URL:

<?php 
$url = 'your_external_url'; 
$ch = curl_init($url.'?'.$_SERVER['QUERY_STRING']); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch); 
echo $result; 
?> 

И измените АЯКС URL для 'local.php':

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="content-type" content="text/html;charset=utf-8"> 
    <link rel="stylesheet" type="text/css" href="css/testing.css"> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" ></script> 
    <script type="text/javascript"> 
    $(function(){ 
     $("body").append("<p>Testing.....</p>"); 
     var test= {latitude:"37.0205",longitude:"-7.969141667",startDate:"09-01-2014",endDate:"09-02-2014"}; 
     var url="local.php"; 

     $.ajax({ 
      url : url, 
      type: "GET", 
      data : test, 
      dataType:"json", 
      contentType:"application/json", 
      success: function(data,status) 
      { 
       $("body").append("<p>Success"+JSON.stringify(data)+"</p>"); 
       $("body").append("<p>Success"+status+"</p>"); 
      }, 
      error: function (jqXhr,textStatus,errorThrown) 
      { 
       $("body").append("<p>Failure " + JSON.stringify(jqXhr)+"----- "+ textStatus+ "----- "+ errorThrown+"</p>"); 
      } 
     }); 
     $("body").append("<p>input"+JSON.stringify(test)+"</p>"); 
    }); 
    </script> 
</head> 
<body> 
    <h1>Weather test</h1> 

</body> 
</html> 
Смежные вопросы