[翻译]HTTP: Let’s GET It On!
简介
几周之前,我们了解到HTTP是一个应用级的协议。现在是时候探索我们应该如何在客户端和服务端的通信之间使用这个协议了。
从网络上获取资源
记住,HTTP客户端(浏览器)总是向HTTP服务器发起请求。HTTP协议给客户端提供了一些工具向服务器表达意图:URI、HTTP方法和HTTP头部。
给资源起一个名字
URI是网络的基础之一。它解决了互联网上存在的一个重大问题:如何唯一的标识出网络上的一个资源。
如果你让某人抓取一个东西并带给你,你没有其他办法,你需要用词语描述你想要的那个东西以区分出它:
你可能会对朋友说“把这本书带给我。”
你的朋友也许会回答“好的,你要哪一本?”
你说“在另外房间中的那一本。”
你的朋友来到那个房间“哪一本?”
你有点不耐烦“绿色的那个。”
你的朋友“嘿,老兄!这有两个绿色的书。”
最后,你站起身自己拿到了那本书。但是,所有的这些都可以更简单。随后我们想再次访问这些资源时,我们要如何唯一的识别出他们呢?记忆是一种可能的方案。但是,我们要如何给其他人介绍从而拿到你想要的那个资源呢?为此,我们创建一个系统:
1、剪纸或者使用黄色的便签。
2、在你所在的房间或桌子上,将空白便签放在你稍后要访问的对象(例如书籍)的旁边或顶部。
3、在每一个便签上写上一个唯一的ID。
4、在另外一个房间或另外一张桌子上重复上述过程。
记住,这不仅仅只是为了你自己使用,它还要能实现互动(可以显著的避免你的不便)。我在纸上写了如下标识以便我能找到对应的对像:
myRoom.org/table/book/001
myRoom.org/shelf/book/002
otherRoom.org/cup/001
otherRoom.org/flower/001
otherRoom.org/book/001
到目前为止,我想你已经理解了这种方案。现在,我们有了一个标签系统用来精确的标识一个空间内的物品。在网络上,我们使用URI处理一个信息空间并且标识这个信息。
访问被标识的资源
在上一篇文章中我们学习了使用命令行发送HTTP请求的技术。我们使用一个包含了HTTP方法GET和HTTP头部Host的简单的结构:
GET / HTTP/1.1
Host: www.opera.com
HTTP方法的完整列表是:OPTIONS,GET,POST,PUT,DELETE,TRACE,CONNECT。他们中的每一个都有不同的功能,在随后的文章中我们会介绍。GET方法是使用最多的方法。我们每次在浏览器的地址栏中输入HTTP URI时,我们都向服务器发送了一个GET请求。
在网络上,更多的信息(HTTP头部)被客户端发送给了服务器来帮助协商HTTP请求。然后,服务器将根据这些头部信息调整他的响应。在Opera Dragonfly中有一个非常实用的工具用来创建自定义的HTTP请求并查看服务器的HTTP响应:你可以在Network部分下的Make Request标签下找到它(现在Opera已经放弃了自己的内核,在最新的Opera里已经找不到了,你可以使用postman代替)。

