изпратете 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 за dataType: "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
ето го от chrome: анализ?&callback=jQuery111003550140524748713_1428300933030&host=www.verisign.com&_=1428300933031:1 Uncaught SyntaxError: Unexpected token: - person user3436467; 06.04.2015
comment
доближих се до предложеното от вас решение за api.php: след като направих повикване до api.php - вижте, че div в html е попълнен, но стойностите където „undefined“ Име на сървъра: undefined Порт: undefined Протокол: undefined в моя код, който имам това, но имам чувството, че е грешно? $(#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) { do stuff.. }, но изглежда не работи.. - person user3436467; 06.04.2015

Тъй като използвате JSON, можете да промените атрибута dataType на jsonp и заявката ще завърши успешно, пренебрегвайки правилата за различни източници.

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

Редактиране: Тази заявка успешно заобикаля правилата за различни източници, но все пак ще доведе до грешка 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. Реших, че като разгледах тази публикация, така че може да е добро място да започне за отговори. Освен това Това слайдшоу е отличен източник на информация относно получаването предишна политика за Cross-Origin. - person IronFlare; 06.04.2015