admin 发表于 2024-11-29 14:58:56

FBrowserCEF3Lib开发手册之创建URL请求的方法以及注意事项

一、易全局创建
       全局创建可以不创建浏览器,如果要采用独立的环境就和创建动态浏览器方式一样创建一个请求环境参数即可,可参考动态浏览器创建的例子;
注意:
1.创建请求必须在初始化完成后,也就是执行框架初始化并回调初始化完成事件后才可创建URL请求,否则可能会失效甚至崩溃;
2.获取数据同样采用的是异步操作,在“URL请求_获取到数据”事件中,这里如果你请求的数据过大或包含多个会反复多次调用该事件方法,可以用同步类来辅助获取拼接数据,然后在“URL请求_即将完成”事件中使用拼接的最终数据,使用方法搜索论坛莫生的参考URL创建代码

[*]请求示例代码如下:
.版本 2

.子程序 _全局创建_被选择
.局部变量 请求, 类_FBrowser_请求
.局部变量 头数据, FBrowser_双文本, , "1"

请求.创建 ()
请求.置地址 (“https://api.fbrowser.site:8443/”)
请求.置类型 (“GET”)

头数据 .name = “User-Agent”
头数据 .value = “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.438.400 QQBrowser/13.0.6071.400”
请求.置协议头数据_数组 (头数据)
FBrowser_创建URL请求 (请求, , 66666)


二、易带框架创建
    带框架创建基本和全局创建一样,因为框架已经带有环境,所以不需要在创建环境,如要创建环境,就必须在浏览器创建的时候设置;

.版本 2

.子程序 _框架创建_被选择
.局部变量 请求, 类_FBrowser_请求

请求.创建 ()
请求.置地址 (“https://api.fbrowser.site:8443/”)
请求.置类型 (“GET”)

头数据 .name = “User-Agent”
头数据 .value = “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.438.400 QQBrowser/13.0.6071.400”
请求.置协议头数据_数组 (头数据)

全_浏览器 .取主框架 ().创建URL请求 (请求, 77777)


三、火山全局和带框架创建
       其实明白的原理,火山版和易版本基本都是一样的,不一样的是火山版可以采用动态事件,不用像易只能一个全局事件,如下图代码中所采用的智能指针创建的方法;
创建参考代码:


事件参考代码:



四、C#全局和带框架创建
       C#版原理也是如此都一样,如果你跳过了前面的内容不明白原理,建议先看看前面易和火山对原理的描述

全局创建(这里就直接采用的在初始化完毕事件中创建):
//初始化完毕
public override void OnContextInitialized()
{
    Console.WriteLine(MethodBase.GetCurrentMethod().Name);


    FBroSharpRequest sharp_request = new FBroSharpRequest();
    sharp_request.SetURL("https://api.fbrowser.site:8443/");
    sharp_request.SetMethod("GET");

    //添加协议头,这里用list添加,只添加了一个UA
    List<FBroSharpStringMap> heard_list = new List<FBroSharpStringMap>();

    heard_list.Add(new FBroSharpStringMap
    {
      key = "User-Agent",
      value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.438.400 QQBrowser/13.0.6071.400"
    });
    sharp_request.SetHeaderMap_Array(heard_list);

    // FBroSharpRequestContext sharp_request_context;
    URLEvent sharp_event = new URLEvent();
    FBroSharpURLRequest.Create(sharp_request, default, sharp_event, 123456);

}

利用按钮创建:
private void 创建URL请求ToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (BrowserEvent.mainbrowser_.IsValid)
    {
      FBroSharpRequest sharp_request = new FBroSharpRequest();
      sharp_request.SetURL("https://api.fbrowser.site:8443/");
      sharp_request.SetMethod("GET");

      //添加协议头,这里用list添加,只添加了一个UA
      List<FBroSharpStringMap> heard_list = new List<FBroSharpStringMap>();

      heard_list.Add(new FBroSharpStringMap
      {
            key = "User-Agent",
            value = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.97 Safari/537.36 Core/1.116.438.400 QQBrowser/13.0.6071.400"
      });
      sharp_request.SetHeaderMap_Array(heard_list);

      // FBroSharpRequestContext sharp_request_context;
      URLEvent sharp_event = new URLEvent();
      BrowserEvent.mainbrowser_.GetMainFrame().CreateURLRequest(sharp_request, sharp_event, 123456);
    }
}
事件参考代码:
public class URLEvent : FBroSharpURLEvent
{
    //用于存放全部数据
    private MemoryStream responseStream_;

    private BinaryWriter writer_;

    public override void Start(long flag, IFBroSharpURLRequest request)
    {
      responseStream_ = new MemoryStream();
      writer_ = new BinaryWriter(responseStream_);

      Console.WriteLine("Name:{0} Flag:{1} Request url:{2} Referrer url:{3}", MethodBase.GetCurrentMethod().Name, flag, request.GetRequestStatus(), request.GetRequest().GetURL(), request.GetRequest().GetReferrerURL());
    }

    public override void End(long flag)
    {
      Console.WriteLine("Name:{0} Flag:{1}", MethodBase.GetCurrentMethod().Name, flag);
         
      writer_ = null;
      responseStream_ = null;
         

      Program.is_close_ = true;
    }

    public override bool GetAuthCredentials(long flag, bool isProxy, string host, int port, string realm, string scheme, IFBroSharpAuthCallback callback)
    {
      Console.WriteLine("Name:{0} Flag:{1}", MethodBase.GetCurrentMethod().Name, flag);
      return false;
    }

    public override void OnDownloadData(long flag, IFBroSharpURLRequest request, Stream data)
    {
      Console.WriteLine("Name:{0} Flag:{1} RequestStatus:{2}", MethodBase.GetCurrentMethod().Name, flag, request.GetRequestStatus());

      //如果存在多数据这个会多次调用本事件,因此数据先进行暂存到writer_中
      var readBytes = new byte;
      data.Read(readBytes, 0, readBytes.Length);
      writer_.Write(readBytes);
    }

    public override void OnDownloadProgress(long flag, IFBroSharpURLRequest request, long current, long total)
    {
      Console.WriteLine("Name:{0} Flag:{1} RequestStatus:{2}", MethodBase.GetCurrentMethod().Name, flag, request.GetRequestStatus());
    }

    public override void OnRequestComplete(long flag, IFBroSharpURLRequest request)
    {
      Console.WriteLine("Name:{0} Flag:{1} RequestStatus:{2}", MethodBase.GetCurrentMethod().Name, flag, request.GetRequestStatus());

      //执行完毕再显示数据
      Console.WriteLine(Encoding.UTF8.GetString(responseStream_.ToArray()));

    }

    public override void OnUploadProgress(long flag, IFBroSharpURLRequest request, long current, long total)
    {
      Console.WriteLine("Name:{0} Flag:{1} RequestStatus:{2}", MethodBase.GetCurrentMethod().Name, flag, request.GetRequestStatus());
    }


}

五、重点注意事项
1.如果创建URL请求已经被缓存或者缓存还未失效,则再次获取是在缓存中获取,因此如果要每次都不从缓存获取则获取之前先清理一次缓存,但不建议;
2.全局代理,如果已经在全局环境中及浏览器事件中调用了“获得需授权证书(GetAuthCredentials)”并设置了账号密码,再创建全局请求的时候不会再调用“获得需授权证书”事件设置账号密码,因为账号密码已经在全局环境中生效;
3.无论是全局创建还是带框架创建都不会触发开发者工具在工具里进行显示,这里可以使用第三方工具进行测试;


六、补充说明
1.易和火山上文所描述的代码都在最新打包文件中;
2.C#最新实例在gitee开源库中https://gitee.com/FloatToPoint/fbro-sharp-test.git




A丶 发表于 2025-2-7 13:07:24

谢谢大佬分享,学到了很多
页: [1]
查看完整版本: FBrowserCEF3Lib开发手册之创建URL请求的方法以及注意事项