在Make Request标签里,有这些区域:
URL:资源标识符(或者说网址)
Request body:客户端发送给服务器的内容。(‘Send request’按钮会通过网络向服务器发送一个请求)
Response:请求完成后服务器的响应
定制HTTP请求
1、把https://www.opera.com/复制到URL部分的输入框中。
2、将下面的HTTP请求复制到”Request body”部分的输入框中。
3、然后点击”Send request”按钮。
GET / HTTP/1.1
Host: www.opera.com
Accept-Language: en
Opera HTTP服务器会回复一些HTTP响应头信息和文档的标记。响应的信息可能会很长,你需要滚动查看。注意,文档是英文的--不仅是书写语言,在html元素的lang属性中也明确指定了:
<!DOCTYPE html>
<html lang="en">
让我们试试法语:
GET / HTTP/1.1
Host: www.opera.com
Accept-Language: fr
这次试用标记中指定的法语和文档中文本的实际语言响应:
<!DOCTYPE html>
<html lang="fr">
我们使用了同一个URI--https://www.opera.com/--但是收到了不同的回应,仅仅因为我们改变了HTTP的Accept-Language。注意,服务器返回了很多头部信息,给我们提供了关于资源的状态,比如类型等。这将允许客户端调整对文档的处理。你也可以试试其他不同的语言:日语ja,德语de。
如果我们请求的语言在服务器上不存在会发生什么呢?你可以试试中文zh(服务器上当然有中文支持):
GET / HTTP/1.1
Host: www.opera.com
Accept-Language: zh
你得到了英文版本的站点--是不是有点疑惑?这是网站设计选择的一部分。服务器的HTTP响应可以以不同方式设计:可以简单地回复“对于这个地址我们没有中文版本。”或者“这个地址没有对应的中文版本,这是目前可用的语言版本”(带有指向不同语言版本的链接列表)。但是Opera UX部门决定,当请求的语言未知时,服务器默认发送英文版本。这确实是一个选择问题:并没有正式的标准规定该怎么做。
这就是我为什么总是给UX的同事和前端开发者教授一点HTTP知识的原因。HTTP是一个应用程序协议,用来管理客户端和服务器之间的通信。就其本身而言,当创建为人类和机器(机器人、API和客户端等)一个网站的时候,理解他是如何工作的有助于设计出有意义的交互。
你要记住的要点
URI:互联网上用来标识信息的系统
HTTP Methods:协议目前包含8种请求一个URI的方法:OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECT。这篇文章中我们重点关注使用比较多的GET方法。
HTTP Headers:头部信息是用户代理发送的额外数据,用于给客户端和服务器之间正在处理的事物提供更多的配置指令。他们中的一些将帮助服务器以更合适的方式回应。
[翻译]HTTP: Let’s GET It On!的更多相关文章
- 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- [翻译]开发文档:android Bitmap的高效使用
内容概述 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently",包括大尺寸Bitmap的高效加载,图片的异步加载和数据缓存 ...
- 【探索】机器指令翻译成 JavaScript
前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
- 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?
0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点
在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航
ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...
随机推荐
- 《EMCAScript6入门》读书笔记——16.Generator函数的语法
鼠标指针移到图片上,右键,选择在“在新标签页中打开”,放大即可看到清晰文字.
- [Redis] - 高并发下Redis缓存穿透解决
高并发情况下,可能都要访问数据库,因为同时访问的方法,这时需要加入同步锁,当其中一个缓存获取后,其它的就要通过缓存获取数据. 方法一: 在方法上加上同步锁 synchronized //加同步锁,解决 ...
- 【java工具类】java做的一个xml转Excel工具,基于maven工程
说明:适合数据库导出为xml时转成Excel 本工具将上传至GitHub:https://github.com/xiaostudy/xiaostudyAPI3 doc4j的maven依赖 <!- ...
- 【TCP/IP详解 卷一:协议】第二章:链路层
2.1 引言 链路层的三个目的: (1)为IP模块发送和接收IP数据报. (2)为ARP模块发送ARP请求和接收ARP应答.地址解析协议:ARP. (3)为RARP模块发送RARP请求和接收RARP应 ...
- UVa 1625 颜色的长度
https://vjudge.net/problem/UVA-1625 题意: 输入两个长度分别为n和m的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部.对于每个 ...
- spoj MINSUB 单调栈+二分
题目链接:点击传送 MINSUB - Largest Submatrix no tags You are given an matrix M (consisting of nonnegative i ...
- 安装 mysql5.7.2 (Ubuntu 16.04 desktop amd64)
1.下载mysql deb https://dev.mysql.com/downloads/mysql/ #移动到/usr/local/src/目录,解压 sudo mv mysql-server_5 ...
- Spring boot 添加日志 和 生成接口文档
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- Java实现邮箱激活验证2
SendEmail.java [java] view plaincopyprint? package com.app.tools; import java.util.Date; import ja ...
- Unity项目中显示项目的FPS
using UnityEngine; using System.Collections; public class ShowFpsOnGUI : MonoBehaviour { public floa ...