отправить html-форму с помощью AJAX и отобразить ответ json от внешнего API

У меня очень простая форма с одним полем ввода. Я хочу отправить эту форму с помощью AJAX и отобразить ответ в div на странице.

Некоторые моменты. - Ответ от API имеет тип данных JSON. - API находится не на том же сервере, что и клиент, делающий запрос.

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

Предупреждение в консоли отладки:

Запрос между источниками заблокирован: политика того же источника запрещает чтение удаленного ресурса по адресу https://api.ssllabs.com/api/v2/analyze?&host=www.domain.com. Это можно исправить, переместив ресурс в тот же домен или включив CORS.

-- Мой HTML-код --

<body>
  <form id="myAjaxRequestForm">
    <fieldset>
      <legend>Request</legend>
      <p>
        <label for="hostname">Host:</label>
        <input id="hostName" type="text" name="hostName" />
      </p>
      <p>
        <input id="myButton" type="button" value="Submit" />
      </p>
    </fieldset>
  </form>
  <div id="anotherSection">
    <fieldset>
      <legend>Response</legend>
      <div id="ajaxResponse"></div>
    </fieldset>
  </div>
</body>

-- Мой Jquery с AJAX --

$(document).ready(function() {

  //Stops the submit request
  $("#myAjaxRequestForm").submit(function(e) {
    e.preventDefault();
  });

  //checks for the button click event
  $("#myButton").click(function(e) {

    //get the form data and then serialize that
    dataString = $("#myAjaxRequestForm").serialize();

    //get the form data using another method
    var hostName = $("input#hostName").val();
    dataString = "host=" + hostName;

    //make the AJAX request, dataType is set to json
    //meaning we are expecting JSON data in response from the server
    $.ajax({
      type: "GET",
      url: "https://api.ssllabs.com/api/v2/analyze?",
      data: dataString,
      dataType: "json",

      //if received a response from the server
      success: function(response) {
        $("#ajaxResponse").append("<b>Server Name:</b> " + response.first + "");
        $("#ajaxResponse").append("<b>Port:</b> " + response.second + "");
        $("#ajaxResponse").append("<b>Protocol:</b> " + response.third + "");
      },

    });
  });

});

person user3436467    schedule 06.04.2015    source источник
comment
Я обновил тип данных до jsonp, повторно запустил вызов API и получил эту ошибку в консоли отладки SyntaxError:missing ; перед оператором анализа: 1: 7 файл «анализ» принадлежит серверу API — означает ли это, что он не поддерживает jsonp или где-то в моем коде есть другая ошибка?   -  person user3436467    schedule 06.04.2015


Ответы (2)


Cross-Origin Request Blocked: означает, что вы не можете вызывать сайты https:// с http://, и большинство браузеров отключают это.

Решение:

1) Используйте jsonp вместо json для типа данных: "json", если это работает, все в порядке

2) если jsonp не поддерживается, создайте один файл php в своем рабочем каталоге, доступ к API ЧЕРЕЗ curl. и эхо-ответ как json. а затем вызывайте этот php только из вашего ajax.

ОБНОВИТЬ, ЕСЛИ JSON СБОЙ

