HTTP 和高级编程

目录

一.HTTP 简介

HTTP 工作原理

HTTP 请求

HTTP 响应

HTTP 的常见应用

HTTP 的优点

HTTP 的缺点

二.使用 CHtmlView 类创建 Web 视图

创建 CHtmlView 控件

CHtmlView 类成员函数

CHtmlView 类事件

使用 CHtmlView 类创建 Web 浏览器

三.Web 浏览器应用程序示例


一.HTTP 简介

        超文本传输协议(HTTP - Hypertext Transfer Protocol)是用于在万维网(WWW - World Wide Web)上传输信息的应用层协议。它定义了客户端(通常是 Web 浏览器)和服务器之间交换数据的格式和规则。HTTP 是互联网上使用最广泛的协议之一,是万维网的基础。

HTTP 工作原理

        HTTP 使用请求-响应模式进行通信。客户端向服务器发送请求,服务器接收请求并发送响应。请求和响应都由消息组成,消息包含用于描述请求或响应的信息的头和数据主体。

HTTP 请求

HTTP 请求包含以下信息:

  • 请求方法: 指定客户端希望对资源执行的操作,例如 GET、POST、PUT、DELETE 等。
  • URL: 指定要请求的资源的地址。
  • 请求头: 提供有关客户端和请求的其他信息,例如 User-Agent、Accept、Content-Type 等。
  • 请求主体: 可选,包含客户端要发送给服务器的数据。

HTTP 响应

HTTP 响应包含以下信息:

  • 状态码: 指示请求是否成功,例如 200 OK、404 Not Found、500 Internal Server Error 等。
  • 响应头: 提供有关服务器和响应的其他信息,例如 Content-Type、Content-Length、Date 等。
  • 响应主体: 可选,包含服务器要发送给客户端的数据。

HTTP 的常见应用

HTTP 用于各种网络应用,包括:

  • 浏览网页: 当您在 Web 浏览器中输入 URL 时,浏览器会向相应的服务器发送 HTTP 请求以获取网页。服务器会发送 HTTP 响应,其中包含网页的 HTML 代码。
  • 发送和接收文件: HTTP 可用于在客户端和服务器之间发送和接收文件。例如,当您从网站下载文件时,浏览器会向服务器发送 HTTP 请求以获取文件。服务器会发送 HTTP 响应,其中包含文件数据。
  • API 调用: 许多应用程序使用 HTTP 进行 API 调用。例如,当您使用移动应用程序时,该应用程序可能会向服务器发送 HTTP 请求以获取数据或执行操作。

HTTP 的优点

HTTP 具有以下优点:

  • 简单易用: HTTP 的协议规范相对简单易懂,易于实现和使用。
  • 通用性强: HTTP 可用于传输各种类型的资源,包括文本、图像、视频、音频等。
  • 可扩展性强: HTTP 可以通过添加新的请求方法、响应头和消息格式来扩展,以满足新的应用需求。
  • 无状态: HTTP 是一种无状态协议,这意味着每次请求之间客户端和服务器之间都不保持任何状态信息。这使得 HTTP 协议非常高效且易于扩展。

HTTP 的缺点

HTTP 也有以下缺点:

  • 不安全: HTTP 是明文协议,这意味着请求和响应中的数据没有加密,可能会被窃听或篡改。
  • 效率不高: HTTP 使用请求-响应模式,这可能会导致大量往返通信,尤其是在传输大型资源时。
  • 不支持长连接: HTTP 默认使用短连接,这意味着每次请求都需要建立新的连接,这可能会降低性能。

二.使用 CHtmlView 类创建 Web 视图

        CHtmlView 类是 MFC 框架中用于显示 HTML 内容的控件。它可以用来创建 Web 浏览器、电子邮件阅读器等应用程序。

创建 CHtmlView 控件

要创建 CHtmlView 控件,请执行以下步骤:

  1. 在对话框或其他窗口的资源编辑器中,将 CHtmlView 控件添加到对话框或窗口的布局中。
  2. 在对话框或窗口的代码中,创建 CHtmlView 控件的对象。
  3. 调用 CHtmlView 对象的 Navigate2 方法来加载 HTML 文档。

以下是一个创建 CHtmlView 控件并加载 HTML 文档的示例代码:

 

