> 技术文档 > PB9使用HTTPObject获取网页HTML源码详解

PB9使用HTTPObject获取网页HTML源码详解

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本主题介绍如何利用PowerBuilder 9(PB9)编程语言获取和处理互联网网页的HTML源码。内容涵盖了PowerBuilder基础、网络通信原理、HTTPObject类的使用方法、如何处理HTML源码以及相关文件列表和实际应用示例。通过深入学习,开发者可以掌握PB9在Web开发中的网络请求技能,并将该技术应用于数据抓取、网页分析等场景。
PB9获取Internet网页的源码

1. PowerBuilder 9基础

1.1 PowerBuilder简介

PowerBuilder 9 是一个流行的快速应用开发(RAD)工具,特别适合开发数据库驱动的应用程序。它的强大之处在于它所提供的大量控件、组件和框架,能够帮助企业快速构建复杂的应用。

1.2 开发环境搭建

在开始使用PowerBuilder 9之前,您需要确保已经正确安装了PowerBuilder开发环境。安装完成后,进行初始配置,如选择合适的编译器和数据库连接参数。

1.3 创建首个PowerBuilder应用

为快速入门,我们从创建一个简单的窗口应用开始。首先,使用PowerBuilder的对象库创建窗口、按钮等控件,并为按钮添加事件处理逻辑,实现一个简单的“Hello World”程序。

// 示例代码:一个简单的“Hello World”程序// 创建窗口对象Window w_helloworld// 创建按钮对象Button b_display// 事件处理程序,当按钮被点击时触发Long ll_retcodell_retcode = w_helloworld.open()IF ll_retcode = 1 THEN MessageBox(\"Hello World\", \"Welcome to the world of PowerBuilder!\")END IF

通过以上步骤,您将掌握如何在PowerBuilder 9中搭建开发环境并创建基础应用。接下来,我们会深入学习PowerBuilder的高级特性。

2. 网络通信与HTTP协议

2.1 网络通信基础

2.1.1 网络通信协议概述

网络通信协议是计算机网络中的基础组件,它定义了设备间交换数据的规则和格式。对于PowerBuilder而言,了解网络通信的基础至关重要,因为它能够帮助开发人员编写能够处理网络请求和响应的应用程序。在网络通信中,TCP/IP是一组用于互联网数据传输的基础协议。IP协议负责数据包的传输,而TCP协议确保数据包能够可靠地到达目的地。

在网络协议族中,HTTP(超文本传输协议)作为一种应用层协议,被广泛用于从Web服务器传输超文本到本地浏览器的通信中。HTTP协议的设计使它能够高效且灵活地处理各种类型的资源,是目前网络上应用最广泛的协议之一。

2.1.2 HTTP协议的特点和作用

HTTP协议具有无状态性、简单性、灵活和无连接的特点。HTTP协议中的“无状态”意味着每次通信都是独立的,服务器不会保存任何关于客户端请求的状态信息。简单性体现在HTTP协议的语法和操作简单,易读易懂。灵活性则是由于HTTP允许传输任意类型的数据对象,从而支持了多媒体内容的传输。最后,“无连接”指的是每一次请求和响应之后,连接都会关闭,不过后续引入了持久连接(HTTP/1.1)来优化性能。

在Web开发和应用中,HTTP协议扮演着至关重要的角色,它是客户端和服务器之间交流的桥梁。当用户在浏览器中输入URL或者点击链接时,浏览器会通过HTTP协议向服务器请求相应的资源,服务器则通过HTTP响应返回数据,用户便可以看到网页内容。

2.2 HTTP协议详解

2.2.1 HTTP请求方法

HTTP请求方法,也被称为HTTP动作,定义了客户端与服务器交互的不同方式。主要的HTTP请求方法包括GET、POST、PUT、DELETE等。

  • GET用于请求指定的资源。
  • POST用于发送数据到服务器。
  • PUT用于更新服务器上的资源。
  • DELETE用于删除服务器上的资源。

在PowerBuilder应用中,GET和POST是最常用的HTTP请求方法。GET方法通常用于获取数据,其URL中包含查询参数,而POST方法用于向服务器发送数据,其数据通常包含在请求体中。

2.2.2 HTTP响应状态码