Я предполагаю, что вы используете php

  1. Создайте файл php с именем api.php в вашем каталоге.

    <?php
    header( "Content-Type: application/json" );
    //create cURL connection
    $curl_connection =curl_init('https://api.ssllabs.com/api/v2/analyze?host='.$_REQUEST['host']);
    
    ///set options
    curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
    curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
    
    
    //perform our request
    $result = curl_exec($curl_connection);
    echo $result;
    //close the connection
    curl_close($curl_connection);
    
    
    ?>
    
  2. Теперь сделайте ajax-вызов api.php из вашего javascript, а не https://api.ssllabs.com/api/v2/analyze?

    $.ajax({
      type: "GET",
      url: "yourhost/yourpath/api.php", //change this that suits you
      data: dataString,
      dataType: "json",
      ....
    

Наконец заполните такие значения

    $("#ajaxResponse").append("<b>Server Name:</b> " + response.endpoints[0].serverName+ "");
    $("#ajaxResponse").append("<b>Port:</b> " + response.port+ "");
    $("#ajaxResponse").append("<b>Protocol:</b> " + response.protocol+ "");
person Sagar Devkota    schedule 06.04.2015
comment
Спасибо за ваше предложение. Я попробовал ваше первое решение. Я обновил тип данных до jsonp, повторно запустил вызов API и получил эту ошибку в консоли отладки SyntaxError:missing ; перед оператором анализа: 1: 7 файл «анализ» принадлежит серверу API — означает ли это, что он не поддерживает jsonp или где-то в моем коде есть другая ошибка? - person user3436467; 06.04.2015
comment
пожалуйста, добавьте следующую строку и позвольте мне увидеть ваш вывод. console.log(результат); на первой строке внутри функции успеха - person Sagar Devkota; 06.04.2015
comment
конечно, я сделал это. где я могу найти вывод console.log? - person user3436467; 06.04.2015
comment
F12 для хрома и нажмите вкладку консоли - person Sagar Devkota; 06.04.2015
comment
вот он из хрома: анализировать?&callback=jQuery111003550140524748713_1428300933030&host=www.verisign.com&_=1428300933031:1 Uncaught SyntaxError: Неожиданный токен: - person user3436467; 06.04.2015
comment
я приблизился к предложенному вами решению api.php: после вызова api.php - см., что div в html был заполнен, но значения, где «не определено» Имя сервера: неопределенный Порт: неопределенный Протокол: неопределенный в моем коде у меня есть это, но у меня есть чувство, что это неправильно? $(#ajaxResponse).append(‹b›Имя сервера:‹/b› + response.first + ); какой правильный параметр я должен использовать здесь вместо «response.first»? - person user3436467; 06.04.2015
comment
Да, я обновил способ обновления частей div и curl в php, поэтому обновите один раз - person Sagar Devkota; 06.04.2015
comment
отлично с этим работает. Я попытался добавить еще несколько строк, чтобы получить больше данных из ответа API, но я получил «неопределенное» для этих... response.grade и response.ipAddress. Я последовал вашему примеру, но пытался понять, почему они не работают. чувствительность к регистру точно так же, как в ответе API. - person user3436467; 06.04.2015
comment
все хорошо .. поскольку данные были после первой конечной точки, мне пришлось добавить: endpoints[0], так что это выглядит так: response.endpoints[0].grade спасибо за вашу помощь Sagar! безмерно оценен!! - person user3436467; 06.04.2015
comment
посмотрите это изображение prntscr.com/6q622m и сделайте так, как вам нужно. ваш голос и принятый ответ будут оценены - person Sagar Devkota; 06.04.2015
comment
извините, у меня недостаточно репутации, чтобы проголосовать. У меня есть последний вопрос, и я рад открыть новую тему, если это необходимо. В основном хотите знать, как добавить оператор if в один из обратных вызовов, то есть if (response.endpoints[0].statusMessage == ready) {делать что-то..}, но, похоже, это не работает. - person user3436467; 06.04.2015

Поскольку вы используете JSON, вы можете изменить атрибут dataType на jsonp, и запрос будет выполнен успешно, игнорируя политику перекрестного происхождения.

$.ajax({
  type: "GET",
  url: "https://api.ssllabs.com/api/v2/analyze?",
  data: dataString,
  dataType: "jsonp",
...

Изменить: этот запрос успешно обходит политику Cross-Origin, но все равно вызывает ошибку Unexpected Token :. Подробнее об этой ошибке см. здесь. Если у вас есть доступ к серверу, с которого вы запрашиваете данные, добавьте заголовок ответа Access-Control-Allow-Origin:'*'. Подробнее о заголовках CORS см. здесь.

person IronFlare    schedule 06.04.2015
comment
Я обновил тип данных до jsonp, повторно запустил вызов API, и предупреждение CORS исчезло, но теперь я получаю эту ошибку в консоли отладки SyntaxError:missing ; перед оператором анализа: 1: 7 файл «анализ» принадлежит серверу API — означает ли это, что он не поддерживает jsonp или где-то в моем коде есть другая ошибка? - person user3436467; 06.04.2015
comment
К сожалению, похоже, это результат того, что сервер не поддерживает JSONP. Я определил это, просмотрев это сообщение, так что это может быть хорошим местом для начала ответы. Кроме того, это слайд-шоу является отличным источником информации о том, как получить прошлая политика перекрестного происхождения. - person IronFlare; 06.04.2015