CHtmlView m_htmlView;BOOL CWnd::OnInitDialog()
{BOOL bSuccess = CWnd::OnInitDialog();if (bSuccess){// 创建 CHtmlView 控件CRect rect(10, 10, 300, 200);m_htmlView.Create(WS_VISIBLE | WS_CHILD, rect, this, IDC_HTMLVIEW);// 加载 HTML 文档m_htmlView.Navigate2(_T("https://www.example.com"));}return bSuccess;
}

CHtmlView 类成员函数

CHtmlView 类提供了许多成员函数来控制 Web 视图的行为。以下是一些常用的成员函数:

  • Navigate2: 加载 HTML 文档。
  • GoBack: 返回到上一页。
  • GoForward: 进入下一页。
  • Refresh: 刷新当前页面。
  • Stop: 停止加载当前页面。
  • GetDocument: 获取当前加载的 HTML 文档。

CHtmlView 类事件

CHtmlView 类提供了许多事件来通知应用程序有关 Web 视图的状态变化。以下是一些常用的事件:

  • OnBeforeNavigate2: 在加载新页面之前触发。
  • OnNavigate2: 在加载新页面之后触发。
  • OnTitleChange: 在页面标题更改时触发。
  • OnStatusChange: 在页面状态更改时触发。
  • OnProgressChange: 在页面加载进度更改时触发。

使用 CHtmlView 类创建 Web 浏览器

可以使用 CHtmlView 类创建简单的 Web 浏览器。以下是一个示例代码:

// MyHtmlView.h
#pragma once#include <afxhtml.h>class CMyHtmlView : public CHtmlView
{
protected: // create from serialization onlyCMyHtmlView() noexcept;DECLARE_DYNCREATE(CMyHtmlView)public:virtual ~CMyHtmlView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifpublic:virtual void OnInitialUpdate();DECLARE_MESSAGE_MAP()
};// MyHtmlView.cpp
#include "stdafx.h"
#include "MyHtmlView.h"IMPLEMENT_DYNCREATE(CMyHtmlView, CHtmlView)BEGIN_MESSAGE_MAP(CMyHtmlView, CHtmlView)
END_MESSAGE_MAP()CMyHtmlView::CMyHtmlView() noexcept
{
}CMyHtmlView::~CMyHtmlView()
{
}#ifdef _DEBUG
void CMyHtmlView::AssertValid() const
{CHtmlView::AssertValid();
}void CMyHtmlView::Dump(CDumpContext& dc) const
{CHtmlView::Dump(dc);
}
#endif //_DEBUGvoid CMyHtmlView::OnInitialUpdate()
{CHtmlView::OnInitialUpdate();Navigate2(_T("https://www.example.com")); // Navigate to your desired URL
}

        在主框架视图中,你需要使用类向导将该视图添加到你的应用程序中。在 CMainFrame 中的 OnCreateClient 方法中创建一个 CHtmlView 视图对象。

// MainFrm.cpp
#include "stdafx.h"
#include "MainFrm.h"
#include "MyHtmlView.h"...BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{// 创建 HTML 视图m_wndSplitter.CreateStatic(this, 1, 2);m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CView), CSize(100, 100), pContext);m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMyHtmlView), CSize(100, 100), pContext);return TRUE;
}

三.Web 浏览器应用程序示例

        完善一个简单的 Web 浏览器应用程序,除了基本的浏览功能外,还可以考虑添加一些额外的功能,比如前进、后退、刷新等。以下是一个更完整的示例:

// MyWebBrowser.h
#pragma once#include <afxhtml.h>class CMyWebBrowser : public CHtmlView
{
protected:DECLARE_DYNAMIC(CMyWebBrowser)public:CMyWebBrowser();virtual ~CMyWebBrowser();void Navigate(LPCTSTR lpszURL);void NavigateBack();void NavigateForward();void Refresh();protected:DECLARE_MESSAGE_MAP()
};// MyWebBrowser.cpp
#include "stdafx.h"
#include "MyWebBrowser.h"IMPLEMENT_DYNAMIC(CMyWebBrowser, CHtmlView)BEGIN_MESSAGE_MAP(CMyWebBrowser, CHtmlView)
END_MESSAGE_MAP()CMyWebBrowser::CMyWebBrowser()
{
}CMyWebBrowser::~CMyWebBrowser()
{
}void CMyWebBrowser::Navigate(LPCTSTR lpszURL)
{Navigate2(lpszURL, NULL, NULL);
}void CMyWebBrowser::NavigateBack()
{GoBack();
}void CMyWebBrowser::NavigateForward()
{GoForward();
}void CMyWebBrowser::Refresh()
{Refresh2();
}

