Appearance
网络操作相关
拦截所有请求
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
cpp
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
// do something
return false;
}
mbOnLoadUrlBegin
在任何网络请求发起前会触发该函数传入的回调,最后一个参数是传给回调的 param。
job 为网络任务 id,只在当次网络任务中有效,后面出现的都是一样的。
TIP
此接口是在 blink 线程执行
拦截所有响应
cpp
mbNetOnResponse(mbView, onResponse, nullptr);
cpp
static BOOL MB_CALL_TYPE onResponse(mbWebView webView, void* param, const utf8* url, mbNetJob job)
{
// do something
return false;
}
mbNetOnResponse
在收到服务器响应时触发传入回调,最后一个参数是传给回调的 param。
想要获得响应的数据,请参考设置一个请求在响应之后被拦截。
TIP
此接口是在 blink 线程执行
拦截所有失败请求
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
mbOnLoadUrlFail(mbView, onLoadUrlFail, nullptr);
cpp
void MB_CALL_TYPE onLoadUrlFail(mbWebView webView, void* param, const char* url, void* job)
{
// do something
}
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "https://miniblink.net/mb/wp-includes/css/dist/block-library/style.min.css?ver=6.1")) {
mbNetCancelRequest(job);
return true;
}
return false;
}
这里我们用 mbNetCancelRequest
取消了一个请求,然后 onLoadUrlFail
就会被触发。
TIP
此接口是在 blink 线程执行,后面也有不少接口在 blink 线程执行,不再一一指明。
在网络访问前设置返回数据
场景:在网络请求尚未发送前,就设置网络请求返回的数据,不发送真正的请求。
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
cpp
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "https://miniblink.net/mb/wp-includes/css/dist/block-library/style.min.css?ver=6.1")) {
char arr[] = "h2 {color: red}";
std::vector<char> buffer(std::strlen(arr) + 1);
std::memcpy(buffer.data(), arr, buffer.size());
// ...
mbNetSetData(job, &buffer[0], buffer.size());
return true;
}
return false;
}
mbNetSetData
在网络访问执行前,设置指定的数据到网络层,数据内容可以为js代码,图片,字符串,数据块等任意类型,其实是设置缓存,详情查看 mbNetSetData 文档。
TIP
已知问题:假如设置的 URL 没有后缀可能导致显示异常,如对 HTML URL "https://miniblink.net/mb/" 的内容设置 mbNetSetData
,页面将无法显示,解决办法是使用 mbNetSetMIMEType
重新设置 MIME
类型。 问题 issue
设置一个请求在响应之后被拦截并获取数据
场景:在发送请求之前,设置一个请求在响应之后拦截,等接收到真正的网络数据后进行处理。
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
mbOnLoadUrlEnd(mbView, onLoadUrlEnd, nullptr);
cpp
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "https://miniblink.net/mb/wp-includes/css/dist/block-library/style.min.css?ver=6.1")) {
// dosomething
mbNetHookRequest(job);
}
return false;
}
static void MB_CALL_TYPE onLoadUrlEnd(mbWebView webView, void* param, const char* url, void* job, void* buf, int len)
{
// buf 是网络请求的响应数据, 可以做一些操作
}
mbNetHookRequest
拦截某次网络请求,此接口会在接受到真正网络数据后触发 OnLoadUrlEnd
事件。
mbOnLoadUrlEnd
注册 OnLoadUrlEnd
的事件,这个事件设置了 mbNetHookRequest
才会触发。如果 mbNetHookRequest
了多个请求,里面需要自行判断。
案例中的 onLoadUrlEnd
的参数 buf 是真正的网络请求响应数据,如果需要处理数据并返回,可以处理之后使用 mbNetSetData
设置数据。
修改某次网络请求的 URL
场景:在网络请求尚未发送前,修改某次网络请求的 URL。
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
cpp
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "https://miniblink.net/mb/wp-includes/css/dist/block-library/style.min.css?ver=6.1")) {
mbNetChangeRequestUrl(job, "file:///C:/xx_dir/test.css");
}
return false;
}
暂停请求,继续请求
场景:拦截到一个请求后需要进行一些耗时操作,再让请求继续。
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
cpp
void MB_CALL_TYPE onRunJsCallback(mbWebView webView, void* job, mbJsExecState es, mbJsValue v)
{
double value = mbJsToDouble(es, v);
// do something
mbNetContinueJob(job);
}
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "https://miniblink.net/mb/wp-includes/css/dist/block-library/style.min.css?ver=6.1")) {
mbNetHoldJobToAsynCommit(job);
mbRunJs(webView, mbWebFrameGetMainFrame(webView), "return 999 + 1;", true, onRunJsCallback, job, nullptr);
}
return false;
}
mbNetHoldJobToAsynCommit
:当在 mbOnLoadUrlBegin
中里拦截到一个请求后需要进行一些耗时操作时,可以调用本接口,耗时操作完成后需要调用 mbNetContinueJob
接口以通知 MB 让此次请求继续进行。
案例中,执行了一段 JS,并在 JS 返回结果后继续请求。
取消某次网络请求
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
cpp
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "https://miniblink.net/mb/wp-includes/css/dist/block-library/style.min.css?ver=6.1")) {
mbNetCancelRequest(job);
return true;
}
return false;
}
获取请求方法/请求头/MIME/响应头,设置请求头/MIME
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
mbNetOnResponse(mbView, onResponse, nullptr);
cpp
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "http://127.0.0.1:7001/api/v2/topics")) {
mbNetHookRequest(job);
// 获取此请求中的 post 数据
mbPostBodyElements* postBodyElements = mbNetGetPostBody(job);
// 获取此请求的 method
mbRequestType methodType = mbNetGetRequestMethod(job);
// 获取某一个请求头内容
std::string contentTypeStr = mbNetGetHTTPHeaderField(job, "content-type", 1);
// 设置一个请求头内容
mbNetSetHTTPHeaderField(job, L"x-my-header", L"my-value", 0);
// 获取 blink 线程中 curl 原始请求数据头
const mbSlist* curlHeaders = mbNetGetRawHttpHeadInBlinkThread(job);
}
return false;
}
static void MB_CALL_TYPE onLoadUrlEnd(mbWebView webView, void* param, const char* url, void* job, void* buf, int len)
{
// buf 是网络请求的响应数据
if (0 == strcmp(url, "http://127.0.0.1:7001/api/v2/topics")) {
// 获取响应中的 MIME 数据
std::string mimeType = mbNetGetMIMEType(job);
// 获取某一个响应头内容
std::string contentTypeStr = mbNetGetHTTPHeaderField(job, "content-type", 0);
// 获取渲染线程中的原始响应数据头
const mbSlist* curlHeaders = mbNetGetRawResponseHeadInBlinkThread(job);
}
}
设置数据使用 mbNetSetHTTPHeaderField,mbNetSetMIMEType。
mbNetGetRawHttpHeadInBlinkThread
和 mbNetGetRawResponseHeadInBlinkThread
必须在 blink 线程才能调用,否则会返回 nullptr
,onLoadUrlBegin
和 onLoadUrlEnd
是 blink 线程触发的。另外返回的结果有可能已经被 free,需要注意。
获取 post/put 请求体
cpp
mbOnLoadUrlBegin(mbView, onLoadUrlBegin, nullptr);
cpp
static BOOL MB_CALL_TYPE onLoadUrlBegin(mbWebView webView, void* param, const char* url, void* job)
{
if (0 == strcmp(url, "https://xx/api/xx")) {
// 获取此请求中的 post 数据
const mbPostBodyElements* postBodyElements = mbNetGetPostBody(job);
}
return false;
}
注意,mbNetGetPostBody
只有当请求类型是 post 或 put 时才有效果,类型详情见 mbNetGetPostBody 文档。
发起一个新请求
cpp
// 创建一个新请求
mbWebUrlRequestPtr request = mbNetCreateWebUrlRequest("https://xx/style.min.css", "GET", "text/css");
// 设置请求头
mbNetAddHTTPHeaderFieldToUrlRequest(request, "x-my-header-name", "my-header-value");
// 分别处理不同情况的回调
mbUrlRequestCallbacks cbs = {
onUrlRequestWillRedirectCallback,
onUrlRequestDidReceiveResponseCallback,
onUrlRequestDidReceiveDataCallback,
onUrlRequestDidFailCallback,
onUrlRequestDidFinishLoadingCallback
};
// 发送请求,netRequestId 可以传入 mbNetCancelWebUrlRequest 取消请求
int netRequestId = mbNetStartUrlRequest(webView, request, nullptr, &cbs);
cpp
static void MB_CALL_TYPE onUrlRequestWillRedirectCallback(mbWebView webView, void* param, mbWebUrlRequestPtr oldRequest, mbWebUrlRequestPtr request, mbWebUrlResponsePtr redirectResponse)
{
}
static void MB_CALL_TYPE onUrlRequestDidReceiveResponseCallback(mbWebView webView, void* param, mbWebUrlRequestPtr request, mbWebUrlResponsePtr response)
{
// 获取响应状态码
int statusCode = mbNetGetHttpStatusCode(response);
// 获取响应内容长度
_int64 len = mbNetGetExpectedContentLength(response);
// // 获取响应 URL
std::string urlStr = mbNetGetResponseUrl(response);
}
static void MB_CALL_TYPE onUrlRequestDidReceiveDataCallback(mbWebView webView, void* param, mbWebUrlRequestPtr request, const char* data, int dataLength)
{
}
static void MB_CALL_TYPE onUrlRequestDidFailCallback(mbWebView webView, void* param, mbWebUrlRequestPtr request, const utf8* error)
{
}
static void MB_CALL_TYPE onUrlRequestDidFinishLoadingCallback(mbWebView webView, void* param, mbWebUrlRequestPtr request, double finishTime)
{
}
如果想取消请求,可以使用 mbNetCancelWebUrlRequest,需要的 ID 是 mbNetStartUrlRequest
返回的。
TIP
已知问题:mbNetStartUrlRequest
必须在 blink 线程调用,如 mbNetOnResponse
的回调中,否则会崩溃。 问题 issue
cookie 相关
获取,清除 cookie
cpp
mbOnDocumentReady(mbView, onDocumentReady, nullptr);
cpp
void MB_CALL_TYPE onGetCookie(mbWebView webView, void* param, MbAsynRequestState state, const utf8* cookie)
{
std::string cookieStr = cookie;
}
void MB_CALL_TYPE onGetCookieAfter(mbWebView webView, void* param, MbAsynRequestState state, const utf8* cookie)
{
std::string cookieStr = cookie;
}
void MB_CALL_TYPE onDocumentReady(mbWebView webView, void* param, mbWebFrameHandle frameId)
{
if (mbIsMainFrame(webView, frameId)) {
// 获取 Cookie
mbGetCookie(webView, onGetCookie, nullptr);
// 清除 Cookie
mbClearCookie(webView);
mbGetCookie(webView, onGetCookieAfter, nullptr);
}
}
获取 cookie 使用 mbGetCookie
,在回调中获取。
清除 cookie 使用 mbClearCookie
。
如果在 blink 线程中,可以直接使用 mbGetCookieOnBlinkThread 获取。
设置 cookie
cpp
mbOnNavigation(mbView, onNavigation, nullptr);
cpp
BOOL MB_CALL_TYPE onNavigation(mbWebView webView, void* param, mbNavigationType navigationType, const utf8* url)
{
mbSetCookie(webView, "http://127.0.0.1:7001", "mbcookie=value1234;");
return true;
}
cookie 必须符合 curl 的标准写法,如 PERSONALIZE=123;expires=Monday 13-Jun-2022 03:04:55 GMT; domain=.xx.com; path=/; secure
。
如果不想修改页面,也可使用 mbPerformCookieCommand 调用 curl 修改 cookie。
下载相关
见下载