У меня есть сайт с некоторыми страницами в HTTPS-соединении. На этих страницах HTTPS я должен использовать HTTP-запрос Ajax для получения некоторых ошибок, таких как пустые поля. Но сообщения об ошибках не поступают. Есть ли какое-либо решение для этого или я должен сделать этот запрос AJAX для файла на HTTPS-подключении?
HTTP-запрос Ajax через страницу HTTPS
Ответ 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) + ''
);
});
});
Я хочу, чтобы это помогло вам! Приветствия