昊天SEO

练习51: 从浏览器中取得输入–笨方法学ruby在线

虽然能让浏览器显示「Hello World」是很有趣的一件事情,但是如果能让用户通过表单(form)向你的应用程序提交信息就更有趣了。这节练习中,我们将使用form 改进你的web 程序,并且搞懂如何为一个网站程序写自动化测试。

Web 运作原理

该学点无趣的东西了。在建立 form 前你需要先多学一点关于 web的运作原理。这里讲的并不完整,但是相当准确,在你的程序出错时,它会帮你找到出错的原因。另外,如果你理解了form 的应用,那么建立form 对你来说就会更容易了。

我将以一个简单的图示讲起,它向你展示了web 请求的各个不同的部分,以及信息传递的大致流程:

为了方便讲述HTTP 请求(request) 的流程,我在每条线上面加了字母标签以作区别。

  1. 你在浏览器中输入网址http://learnpythonthehardway.org/,然后浏览器会通过你的电脑的网路设备发出request(线路A)。
  2. 你的request 被传送到网际网路(线路B),然后再抵达远端服务器(线路C),然后我的服务器将接受这个request。
  3. 我的服务器接受 request 后,我的 web 应用程序就去处理这个请求(线路D),然后我的网页应用程序就会去运行 / (index) 这个「处理程序(handler)」。
  4. 在代码 return 的时候,我的服务器就会发出响应(response),这个响应会再通过线路D传递到你的浏览器。
  5. 这个网站所在的服务器将响应由线路D获取,然后通过线路C传至网际网路。
  6. 响应通过网路网路由线路B传至你的电脑,电脑的网路卡再通过线路A将响应传给你的浏览器。
  7. 最后,你的浏览器显示了这个响应的内容。

这段详解中用到了一些术语。你需要掌握这些术语,以便在谈论你的 web 应用时你能明白而且应用它们:

浏览器(browser)

这是你几乎每天都会用到的软件。大部分人不知道它真正的原理,他们只会把它叫作「网际网路」。它的作用其实是接收你输入到地址栏网址(例如http://learnpythonthehardway.org),然后使用该信息向该网址对应的服务器提出请求(request)。

IP 位址 ( Address )

通常这是一个像 http://learnpythonthehardway.org/ 一样的URL (Uniform Resource Locator,统一资源定位符 ),它告诉浏览器该打开哪个网站。前面的 http 指出了你要使用的协议(protocol),这里我们用的是「超文本传输协议(Hyper-Text Transport Protocol)」。你还可以试试ftp://ibiblio.org/,这是一个「FTP文件传输协议(File Transport Protocol)‘的例子。learnpythonthehardway.org 这部分是「主机名(hostname)」,也就是一个便于人阅读和记忆的字串,主机名会被匹配到一串叫作「IP 位址」的数字上面,这个「IP 位址」就相当于网路中一台电脑的电话号码,通过这个号码可以访问到这台电脑。最后,URL中还可以尾随一个「路径「,例如 http://learnpythonthehardway.org/book/ 中的 /book/,它对应的是服务器上的某个文件或者某些资源,通过访问这样的网址,你可以向服务器发出请求,然后获得这些资源。网站地址还有很多别的组成部分,不过这些是最主要的。

连接(connection)

一旦浏览器知道了协议(http)、服务器(learnpythonthehardway.org)、以及要获得的资源,它就要去建立一个连接。这 个过程中,浏览器让操作系统(Operating System, OS) 打开计算机的一个「端口(port)」(通常是80端口),端口准备好以后,操作系统会回传给你的程序一个类似文件的东西,它所做的事情就是通过网路传输 和接收资料,让你的电脑和learnpythonthehardway.org这个网站所属的服务器之间实现资料交流。当你使用 http://localhost:4567/ 访问你自己的站点时,发生的事情其实是一样的,只不过这次你告诉了浏览器要访问的是你自己的电脑(localhost),要使用的端口不是默认的80,而 是 4567 。你还可以直接访问http://learnpythonthehardway.org:80/,这和不输入端口效果一样,因为HTTP的默认端口本来就 是80。

请求(request)

你的浏览器通过你提供的地址建立了连接,现在它需要从远端服务器要到它(或你)想要的资源。如果你在URL的结尾加了 /book/,那你想要的就是/book/ 对应的文件或资源,大部分的服务器会直接为你调用/book/index.html 这个文件,不过我们就假装不存在好了。浏览器为了获得服务器上的资源,它需要向服务器发送一个「请求」。这里我就不讲细节了,为了得到服务器上的内容,你必须先向服务器发送一个请求才行。有意思的是,「资源」不一定非要是文件。例如当浏览器向你的应用程序提出请求的时候,服务器返回的其实是你的代码生成 的一些东西。

服务器(server)

服务器指的是浏览器另一端连接的电脑,它知道如何回应浏览器请求的文件和资源。大部分的 web 服务器只要发送文件就可以了,这也是服务器流量的主要部分。不过你学的是使用 Ruby 组建一个服务器,这个服务器知道如何接受请求,然后返回用 Ruby 处理过的字符串。当你使用这种处理方式时,你其实是假装把文件发给了浏览器,其实你用的都只是代码而已。就像你在《练习50》中看到的,要构建一个「响 应」其实也不需要多少代码。

响应(response)

这就是你的服务器回复给你的请求,传回至浏览器的HTML,它里边可能有css、javascript、或者图片等内容。以文件响应为例,服务器只 要从磁盘读取文件,发送给浏览器就可以了,不过它还要将这些内容包在一个特别定义的「header]」中,这样浏览器就会知道它获取的是什么类型的内容。 以你的web 应用程序为例,你发送的其实还是一样的东西,包括 header 也一样,只不过这些资料是你用 Ruby 代码即时生成的。

这个可以算是你能在网上找到的关于浏览器如何访问网站的最快的快速课程了。这节课程应该可以帮你更容易地理解本节的练习,如果你还是不明白,就到处 找资料多多了解这方面的信息,知道你明白为止。有一个很好的方法,就是你对照着上面的图示,将你在《练习50》中创建的 web 程序中的内容分成几个部分,让其中的各部分对应到上面的图示。如果你可以正确地将程序的各部分对应到这个图示,你就大致开始明白它的运作原理了。

表单(form)的运作原理

熟悉「表单」最好的方法就是写一个可以接收表单资料的程序出来,然后看你可以对它做些什么。先将你的lib/gothonsweb.rb 修改成下面的样子:

require_relative "gothonweb/version"
require "sinatra"
require "erb"

module Gothonweb
  get '/' do
    greeting = "Hello, World!"
    erb :index, :locals => {:greeting => greeting}
  end

  get '/hello' do
    name = params[:name] || "Nobody"
    greeting = "Hello, #{name}"
    erb :index, :locals => {:greeting => greeting}
  end
end

本文地址官网    新乡网站建设,seo

分享到:更多 ()