gpt4 book ai didi

c++ - 使用Electron但不使用CEF来将API与非HTTP方案一起使用

转载 作者:行者123 更新时间:2023-12-03 12:43:21 24 4
gpt4 key购买 nike

我正在用HTML5前端和C++后端编写应用程序。我想使用自定义方案(“klaes://”)在前端和后端之间进行通信。我已经尝试过将ElectronJS与navtive c++-addons结合使用来解决这些要求,可以很好地满足的要求。

现在,我正在尝试使用Chromium嵌入式框架(CEF)解决相同的要求。一切正常,除了我无法在自定义方案上使用Fetch-API。

在Electron中,我做了以下操作:

注册自定义方案

protocol.registerSchemesAsPrivileged ([{
scheme: "klaes",
privileges: {
supportFetchAPI: true,
"corsEnabled": true
}
}])

处理请求:
protocol.registerBufferProtocol ("klaes", (request, callback) => {
// ...
}

这里一切都很好。

在CEF中,我尝试了以下操作:

注册自定义方案:
class ClientSchemeHandler : public CefResourceHandler { 

// handle request
bool ProcessRequest(CefRefPtr<CefRequest> request,
CefRefPtr<CefCallback> callback) OVERRIDE {
// ...
}

// add CORS header
void GetResponseHeaders(CefRefPtr<CefResponse> response,
int64& response_length,
CefString& redirectUrl) OVERRIDE {
// ...
response->GetHeaderMap(hdrMap);
hdrMap.insert(std::make_pair ("Access-Control-Allow-Origin", "*"));
response->SetHeaderMap(hdrMap);
// ...
}

};

class ClientSchemeHandlerFactory : public CefSchemeHandlerFactory {
// ...
};


在我的应用程序中,我做到了:
void SimpleApp::OnContextInitialized() {

// ...

CefRegisterSchemeHandlerFactory("klaes", "openmodule", new ClientSchemeHandlerFactory ());


// ...

// Browsersettings
CefBrowserSettings browser_settings;
browser_settings.web_security = STATE_DISABLED;


}

设置fetch_enabled-给定方案的标志
void SimpleApp::OnRegisterCustomSchemes(CefRawPtr<CefSchemeRegistrar> registrar) {
registrar->AddCustomScheme("klaes", CEF_SCHEME_OPTION_FETCH_ENABLED);
}

没有fetch-API的请求(如img,脚本,href等)可以正常工作。
当我尝试获取请求时,出现以下前端错误: Fetch API cannot load klaes://openmodule/5. URL scheme must be "http" or "https" for CORS request.", source: klaes://openmodule/www/build/p-elph9ath.entry.js (1)
取消注释 "corsEnabled": trueregisterSchemesAsPrivileged选项时,我在ElectronJS中收到相同的错误

我是否有任何错误,还是使用CEF根本不可能,但是使用Electron可能吗?

顺便说一句,我使用了 2019年7月25日-CEF 75.1.8 + g84fed5d + chromium-75.0.3770.100/Chromium 75.0.3770.100 Windows的构建。

最佳答案

以下代码可以解决您的问题:

void SimpleApp::OnRegisterCustomSchemes(CefRawPtr<CefSchemeRegistrar> registrar) {
registrar->AddCustomScheme("klaes", CEF_SCHEME_OPTION_FETCH_ENABLED|CEF_SCHEME_OPTION_CORS_ENABLED);
}

您也可以使用 enum cef_scheme_options_t here中可用的选项进行播放

关于c++ - 使用Electron但不使用CEF来将API与非HTTP方案一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com