HTTP响应状态码用于告知客户端HTTP请求的结果。状态码由3位数字组成,其中第一位数字定义了响应类别,后两位数字没有具体的分类含义。常见的状态码如下:

  • 2xx(成功):请求正常处理完毕。例如,200 OK代表请求被成功处理。
  • 3xx(重定向):需要后续操作才能完成这一请求。例如,301 Moved Permanently表示资源已永久移动到新的URL。
  • 4xx(客户端错误):请求有语法错误或请求无法实现。例如,404 Not Found代表服务器找不到请求的页面。
  • 5xx(服务器错误):服务器处理请求出错。例如,500 Internal Server Error代表服务器遇到了一个自身无法处理的错误。
2.2.3 HTTP消息头的使用

HTTP消息头在HTTP请求和响应中都存在,用于传递有关请求或响应的元信息。这些元信息包括请求的类型、内容、作者、客户端信息、缓存控制等。消息头的使用使得HTTP协议能够适应不同的数据传输要求。

消息头由一个名称和一个值组成,使用冒号分隔。例如, Content-Type: text/html 指定了发送内容的MIME类型为HTML文本。

在PowerBuilder中,可以通过HTTPObject类的方法和属性来操作HTTP消息头,从而控制和管理HTTP请求和响应的过程。

3. HTTPObject类创建及使用方法

3.1 HTTPObject类概述

3.1.1 HTTPObject类的作用和功能

HTTPObject类在PowerBuilder的网络通信编程中扮演着重要角色。它封装了用于发送HTTP请求和接收HTTP响应的方法,允许开发者无需深入了解底层协议细节,就可以与Web服务进行交互。HTTPObject类的主要功能包括:

  • 创建HTTP连接,支持GET、POST等多种请求方式。
  • 设置请求头和请求体,用于发送定制化的请求。
  • 接收响应,包括响应头和响应体。
  • 提供错误处理机制,以应对网络请求过程中可能出现的各种异常。

3.1.2 如何创建HTTPObject实例

创建HTTPObject实例的步骤非常直接。以下代码展示了如何在PowerBuilder中创建一个HTTPObject对象,并初始化基本的属性。

// 声明一个HTTPObject的实例变量HTTPObject ls_http// 创建一个HTTPObject实例ls_http = Create HTTPObject// 设置超时时间(单位:毫秒)ls_http.TimeOut = 30000// 设置HTTP代理服务器,如果需要的话// ls_http.ProxyAddress = \"your_proxy_address\"// ls_http.ProxyPort = your_proxy_port// ls_http.ProxyUsername = \"your_proxy_username\"// ls_http.ProxyPassword = \"your_proxy_password\"// 启用或禁用自动重定向处理,默认为真ls_http.AutoRedirect = true// 打印创建对象的日志信息MessageBox(\"Info\", \"HTTPObject instance created successfully!\")

通过上述代码,一个HTTPObject实例就成功创建并配置了基本属性。这里我们设置了请求的超时时间,可以根据实际情况进行调整。另外,如果需要通过代理服务器进行请求,还可以设置代理的相关参数。最后,我们启用了自动重定向处理,以便在遇到需要重定向的请求时,HTTPObject可以自动处理。

3.2 HTTPObject类的方法详解

3.2.1 设置连接属性

HTTPObject类允许开发者设置多种连接属性,以便更细致地控制HTTP请求的行为。以下是一些常见的设置方法:

// 设置请求的URL地址ls_http.URL = \"http://www.example.com\"// 设置HTTP请求方法,如GET、POSTls_http.Method = HTTP_GET// 设置请求头信息string ls_headersls_headers = \"Content-Type: application/x-www-form-urlencoded\"ls_http.AddRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\")// 设置请求体内容string ls_requestBodyls_requestBody = \"param1=value1&param2=value2\"ls_http.Request.Entity = Create Entityls_http.Request.Entity.AddokinData(1, ls_requestBody)// 启用或禁用SSL认证ls_http.SSLVerify = true

3.2.2 发送请求的方法

要发送HTTP请求,可以使用HTTPObject类的Send方法。以下是Send方法的使用示例:

// 发送HTTP请求HTTPResponse ll_responsell_response = ls_http.Send()// 检查响应是否成功IF ll_response.Status = HTTP_OK THEN // 请求成功,处理响应内容ELSE // 请求失败,处理错误 MessageBox(\"Error\", \"Send request failed with status: \" + String(ll_response.Status))END IF

3.2.3 接收响应的方法

当HTTP请求发送成功后,我们可以通过HTTPObject类的Response属性来获取响应内容。以下是如何接收并处理响应的代码示例:

