- 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/
我正在细读 http://www.khronos.org/网站,只找到了 OpenCL 的头文件(不是我不关心的 OpenGL)。如何获取 OpenCL SDK? 最佳答案 AMD 的 ATI Str
Android 项目中最低(最低 sdk)和最高(目标 sdk)级别是否有任何影响。这些东西是否会影响项目的可靠性和效率。 最佳答案 没有影响,如果您以 SDK 级别 8 为目标,那么您的应用将以 9
“min sdk version/target sdk version”和“compile sdk version”有什么区别?我知道 min 和 target sdk 是什么意思,但是 compil
我正在尝试运行 Dji Mobile-Sdk-Android:https://github.com/dji-sdk/Mobile-SDK-Android使用 dji 网站上的说明:https://de
我目前正在向我的 iPhone 应用程序添加新的 Facebook iOS sdk 3.1.1。我看到 sdk 有重大变化。例如。我的旧 sdk 创建一个 Facebook 对象并从 FBReques
我最近刚刚下载了 Xcode 4.6 with mac 10.8.4 with iOS 6.0 SDK package,我立即注意到我无法使用我的 iPhone 3Gs with iOS 4.6 进行
我尝试下载 OpenCL SDK。但是没办法。我有一个 AMD GPU,所以我在谷歌上搜索了 AMD SDK,但是来自谷歌的所有链接和一些教程都被破坏了,不可能通过 AMD 开发者网站找到 sdk。
安装 Google Cloud SDK 后,当我运行时 gcloud 授权登录 我收到一条错误消息: Your browser has been opened to visit: https://a
我一直在 nvidia 网站上搜索 GPU 计算 SDK,因为我正在尝试构建具有 cuda 支持的点云库 (PCL)。但是,在 nvidia 网站上,我只能找到工具包的链接,而不是 SDK 的单个下载
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。 2
当我打开 Android SDK 管理器时,会出现一个屏幕“选择要安装的包”。它列出了一堆带有绿色复选标记(已经安装)的软件包,还有一些带有 x's 的软件包,它们没有安装。如果我选择“全部接受”,它
在开发过程中,我发布了 SDK 21 Lollipop,但我无法在我的 KitKat 设备上使用它。应用程序非常简单,我只将 SDK 用于动画和 Material 设计,但是当我尝试对 Play 商店
enter image description here friend 们好 在使用 Linux、jenkins 和 docker 探索 dotnet 核心时,我遇到了构建问题,该问题在标题“/usr
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我创建了一个flutter项目,运行flutter packages get,输出如下:【二】flutter包搞定等待另一个 flutter 命令释放启动锁...第二次运行“flutter packa
这个问题在这里已经有了答案: What are the Android SDK build-tools, platform-tools and tools? And which version sh
我使用 Corona SDK 已经快一年了,并且开发了几个简单的游戏。我现在正在寻找的是在 Corona SDK 中创建 3D 幻觉的某种方法。如果有人有 Corona 3D 方面的经验,我将不胜感激
我有一个CLDC 1.1 / MIDP 2.0项目,可以使用Java ME SDK 3.2很好地进行编译。 最近,我已将Java SE升级到8,结果Java ME SDK开始在Windows启动时显示
有没有办法以编程方式控制连接到华擎主板的 RGB 照明?我知道华硕有一个 Aura SDK,但华擎是否也有一个用于他们的硬件? 如果是,我在哪里可以找到它? 最佳答案 没有用于华擎多彩的 sdk。但是
如何使用 crm 2011 sdk 和 XrmServiceContext 创建事务? 在下一个示例中,'new_brand' 是一些自定义实体。我想创建三个品牌。第三个拥有错误的 OwnerID g
我是一名优秀的程序员,十分优秀!