然后,在你的主框架类中,可以添加按钮或菜单项来执行这些操作:

// MainFrm.h
#pragma once#include "MyWebBrowser.h"class CMainFrame : public CFrameWnd
{// ...protected:CMyWebBrowser m_webBrowser;// ...afx_msg void OnNavigateBack();afx_msg void OnNavigateForward();afx_msg void OnNavigateRefresh();// ...
};// MainFrm.cpp
#include "stdafx.h"
#include "MainFrm.h"// ... 其他包含的头文件BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)// ...ON_COMMAND(ID_NAVIGATE_BACK, &CMainFrame::OnNavigateBack)ON_COMMAND(ID_NAVIGATE_FORWARD, &CMainFrame::OnNavigateForward)ON_COMMAND(ID_NAVIGATE_REFRESH, &CMainFrame::OnNavigateRefresh)// ...
END_MESSAGE_MAP()CMainFrame::CMainFrame()
{// ...
}void CMainFrame::OnNavigateBack()
{m_webBrowser.NavigateBack();
}void CMainFrame::OnNavigateForward()
{m_webBrowser.NavigateForward();
}void CMainFrame::OnNavigateRefresh()
{m_webBrowser.Refresh();
}

在资源文件中定义这些菜单项,并在应用程序启动时初始化浏览器:

