Подтвердить что ты не робот

HTTP-запрос Ajax через страницу HTTPS

У меня есть сайт с некоторыми страницами в HTTPS-соединении. На этих страницах HTTPS я должен использовать HTTP-запрос Ajax для получения некоторых ошибок, таких как пустые поля. Но сообщения об ошибках не поступают. Есть ли какое-либо решение для этого или я должен сделать этот запрос AJAX для файла на HTTPS-подключении?

4b9b3361

Ответ 1

Это невозможно из-за Same Origin Policy.

Вам также нужно будет переключать запросы Ajax на https.

Ответ 2

В некоторых случаях односторонний запрос без ответа может быть запущен на TCP-сервер без сертификата SSL. Сервер TCP, в отличие от HTTP-сервера, заставит вас запросить. Однако не будет доступа к каким-либо данным, отправленным из браузера, поскольку браузер не будет отправлять какие-либо данные без проверки положительного сертификата. И в особых случаях даже голый сигнал TCP без каких-либо данных достаточно для выполнения некоторых задач. Например, для устройства IoT в локальной сети для запуска подключения к внешней службе. Ссылка

Это своего рода триггер "Wake Up", который работает на порту без какой-либо защиты.

В случае необходимости ответа это может быть реализовано с использованием защищенного общедоступного https-сервера, который может отправить необходимые данные обратно в браузер, используя, например, WebSockets.

Ответ 3

Без какого-либо решения на стороне сервера Theres - это единственный способ, с помощью которого безопасная страница может получить что-то из небезопасной страницы/запроса, и что мысль postMessage и всплывающее окно

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

Итак, вы можете открыть новую http-страницу с помощью window.open(...) и сделать это для вас (например, если сайт использует CORS)


XDomain пришло в голову, когда я написал это, но вот современный подход, используя новый fetch api, преимущество в потоке больших файлов, недостатком является то, что он не будет работать во всех браузерах

Вы помещаете этот прокси script на любую страницу http

onmessage = evt => {
  const port = evt.ports[0]

  fetch(...evt.data).then(res => {
    // the response is not clonable
    // so we make a new plain object
    const obj = {
      bodyUsed: false,
      headers: [...res.headers],
      ok: res.ok,
      redirected: res.redurected,
      status: res.status,
      statusText: res.statusText,
      type: res.type,
      url: res.url
    }

    port.postMessage(obj)

    // Pipe the request to the port (MessageChannel)
    const reader = res.body.getReader()
    const pump = () => reader.read()
    .then(({value, done}) => done 
      ? port.postMessage(done)
      : (port.postMessage(value), pump())
    )

    // start the pipe
    pump()
  })
}

Затем вы открываете всплывающее окно на странице https (обратите внимание, что вы можете делать это только в случае взаимодействия с пользователем, иначе он будет заблокирован)

window.popup = window.open(http://.../proxy.html)

создать свою служебную функцию

function xfetch(...args) {
  // tell the proxy to make the request
  const ms = new MessageChannel
  popup.postMessage(args, '*', [ms.port1])

  // Resolves when the headers comes
  return new Promise((rs, rj) => {

    // First message will resolve the Response Object
    ms.port2.onmessage = ({data}) => {
      const stream = new ReadableStream({
        start(controller) {

          // Change the onmessage to pipe the remaning request
          ms.port2.onmessage = evt => {
            if (evt.data === true) // Done?
              controller.close()
            else // enqueue the buffer to the stream
              controller.enqueue(evt.data)
          }
        }
      })

      // Construct a new response with the 
      // response headers and a stream
      rs(new Response(stream, data))
    }
  })
}

И сделайте запрос, как обычно, с помощью fetch api

xfetch('http://httpbin.org/get')
  .then(res => res.text())
  .then(console.log)

Ответ 4

Тем не менее это можно сделать с помощью следующих шагов:

  • отправьте запрос https ajax на ваш веб-сайт (тот же домен)

    jQuery.ajax({
        'url'      : '//same_domain.com/ajax_receiver.php',
        'type'     : 'get',
        'data'     : {'foo' : 'bar'},
        'success'  : function(response) {
            console.log('Successful request');
        }
    }).fail(function(xhr, err) {
        console.error('Request error');
    });
    
  • получить запрос ajax, например, php, и сделать запрос CURL на любой желаемый веб-сайт через http.

    use linslin\yii2\curl;
    $curl = new curl\Curl();
    $curl->get('http://example.com');
    

Ответ 5

Из javascript я пробовал несколько способов, и я не мог.

Вам нужно решение на стороне сервера, например, на С#. Я создал контроллер, который вызывается на http, en deserialize, и результат заключается в том, что когда я вызываю из javascript, я делаю запрос от моего https://domain в мой htpps://domain. См. Мой код С#:

[Authorize]
public class CurrencyServicesController : Controller
{
    HttpClient client;
    //GET: CurrencyServices/Consultar?url=valores?moedas=USD&alt=json
    public async Task<dynamic> Consultar(string url)
    {
        client = new HttpClient();
        client.BaseAddress = new Uri("http://api.promasters.net.br/cotacao/v1/");
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
        System.Net.Http.HttpResponseMessage response = client.GetAsync(url).Result;

        var FromURL = response.Content.ReadAsStringAsync().Result;

        return JsonConvert.DeserializeObject(FromURL);
    }

И позвольте мне показать вам мою клиентскую сторону (Javascript)

<script async>
$(document).ready(function (data) {

    var TheUrl = '@Url.Action("Consultar", "CurrencyServices")?url=valores';
    $.getJSON(TheUrl)
        .done(function (data) {
            $('#DolarQuotation').html(
                '$ ' + data.valores.USD.valor.toFixed(2) + ','
            );
            $('#EuroQuotation').html(
                '€ ' + data.valores.EUR.valor.toFixed(2) + ','
            );

            $('#ARGPesoQuotation').html(
                'Ar$ ' + data.valores.ARS.valor.toFixed(2) + ''
            );

        });       

});

Я хочу, чтобы это помогло вам! Приветствия