HTTP协议基础

参考

http://www.ruanyifeng.com/blog/2016/08/http.html
http://httpbin.org/
https://developer.mozilla.org/zh-CN/docs/Web/HTTP

简介

HTTP 是基于 TCP/IP 协议的应用层协议。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口,HTTPS 默认端口443。https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Overview

HTTP请求方法

  • GET:使用 GET 的请求应该只用于获取数据
  • POST:发送数据给服务器. 请求主体的类型由 Content-Type 首部指定
  • HEAD:请求资源的头部信息, 并且这些头部与 HTTP GET 方法请求时返回的一致. 该请求方法的一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载, 以此可以节约带宽资源.
  • PUT:使用请求中的负载创建或者替换目标资源。
  • DELETE:用于删除指定的资源

URL详解

1参考
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web

2定义
HTTP 请求的内容通称为"资源","资源"这一概念非常宽泛,它可以是一份文档,一张图片,或所有其他你能够想到的格式。每个资源都由一个 (URI) 来进行标识。一般情况下,资源的名称和位置由同一个 URL(统一资源定位符,它是 URI 的一种)来标识。URI 的最常见形式是统一资源定位符 (URL),它也被称为 Web 地址
URI:Uniform Resource Identifier 统一资源标识符
URL:Uniform Resource Locator 统一资源定位符

3组成
示例解析:http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument

  • 协议:http、https
  • 主机:ip或域名 (www.example.com)
  • 端口:默认80不显示、其他常见的比如 8080
  • 路径:资源在目标主机上的虚拟路径
  • 查询:查询开始位置为URL中的 ?,结束位置为URL中的 # 或者最后。一般形式为 xx=xx 即属--- 性名=属性值,注意属性值可为空
  • 片段:用来在当前资源中定位某个片段(#SomewhereInTheDocument)

4约束
URL的标准中仅能包含一部分ascii码,所以像汉字之类的是不符合标准的,因此如果遇到不支持的字符,需要对字符进行URL编码,URL编码的方式是把需要编码的字符转化为%xx的形式。通常 URL 编码是基于 UTF-8 的(当然这和浏览器平台有关)。
使用python进行URL编码操作

# coding:utf8
from urllib.parse import quote
_str = "你好"
quote_str = quote(_str, encoding="utf8")
print(quote_str)
# >>> %E4%BD%A0%E5%A5%BD

综合运用示例1

#coding:utf8
import re
import requests
import urllib

word ="你好"
url_base ="http://www.baidu.com/s?wd=%s"
def get_baidu_title(url):
    r = requests.get(url)
    title = re.search("(.*?)", r.text).group(1)
    print(title)
    return title

# 不进行URL编码
get_baidu_title(url_base % word)
# 进行url编码
get_baidu_title(url_base % urllib.parse.quote(word, encoding="utf8"))
# 进行url编码  GBK
get_baidu_title(url_base % urllib.parse.quote(word, encoding="gbk"))

综合运行示例2

import urllib
url ='https://mapi.yiche.com/app_carmodel/api/v1/dealer/get_car_dealer_list?param={"carId":"135759","sort":"1","cityId":"201","pageIndex":"1","pageSize":"20"}&c_ver=4f9465db360d609f2f3732112a969186'
url2 = urllib.parse.quote(url,safe='%;/?:@&=+$,',encoding='utf-8')
print(url2)
#>>> https://mapi.yiche.com/app_carmodel/api/v1/dealer/get_car_dealer_list?param=%7B%22carId%22:%22135759%22,%22sort%22:%221%22,%22cityId%22:%22201%22,%22pageIndex%22:%221%22,%22pageSize%22:%2220%22%7D&c_ver=4f9465db360d609f2f3732112a969186

注意

  1. 该例中 若直接将url贴到浏览器地址栏中是地址无效的,需要将大括号、引号转码后方可访问。
  2. safe参数可以指定安全字符,不参与转码

HTTP状态码

100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息

200 OK 正常返回信息

201 Created 请求成功并且服务器创建了新的资源

202 Accepted 服务器已接受请求,但尚未处理

301 Moved Permanently 请求的网页已永久移动到新位置。

302 Found 临时性重定向。

303 See Other 临时性重定向,且总是使用 GET 请求新的 URI。

304 Not Modified 自从上次请求后,请求的网页未修改过。

400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。

401 Unauthorized 请求未授权。

403 Forbidden 禁止访问。

404 Not Found 找不到如何与 URI 相匹配的资源。

500 Internal Server Error 最常见的服务器端错误。

503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。

你可能感兴趣的:(HTTP协议基础)