// MainFrm.cpp 中的 CMainFrame 构造函数中CMainFrame::CMainFrame()
{// ...if (!m_webBrowser.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL)){TRACE0("Failed to create web browser\n");}else{m_webBrowser.Navigate(_T("https://www.example.com"));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图书推荐】《Vue.js 3.x+Element Plus从入门到精通(视频教学版)》

本书用处 内容简介 本书通过对Vue.js&#xff08;简称Vue&#xff09;的示例和综合案例的介绍与演练&#xff0c;使读者快速掌握Vue.js 3.x框架的用法&#xff0c;提高Web前端的实战开发能力。本书配套示例源码、PPT课件、教学大纲、教案、同步教学视频、习题及答案、其他资源…

HTML+CSS 响应式导航栏

效果演示 Code <div class="navbar"><input type="checkbox"><span></span><span></span><ul><li><a href="#">点赞</a></li><li><a href="#">关注&…

模拟器玩游戏

IOS系统 【PPSSPP与Retroarch 模拟器上架苹果商店&#xff0c;教你如何玩转复古游戏模拟器】 安卓

SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?

尼恩&#xff1a;LLM大模型学习圣经PDF的起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#x…

【数据结构】数据结构中的隐藏玩法——栈与队列

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

依赖管理与Springboot Starters

依赖管理与Spring Boot Starters 在现代软件开发过程中&#xff0c;依赖管理是一项至关重要的任务。随着应用程序规模的扩大&#xff0c;引入的依赖项数量也会增加&#xff0c;使得版本冲突和类路径问题成为常见的挑战。为了应对这些挑战&#xff0c;Spring Boot提供了一套简化…

【OpenCV 基础知识 11】计算通道像素值和

cvSplit()函数将复制src的各个通道到图像dst0&#xff0c;dst1&#xff0c;dst2和dst3中。如果源图像少于4个通道的情况下&#xff0c;那么传递给cvSplit()的不必要的目标参数可设置为NULL program cv_Sum;{$APPTYPE CONSOLE} {$R *.res}usesSystem.SysUtils,ocv.highgui_c,oc…

前端基于word模板导出word文档

项目环境 vue2 js vue-cli等 依赖包都可以在npm官网找到对应文档 npm官网(英文) 1、依赖 安装依赖 docxtemplater npm i docxtemplaterfile-saver npm i file-saverjszip-utils npm i jszip-utilsjszip npm i jszip在对应页面或模块中引入依赖 import Docxtemplater …

QQ个性网空间日志网站模板源码

QQ个性网空间日志网站模板源码自带后台登录设置&#xff0c;适用于博客、文章、资讯、其他类网站内容使用。模板自带eyoucms内核&#xff0c;原创设计、手工书写DIVCSS&#xff0c;完美兼容IE7、Firefox、Chrome、360浏览器等;主流浏览器;结构容易优化;多终端均可正常预览。由于…

力扣刷题---2206. 将数组划分成相等数对【简单】

题目描述&#x1f357; 给你一个整数数组 nums &#xff0c;它包含 2 * n 个整数。 你需要将 nums 划分成 n 个数对&#xff0c;满足&#xff1a; 每个元素 只属于一个 数对。 同一数对中的元素 相等 。 如果可以将 nums 划分成 n 个数对&#xff0c;请你返回 true &#xf…

react 低代码平台方案汇总

React作为当前最流行的前端框架之一&#xff0c;其生态系统中孕育了多种低代码平台方案&#xff0c;旨在加速应用开发过程。以下是几款基于React的低代码平台或工具&#xff0c;它们通过可视化构建、预制组件、数据绑定等功能&#xff0c;帮助开发者快速构建应用程序&#xff1…

【Tools】SpringBoot工程下的全局异常处理

Catalog SpringBoot工程下的全局异常处理一、需求二、实现 SpringBoot工程下的全局异常处理 一、需求 程序运行过程中没法保证一定不会出错&#xff0c;即程序中会报异常&#xff0c;而系统默认的异常信息的格式往往和我们自定义返回的消息格式不一致&#xff0c;还会影响返回…

力扣刷题---3146. 两个字符串的排列差

题目描述 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 。 示例 1&#xff1a; 输入&#xff1a;s “abc”, t “b…

AcWing 154. 滑动窗口——算法基础课题解

AcWing 154. 滑动窗口 题目描述 给定一个大小为 n≤10^6 的数组。 有一个大小为 &#x1d458; 的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 &#x1d458; 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子&#xff1a; 该数组为…

运用HTML、CSS设计Web网页——“西式甜品网”图例及代码

目录 一、效果展示图 二、设计分析 1.整体效果分析 2.头部header模块效果分析 3.导航及banner模块效果分析 4.分类classify模块效果分析 5.产品展示show模块效果分析 6.版权banquan模块效果分析 三、HTML、CSS代码分模块展示 1. 头部header模块代码 2.导航及bann…

【SpringCloud】Spring Cloud基本介绍

目录 回顾架构分类单体架构分布式架构微服务架构什么是微服务优点缺点微服务的架构特征&#xff1a;微服务架构面临的挑战技术挑战微服架构的设计原则微服务概念提供者(Provider)消费者(Consumer)RPC和Restful集群分布式 总结 服务拆分和远程调用服务拆分原则服务拆分示例 思考…

docker和docker-compose安装

1.安装docker 安装所需的软件包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2#设置阿里源 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新软件包索引 sudo yum makecache fast查询可安装…

力扣爆刷第143天之二叉树五连刷(二叉搜索树)

力扣爆刷第143天之二叉树五连刷&#xff08;二叉搜索树&#xff09; 文章目录 力扣爆刷第143天之二叉树五连刷&#xff08;二叉搜索树&#xff09;一、530. 二叉搜索树的最小绝对差二、501. 二叉搜索树中的众数三、236. 二叉树的最近公共祖先四、235. 二叉搜索树的最近公共祖先…

http项目改为/支持https的方案、无需修改后台代码

背景描述&#xff1a;原来的项目前后台都是http&#xff0c;现在某个服务要求前台必须使用https&#xff1b; 方案1&#xff1a;前台部署在https里&#xff0c;后面代码修改&#xff1b;但是微服务架构&#xff0c;后台工作量太大&#xff1b; 方案2&#xff1a;前台部署在ht…

Pytorch-08 实战:手写数字识别

手写数字识别项目在机器学习中经常被用作入门练习&#xff0c;因为它相对简单&#xff0c;但又涵盖了许多基本的概念。这个项目可以视为机器学习中的 “Hello World”&#xff0c;因为它涉及到数据收集、特征提取、模型选择、训练和评估等机器学习中的基本步骤&#xff0c;所以…