Допустим ваш сайт, с именем CryptoAlertEmailConfirm.mizerov.com хочет обратиться за данными с помощью jQuery get к другому вашему сайту с именем CryptoAlert.mizerov.com вот таким образом
let pars = new URLSearchParams(window.location.search);
if (pars.has('id')) {
let id = pars.get('id');
$.get("https://cryptoalert.mizerov.com/api/EmailConfirm/" + id,
function (data) {
var o = jQuery.parseJSON(data);
$('#o1').html(o.id);
$('#o2').html('Спасибо ' + o.Name + '');
$('#o3').html('Адрес: ' + o.Email + ' подтвержден.');
}
);
}
Конечно браузер по умолчанию не может вам разрешить это сделать, он выдаст ошибку.
Access to XMLHttpRequest at ‘https://cryptoalert.mizerov.com/api/EmailConfirm/36’ from origin ‘https://cryptoalertemailconfirm.mizerov.com’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. jquery.min.js:2 GET https://cryptoalert.mizerov.com/api/EmailConfirm/36 net::ERR_FAILED
Что это значит? Все просто, нельзя обращаться к сайту из документа другого сайта. Как это исправить? Опять же, все просто.
1 – Идем в IIS, выбираем сайт, на который надо обратиться из другого вашего сайта и находим там кнопку – Заголовки ответов HTTP
2 – Открываем его и жмем Добавить
Сверху, в поле Имя пишем Access-Control-Allow-Origin, в поле Значение полное название второго сайта из документа которого хотите получать данные с помощью JavaScript.
Теперь все работает!
Кстати, данные мы тут получаем через ASP.Net Core Web API Service
using am.BL;
using Microsoft.AspNetCore.Mvc;
namespace CryptoAlert.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class EmailConfirmController : ControllerBase
{
///
/// Поставить флаг IsConfirmed для Email юзера
///
/// id
[HttpGet("{id}")]
public string Get(int id)
{
string res, sql;
sql = $"EmailConfirm {id}";
res = G._S(G.db_select(sql));
return res;
}
}
}
Данные приходят из хранимой процедуры EmailConfirm в виде Json строки, которую формирует sql
alter proc EmailConfirm
@user_id int
as
update Users set IsConfirmed = 1 where id = @user_id
select id, Name, Email from Users where id = @user_id
for json auto, WITHOUT_ARRAY_WRAPPER
Что удивительно, сам SQL научился упаковывать результирующий DataSet в Json строку, с помощью такой вот дописки к запросу