// 获取响应头信息HTTPResponse ll_response = ls_http.ResponseIF ll_response IS NOT NULL THEN // 处理响应头信息 string ls_headers = ll_response.Headers // 获取响应状态码 integer ln_status = ll_response.Status // 获取响应体内容 string ls_responseBody = ll_response.Entity.Getokens()END IF

通过这段代码,我们首先检查响应对象是否存在,然后从中提取响应头、状态码以及响应体内容。响应体内容通常包含服务器返回的数据,这些数据可能是HTML页面、JSON、XML等格式,可以根据需要进行进一步解析处理。

在接下来的小节中,我们将详细探讨如何发送HTTP请求以及如何接收和处理HTTP响应,进一步深入了解HTTPObject类的高级应用。

4. 发送HTTP请求与接收响应

4.1 发送HTTP请求

4.1.1 GET请求的发送过程

发送GET请求是HTTP通信中最基本的操作之一。在PowerBuilder中,我们可以使用HTTPObject类来完成这一操作。首先,需要创建一个HTTPObject实例,并设置必要的请求参数,例如URL、端口号等。接着,需要调用实例的Get方法来发送请求,并等待服务器的响应。

下面是一个简单的示例代码,演示了如何发送一个GET请求,并接收响应:

// 创建HTTPObject实例HTTPObject lo_HttpObject = Create HTTPObject// 设置HTTP请求的属性lo_HttpObject.objectiveservice = \"http://www.example.com\"lo_HttpObject.objectport = 80lo_HttpObject.objecturi = \"/index.html\"lo_HttpObject.verb = \"GET\"// 发送GET请求lo_HttpObject.Get()// 检查响应状态码,确认请求成功IF lo_HttpObject.ResponseCode = 200 THEN MessageBox(\"Success\", \"The GET request was successful.\")ELSE MessageBox(\"Error\", \"The GET request failed with code: \" + String(lo_HttpObject.ResponseCode))END IF// 清理资源Destroy lo_HttpObject

4.1.2 POST请求的发送过程

与GET请求相比,POST请求通常用于向服务器提交数据。在发送POST请求时,除了设置请求的基本属性外,我们还需要提供请求体(Request Body),其中包含了提交的数据。在PowerBuilder中,可以通过HTTPObject类的Post方法实现这一过程。

下面是一个发送POST请求的示例代码:

// 创建HTTPObject实例HTTPObject lo_HttpObject = Create HTTPObject// 设置HTTP请求的属性lo_HttpObject.objectiveservice = \"http://www.example.com\"lo_HttpObject.objectport = 80lo_HttpObject.objecturi = \"/submitform\"lo_HttpObject.verb = \"POST\"lo_HttpObject.objectdata = \"username=user&password=123456\" // POST请求的数据// 发送POST请求lo_HttpObject.Post()// 检查响应状态码,确认请求成功IF lo_HttpObject.ResponseCode = 200 THEN MessageBox(\"Success\", \"The POST request was successful.\")ELSE MessageBox(\"Error\", \"The POST request failed with code: \" + String(lo_HttpObject.ResponseCode))END IF// 清理资源Destroy lo_HttpObject

4.2 接收HTTP响应

4.2.1 处理响应头信息

服务器响应的内容包括响应头(Response Header)和响应体(Response Body)。响应头包含了关于响应的元数据,例如内容类型、内容长度、服务器信息等。在PowerBuilder中,可以通过HTTPObject类的Response属性来访问响应头信息。

下面是一个处理响应头信息的示例:

// 创建HTTPObject实例并发送请求(此处假设已经完成)// 读取响应头信息string ls_Headers = lo_HttpObject.ResponseHeaders()// 解析响应头,提取有用的信息// 假设我们要提取内容类型(content-type)integer li_NewLinestring ls_Content_Typeli_NewLine = Pos(ls_Headers, Char(13) + Char(10))IF li_NewLine > 0 THEN ls_Content_Type = Substring(ls_Headers, li_NewLine + 4, Pos(ls_Headers[li_NewLine + 4..], \";\") - 1) MessageBox(\"Content Type\", ls_Content_Type)END IF// 清理资源Destroy lo_HttpObject

4.2.2 读取响应体内容

响应体是服务器返回的实际数据内容,如HTML页面、JSON数据等。在PowerBuilder中,响应体内容可以通过HTTPObject类的ResponseBody属性来访问。

下面是一个读取响应体内容的示例:

