Я запускаю HTTP-сервер с web :: http :: experimental :: listener :: http_listener из Microsoft C++ REST SDK 1.3.1 и пытаюсь написать HTML & Javascript как клиент для взаимодействия с сервером.Добавить Access-Control-Allow-Origin на http_listener в C++ REST SDK
почти без сюрприза Я получил ... Запрос на перекрестный запрос заблокирован: политика одного и того же происхождения запрещает читать удаленный ресурс в ...... (Причина: заголовок CORS 'Access-Control-Allow-Origin' отсутствует).
Как я могу положить Access-Control-Allow-Origin: * на стороне http listener (в коде C++)?
Возможно ли это в C++ REST 1.3.1 ?? есть обходное решение кроме JSONP?
Сервер
#include <cpprest/http_listener.h>
#include <cpprest/json.h>
using namespace web;
using namespace web::http;
using namespace web::http::experimental::listener;
http_listener httpSrv;
httpSrv->support(methods::GET, handle_get);
void handle_get(http_request request)
{
const json::value response;
request.reply(status_codes::OK, response);
}
Клиент клиент с JQuery v1.12.4 (ограниченного с JQuery UI v1.12.0)
$("button").click(function() {
$.get(rest_url, function(data, status){
console.log(status);
console.log(data);
});
});
-------------- --- UPDATE -----------------------
Решение от ответа
SERVER
http_listener httpSrv;
httpSrv.support(methods::GET, handle_get);
httpSrv.support(methods::POST, handle_post);
httpSrv.support(methods::OPTIONS, handle_options);
httpSrv.open().wait();
//...........
void handle_options(http_request request)
{
http_response response(status_codes::OK);
response.headers().add(U("Allow"), U("GET, POST, OPTIONS"));
response.headers().add(U("Access-Control-Allow-Origin"), U("*"));
response.headers().add(U("Access-Control-Allow-Methods"), U("GET, POST, OPTIONS"));
response.headers().add(U("Access-Control-Allow-Headers"), U("Content-Type"));
request.reply(response);
}
void handle_get(http_request request)
{
request.reply(status_codes::OK, ...);
}
void handle_post(http_request request)
{
json::value jsonResponse;
request
.extract_json()
.then([&jsonResponse](pplx::task<json::value> task)
{
jsonResponse = process_request(task.get());
})
.wait();
http_response response(status_codes::OK);
response.headers().add(U("Access-Control-Allow-Origin"), U("*"));
response.set_body(jsonResponse);
request.reply(response);
}
КЛИЕНТ
function requestREST(request/*json*/,onSuccess/*callback with json response*/) {
$.ajax({
type: "POST",
url: "...",
data: JSON.stringify(request),
dataType: 'json',
crossDomain: true,
contentType: "application/json",
success: function (response) {
onSuccess(response);
},
timeout:3000,
statusCode: {
400: function (response) {
alert('Not working!');
},
0: function (response) {
alert('Not working!');
}
}
});
спасибо. см. UPDATE – elgcom
Я отредактировал свой ответ, чтобы добавить сведения о предполетных запросах, которые являются точкой № 2 обновления. На самом деле не получилось очко №1. – HiDeo
отлично. он работает просто отлично! – elgcom