- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用 Microsoft C++ REST SDK 1.3.1 中的 web::http::experimental::listener::http_listener 运行 HTTP 服务器,并尝试编写 HTML 和 Javascript 作为客户端与服务器交互。
毫无意外我得到了...跨源请求被阻止:同源策略不允许读取位于......的远程资源(原因:缺少 CORS header “Access-Control-Allow-Origin”)。
如何将 Access-Control-Allow-Origin:* 放在 http 监听器端(在 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 的客户端(绑定(bind)到 jQuery UI v1.12.0)
$("button").click(function () {
$.get(rest_url, function(data, status){
console.log(status);
console.log(data);
});
});
----------------更新--------------------
答案的解决方案
服务器
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!');
}
}
});
最佳答案
要在服务器端 (C++) 添加 header ,您需要修改用于发回响应的代码。
目前,您正在使用:
request.reply(status_codes::OK, response);
我们的想法是从一个空响应开始自己编写响应,添加所需的 header ,设置实际正文,然后将响应发送回客户端,而不是在一行中执行此操作。
要构造一个空响应,我们可以使用以下函数:
web::http::http_response::http_response(http::status_code code)
如 the documentation 中所述,它将构造一个具有给定状态代码的响应,没有标题也没有正文。
要访问响应的 header ,我们可以使用以下函数:
web::http::http_response::headers()
返回的对象将属于 http_headers
type其中包含 add
function :
web::http::http_headers::add(const key_type &name, const _t1 &value)
如果为 header 提供了名称和值,此函数将向响应添加 header 。
设置标题后,唯一剩下要设置的就是正文。为此,响应具有 set_body
function :
web::http::http_response::set_body(const json::value &body_data)
最后,替换您的一行代码以创建一个空响应、设置 header 和正文然后将其发回的完整代码如下所示:
http_response response(status_codes::OK);
response.headers().add(U("Access-Control-Allow-Origin"), U("*"));
response.set_body(jsonResponse);
request.reply(response);
请注意,在代码的最后部分,我使用了 U
宏来创建目标平台类型的字符串文字。您可以在 C++ Rest SDK FAQ 中找到有关此 U
宏的更多信息.
关于使用 OPTION
HTTP 动词的预检请求,这些在这种情况下是预期的。默认情况下,C++ REST SDK 包含这些请求的默认实现。可以在 the source code 中检查默认实现:
void details::http_listener_impl::handle_options(http_request message)
{
http_response response(status_codes::OK);
response.headers().add(U("Allow"), get_supported_methods());
message.reply(response);
}
它基本上返回一个 200
状态代码并添加您的服务器可以处理的支持方法列表。
如果您想覆盖默认实现,例如添加一些预检请求使用的特定 header ,如 Access-Control-Allow-Methods
或 Access-Control-Allow-Headers
,您将需要添加一个特定的处理程序,就像您为 GET
和 POST
请求所做的那样,使用:
web::http::experimental::listener::http_listener::support(const http::method &method, const std::function< void(http_request)> &handler)
不可能使用通用处理程序来处理 OPTION
请求:
web::http::experimental::listener::http_listener::support(const std::function<void(http_request)> &handler)
我们不能使用通用处理程序的原因,如果我们看一下 the source code , 是如果一个方法没有特定的处理程序并且正在使用 OPTION
HTTP 动词(或 TRACE),则将调用 C++ REST SDK 实现的默认处理程序:
// Specific method handler takes priority over general.
const method &mtd = msg.method();
if(m_supported_methods.count(mtd))
{
m_supported_methods[mtd](msg);
}
else if(mtd == methods::OPTIONS)
{
handle_options(msg);
}
关于javascript - 在 C++ REST SDK 的 http_listener 上添加 Access-Control-Allow-Origin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38898776/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!