// 创建HTTPObject实例并发送请求(此处假设已经完成)// 读取响应体内容string ls_ResponseBody = lo_HttpObject.ResponseBody// 显示响应体内容MessageBox(\"Response Body\", ls_ResponseBody)// 清理资源Destroy lo_HttpObject

在实际应用中,可能需要对响应体进行进一步的解析和处理,例如将JSON数据解析为PowerBuilder中的结构体或数组。这可能需要使用特定的解析函数或第三方库来实现。

5. HTML源码处理与字符串解析

在Web开发和网络数据抓取过程中,获取和解析HTML源码是一个基本而重要的步骤。本章节将详细探讨如何使用PowerBuilder 9来处理HTML源码,并介绍字符串解析的有效方法。

5.1 HTML源码获取

5.1.1 从HTTP响应中提取HTML源码

在使用HTTPObject类发送请求并接收到响应之后,我们首先需要获取HTTP响应的内容,即网页的HTML源码。

HTTPObject lo_httpObjectstring ls_htmlContentlo_httpObject = Create HTTPObjectlo_httpObject.setURL(\"http://example.com\")lo_httpObject.SendGet()// 获取响应状态码,确认请求成功long ll_statusCode = lo_httpObject.getResponseCode()if ll_statusCode = 200 then // 成功响应后提取HTML源码 ls_htmlContent = lo_httpObject.getResponseText() MessageBox(\"Response\", ls_htmlContent)else MessageBox(\"Error\", \"Failed to retrieve HTML content. Status code: \" + String(ll_statusCode))end ifDestroy lo_httpObject

5.1.2 HTML源码的存储和展示

获取到的HTML源码可以存储在文件中,或者直接在应用程序中展示给用户查看。

// 将HTML源码存储到文件中FileSaveDialog fdfd.setFilter(\"Text Files (*.txt)|*.txt\")if fd.ShowModal() = FileSaveDialogResultCancel then return end ifstring ls_fileName = fd.getText()File ff = Create Fileif f.Open(ls_fileName, StreamMode!Write) then f.Write(ls_htmlContent) f.Close()else MessageBox(\"Error\", \"Unable to open file.\")end ifDestroy f

5.2 字符串解析技巧

5.2.1 使用PowerBuilder进行字符串解析

PowerBuilder提供了丰富的字符串函数,可以用来处理和解析HTML源码。常见的操作包括查找、替换和分割字符串。

string ls_htmlContent, ls_title// 假定我们想要提取HTML标题标签内的内容// 使用Find函数查找标题标签的起始位置long ll_startPos = ls_htmlContent.Find(\"\")if ll_startPos > 0 then // 从起始位置开始寻找闭合标签\">\"的位置 long ll_endPos = ls_htmlContent.Find(\">\", ll_startPos) // 提取标签内的文本内容 ls_title = ls_htmlContent.Mid(ll_startPos + 7, ll_endPos - ll_startPos - 7)end ifMessageBox(\"Title\", ls_title)</code></pre>
<h4> 5.2.2 字符串解析的高级技巧和方法 </h4>
<p> 对于更复杂的HTML解析,PowerBuilder内置的字符串函数可能不足以应对。此时可以使用正则表达式或第三方库来实现更精确和强大的解析功能。 </p>
<pre><code class="language-powerscript">// 使用正则表达式来解析HTML源码中的标题Regexp lo_regexpstring ls_pattern = \"<title>(.*)\"long ll_startPos, ll_endPoslo_regexp = Create Regexplo_regexp.SetPattern(ls_pattern)if lo_regexp.Search(ls_htmlContent) then ll_startPos = lo_regexp.GetStart(0) ll_endPos = lo_regexp.GetEnd(0) ls_title = ls_htmlContent.Mid(ll_startPos + 7, ll_endPos - ll_startPos - 7) MessageBox(\"Title\", ls_title)end ifDestroy lo_regexp

这些方法能够帮助我们从HTML源码中提取有用的信息,例如链接、图片等。在实际应用中,还可以结合PowerBuilder的其他对象和功能,如DataWindow,来进一步处理解析结果。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本主题介绍如何利用PowerBuilder 9(PB9)编程语言获取和处理互联网网页的HTML源码。内容涵盖了PowerBuilder基础、网络通信原理、HTTPObject类的使用方法、如何处理HTML源码以及相关文件列表和实际应用示例。通过深入学习,开发者可以掌握PB9在Web开发中的网络请求技能,并将该技术应用于数据抓取、网页分析等场景。

本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif