WebCore内核本身并不实现http协议,它通过调用不同平台的http库,比如Qt的QnetWorkRequest,gtk的soup,或者curl等,来实现http协议的功能。这里将以curl为例,来理解webcore中的请求信息维护。
http协议的细节,如果希望深入了解的话,可以参考rfc2616,rfc2617。简单介绍下它的原理,http协议遵循的是一个请求à响应的机制。也就是说,一个url,对应一个请求à响应链。而在网页中,任何资源对应的都是一个url。如果客户端想从服务器端申请一个资源,需要发起一个请求,http的请求格式是纯文本格式,如下是一个简单的例子:
Get /index.html HTTP/1.1
Accept: text/html,*/*
User-Agent:mozilla/4.0
Host:www.csdn.net
Referer:www.hao123.com
Connection:Keep-Alive
以上是获取http://www.csdn.net/index.html的请求。Accept,User-Agent,Host,Referer,Connection都是请求头部的字段。
Csdn在收到这样一个请求以后,如果它的服务器上确实存在test.png这个资源,则返回http响应如下
HTTP/1.1 200 OK
Content-Length: 862
Date: Tue, 12 Oct 2010 06:21:46 GMT
Content-Type: text/html
ETag: "b59305a7-35e-484b91e27e9ec"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>csdn.net,中国领先的it技术社区</title>
</head>
<body>
…………………………….
</body>
</html>
这样,一个http请求就完成了,流程非常简单明了,所以在互联网上使用特别广泛。由于只是一个简单的请求à响应机制,所以http是没有状态这一个说法的(这同大部分协议基于状态机的机制是不同的),当然,为了在某些情况下,维护一个状态,http加入了cookie的管理机制,利用cookie来实现了一些状态的管理。另外,为了节约网络流量,提高性能,http协议中定义了cache的机制。
http的协议细节实现并不需要WebCore来关注,WebCore要关注的是,如何设置请求的相关头部信息,如何获取服务器返回回来的响应体部数据。
WebKit中同http打交道的类主要是ResourceRequest,ResourceResonse,ResourceHandle*,ResourceHandleManager等,这里先介绍同请求信息维护相关的ResourceRequest.
ResourceRequest类的作用比较好理解,基本上就是维护http请求相关的信息(app或者内核都有可能设置这些信息),然后当WebCore发起http请求的时候,可以获取这些信息,调用curl的接口设置对应的http请求字段。在这些信息中,最常用到的是url。
ResourceRequest类继承于ResourceRequestBase类,绝大部分功能在ResourceRequestBase类中实现。
一)ResourceRequest构造:构造一个ResourceRequest对象只需要url参数就够了,这是比较简单的一个类,没有维护其它类的对象或者句柄。
ResourceRequest(const String& url);
ResourceRequest(const KURL& url);
二)ResourceRequest对象的创建与维护
1.当用户输入网址,开始一个网页的请求的时候,会调用QwebFrame::load函数,在该函数中,会构造出ResourceRequest对象,并将这个对象作为一个参数,调用FrameLoader类的load函数,DocumentLoader类中会维护这个ResourceRequest,在调用MainResourceLoader的load接口的时候,也会把ResourceRequest对象传递过去,在MainResourceLoader中维护相应的信息。当MainResourceLoader类loadNow接口的时候,又会在创建的ResourceHandle的内部数据结构成员(ResourceHandleInternal)d中维护ResourceRequest对象。
2.
点击一个链接的时候,也会通过FrameLoader类的urlSelected发出一个新的请求,在发起请求的时候构造出ResourceRequest对象。同样也会在DocumentLoader、MainResourceLoader和ResourceHandle类中都维护ResourceRequest对象。
3.
根据资源的种类,除了1和2,请求还可以分为子桢请求(如iframe标签),Css请求,Script请求,Image请求,Object请求,Media请求,Worker请求(HTML5),Prefetch请求等,参考ResourceRequestBase类中的TargetType枚举。
4.
ResourceHandleManager(/curl)类的initializeHandle函数中,会通过ResourceHandle类来访问ResourceRequest对象,获取之前设置过的ResourceRequest的信息(比如url,method,user-agent,referer等),调用curl_easy_setopt接口,设置到curl里面。
5.FrameLoader
类的addExtraFieldsToRequest接口会设置一些请求头的信息。
6.DocumentLoader
对应的请求是不停地在变化的(比如发生重定向),所以结构中维护了多个ResourceRequest对象,这些对象可能不一样
三)其它
在这个类中,还可以通过cachePolicy,setCachePolicy,allowCookies,setAllowCookies在WebKit和http之间建立起控制的通道
- 大小: 16.6 KB
分享到:
相关推荐
在“Laravel 开发-webcore”这个主题中,我们将深入探讨如何使用 Laravel 构建一个名为 WebCore 的单平台站点,以及如何根据特定需求定制化这个平台。 1. **Laravel 框架基础** - **安装与设置**:首先,你需要...
在现代Web服务交互中,REST(Representational State Transfer)架构风格已经成为主流,它基于HTTP协议进行数据交换。为了简化C#应用与RESTful API的交互,开发者通常会使用特定的类库。在这个场景下,“c# rest ...
在IT行业中,网络通信是应用程序之间交互...这些技术在现代Web应用开发中扮演着至关重要的角色,帮助开发者构建安全、高效的应用。在实际项目中,使用类似"PostGetHttp"的工具类可以极大地提升开发效率并降低出错风险。
FiddlerCore提供了丰富的API供开发者使用,如`oSession.oRequest.headers`、`oSession.oResponse.headers`以及`oSession.utilDecodeResponse()`等,可以获取请求和响应的详细信息。 总之,通过C#调用FiddlerCore,...
1. **Web客户端开发**:构建自己的HTTP客户端库,实现更精细的控制和更高的性能。 2. **服务器端编程**:在服务器端实现HTTP服务,处理来自客户端的请求。 3. **爬虫和数据抓取**:高效地抓取网页数据,处理大量HTTP...
为了保持代码的可维护性和可测试性,推荐在服务层处理HTTP请求,而不是在组件中直接进行。同时,考虑使用`async/await`语法来使异步代码更易于理解。 总结,AngularJS 2的HTTP服务提供了一种方便的方式来与后端...
- **不是Servlet容器或Servlet API的竞争对手**:对于需要处理HTTP请求的Web应用来说,HttpCore可能不足以满足需求。通常情况下,开发者会选择使用成熟的Servlet容器(如Tomcat、Jetty等)。 #### HTTP报文结构 ...
在IT行业中,Web服务器是构建互联网应用的基础,它们负责接收HTTP(超文本传输协议)请求并返回相应的HTTP响应。本文将深入探讨不同Web服务器如何通过HTTP进行通信,并处理返回的数据。我们将结合源码分析和工具使用...
HTTPCore是Apache基金会开发的一个核心库,主要负责处理HTTP协议的底层实现。在版本4.4.1中,它提供了高效的网络通信能力和灵活的HTTP协议处理机制,是许多Java Web应用和服务器的基础组件。本文将深入探讨HTTPCore ...
在这个场景中,我们关注的是使用 C#.NET Core 2.1 开发的 Web API,这是一种用于构建 RESTful 服务的技术,广泛应用于前后端分离的应用架构中。 Web API 是 ASP.NET 的一部分,允许开发者创建 HTTP 服务,可以被...
HttpCore 4.4.5是HttpClient 4.5依赖的核心库,提供了HTTP协议的基本实现,如连接管理、请求和响应的编码与解码,以及流处理等。这个版本的HttpCore修复了一些已知的bug,提升了稳定性,并且优化了网络I/O性能,使得...
ASP.NET Core是一个开源的、高性能的Web应用框架,由微软公司和.NET基金会共同维护。在ASP.NET Core中,我们可以自定义认证机制以满足特定的安全需求。这篇文档将介绍如何在ASP.NET Core中添加一个基于请求头的...
在ASP.NET Core 3.1中,WebAPI提供了强大的功能来处理文件上传,这使得开发者能够构建健壮的、高效的文件上传系统。本教程将深入探讨如何在WebAPI中实现文件上传,并通过实际案例帮助你理解和应用这些知识。 一、...
在Java开发中,HTTP通信是不可或缺的一部分,特别是在Web应用和服务之间进行数据交互时。Apache HttpClient和Httpcore是两个非常重要的库,它们为Java开发者提供了强大的HTTP客户端功能。本篇文章将详细介绍这两个...
在C#中,我们可以使用ASP.NET Core Identity或JWT(JSON Web Tokens)来创建和验证这些令牌。 1. **C#中的Token验证**: - ASP.NET Core Identity:这是.NET框架提供的一个身份管理库,支持用户注册、登录、密码...
在Java编程中,Apache HttpClient库是一个非常重要的工具,它提供了丰富的功能来执行HTTP请求,包括GET、POST等方法。这个库使得开发者能够方便地与Web服务器进行交互,处理各种HTTP协议相关的任务。在标题和描述中...
Vue.js是一个流行的JavaScript框架,用于构建用户界面,而axios是Vue.js中常用的库,用于处理HTTP请求,包括POST请求。另一方面,C# .NET是一种强大的后端开发平台,它可以处理来自前端的HTTP请求并返回响应。本篇将...
【标题】"Core5 WebApi JWT验证登录+注入依赖Demo" 涉及到的关键技术主要集中在.NET Core 5框架下的WebAPI开发、JSON Web Token(JWT)验证以及依赖注入。这里将详细介绍这些核心概念。 1. **WebAPI**: WebAPI是...
### ASP.NET Core:云就绪、企业级Web应用开发 #### 概述 ASP.NET Core是一种现代化、跨平台且开源的框架,专为构建高性能、云就绪的企业级Web应用程序而设计。它提供了丰富的功能集,包括灵活的依赖注入、模块化...
根据提供的文件信息,本书《利用 .NET Core 构建 RESTful Web 服务》是一本全面介绍如何使用 .NET Core 平台开发 RESTful Web 服务的技术书籍。下面将基于本书的目录来概述每一章节的关键知识点。 ### 第一章:入门...