关于跨域的what,why,how

本文详细解释了跨域问题产生的原因及解决办法,包括浏览器限制、请求类型的影响,并介绍了JSONP和CORS两种主要解决方案。

1.跨域是什么鬼?

前台调用后台的接口,如果不是同一个域,就会产生跨域问题

2.为什么会产生跨域问题?

1. 浏览器限制

浏览器出于安全考虑,发现请求是跨域的时候,会做一些校验,校验不通过,就会有跨域问题

2. 发出的请求不是本域的

发出的请求,不是本域的,协议,域名,端口,任何一个不一样,浏览器都会认为是跨域

3. 发出的是XHR(XMLHttpRequest)请求

如果发出的不是XHR请求,即使不是本域的,浏览器不会认为是跨域

3.如何解决跨域问题?

1.让浏览器不做校验


命令行参数启动:通过命令行参数启动浏览器(--disable-web-security), 浏览器不会检查

MacOS命令行:
open -n /Applications/Google Chrome.app/ --args --disable-web-security —user-data-dir=/Users/你电脑的名字/MyChromeDevUserData/

2.jsonp本身


jsonp是用动态创建的script标签对进行请求  /get?callback=123
为什么jsonp可以解决跨域问题?
发出的请求不是xhr类型,type是script类型,浏览器不做校验

callback的内容,就是函数名,返回的数据,是作为函数的参数
jsonp的缺点:
-服务器需要改动代码
-只支持get方法
-发送的不是xhr请求 

3.跨域本身

跨域资源共享CORS:在响应头增加指定的字段,允许对方调用

Access-Control-Allow-Origin
            "*" 允许所有域跨域调用
            "http://www.sanjieke.cn" 允许这个域跨域调用
        
Access-Control-Allow-Method
            "*" 允许所有的方法
            "GET" 指定允许的方法
            
带cookie的跨域,origin必须是全匹配,不能是*号,需要增加Access-Control-Allow-Credentials为true,前端也需要设置xhr.withCredentials = true 带上cookie


带自定义头的跨域,增加Access-Control-Allow-Headers,值为自定义头

更详细的解读 https://segmentfault.com/a/11...

# -*- coding: utf-8 -*- """ ============================ requests 课件:HTTP 请求核心方法详解 ============================ 版本:3.1 | 修复 JSON 解码错误 + 最佳实践示例 📌 使用的免费测试接口: 1. https://jsonplaceholder.typicode.com/ - 提供标准 REST API 接口 2. https://postman-echo.com/post - 稳定的 POST 测试接口,支持表单提交 """ # 🧠 What:requests 是什么? # requests 是 Python 中最常用的 HTTP 客户端库,用于向 Web 服务器发送各种类型的请求。 # 它广泛应用于 API 调试、接口测试、网络爬虫等场景。 # 🛠 How:怎么使用? # - 使用 requests.get() 发送 GET 请求 # - 使用 requests.post() 发送 POST 请求 # - 使用 requests.put() 发送 PUT 请求 # - 使用 requests.delete() 发送 DELETE 请求 # - 使用 params、data、json 控制请求体 # - 使用 headers 设置请求头 # - 使用 timeout 控制超时时间 # - 使用异常处理保障程序健壮性 # 🎯 Why:为什么要用 requests? # - 简洁易用,语法直观 # - 支持多种 HTTP 方法 # - 自动处理编码和解码 # - 社区活跃,文档丰富 # - 适用于自动化脚本、接口测试、爬虫等 import requests # ==================== # 第一部分:GET 请求详解 # ==================== # 示例 1:最基础的 GET 请求 def demo_get_simple(): """最基础的 GET 请求示例""" print("=== 示例 1:最基础的 GET 请求 ===") url = "https://jsonplaceholder.typicode.com/posts/1" response = requests.get(url) print(f"状态码: {response.status_code}") print("响应内容(前50字符):") print(response.text[:50] + "...") # 示例 2:带查询参数的 GET 请求 def demo_get_with_params(): """带查询参数的 GET 请求示例""" print("=== 示例 2:带查询参数的 GET 请求 ===") url = "https://jsonplaceholder.typicode.com/posts" params = { "userId": 1, "_limit": 2 } response = requests.get(url, params=params) print(f"完整URL: {response.url}") print("返回数据:") for item in response.json(): print(f"ID: {item['id']}, 标题: {item['title']}") # 示例 3:带请求头的 GET 请求 def demo_get_with_headers(): """带请求头的 GET 请求示例""" print("=== 示例 3:带请求头的 GET 请求 ===") url = "https://jsonplaceholder.typicode.com/posts" headers = { "User-Agent": "MyApp/1.0", "Accept": "application/json" } response = requests.get(url, headers=headers) print(f"响应头 Content-Type: {response.headers['Content-Type']}") print("第一条数据标题:", response.json()[0]['title']) # 示例 4:带超时和异常处理的 GET 请求 def demo_get_with_timeout(): """带超时和异常处理的 GET 请求示例""" print("=== 示例 4:带超时和异常处理的 GET 请求 ===") url = "https://jsonplaceholder.typicode.com/posts" try: response = requests.get(url, timeout=3) response.raise_for_status() print("请求成功,返回数据条数:", len(response.json())) except requests.exceptions.Timeout: print("请求超时!") except requests.exceptions.HTTPError as e: print(f"HTTP 错误: {e}") except requests.exceptions.RequestException as e: print(f"请求错误: {e}") # ==================== # 第二部分:POST 请求详解 # ==================== # 示例 5:最基础的 POST 请求(JSON 数据) def demo_post_simple_json(): """最基础的 POST 请求(JSON 数据)""" print("=== 示例 5:最基础的 POST 请求(JSON 数据) ===") url = "https://jsonplaceholder.typicode.com/posts" data = { "title": "新文章", "body": "这是内容", "userId": 1 } response = requests.post(url, json=data) print(f"状态码: {response.status_code}") print("返回数据 ID:", response.json()['id']) # 示例 6:POST 发送表单数据(使用支持 form 数据返回的接口) def demo_post_form_data(): """POST 发送表单数据(100% 可靠)""" print("\n=== 示例 5:表单数据 POST 请求 ===") url = "https://httpbin.org/post" form_data = { "username": "demo_user", "email": "user@example.com", "subscribe": "true", "preferences": "tech,news" } try: print(f"📤 发送的表单数据: {form_data}") response = requests.post(url, data=form_data, timeout=5) response.raise_for_status() result = response.json() print("\n✅ 服务器接收到的表单数据:") print(json.dumps(result['form'], indent=2)) print("\n🔍 请求详情:") print(f"来源IP: {result['origin']}") print(f"请求头: {json.dumps(result['headers'], indent=2)[:100]}...") except requests.exceptions.RequestException as e: print(f"❌ 请求失败: {e}") except json.JSONDecodeError: print("❌ 响应不是有效JSON") print(f"原始响应: {response.text[:200]}") # 示例 7:POST 发送 JSON + 自定义 Headers def demo_post_json_with_headers(): """POST 发送 JSON + 自定义 Headers 示例""" print("=== 示例 7:POST 发送 JSON + 自定义 Headers ===") url = "https://jsonplaceholder.typicode.com/posts" data = { "title": "高级文章", "body": "带自定义头", "userId": 1 } headers = { "Content-Type": "application/json", "X-Requested-With": "XMLHttpRequest" } response = requests.post(url, json=data, headers=headers) print("返回标题:", response.json()['title']) # 示例 8:POST 发送 JSON + 超时和异常处理 def demo_post_with_timeout(): """POST 发送 JSON + 超时和异常处理示例""" print("=== 示例 8:POST 发送 JSON + 超时和异常处理 ===") url = "https://jsonplaceholder.typicode.com/posts" data = { "title": "测试超时", "body": "超时测试内容", "userId": 1 } try: response = requests.post(url, json=data, timeout=3) response.raise_for_status() print("创建成功,ID:", response.json()['id']) except requests.exceptions.Timeout: print("请求超时!") except requests.exceptions.RequestException as e: print(f"请求失败: {e}") # ==================== # 第三部分:PUT 请求详解 # ==================== # 示例 9:使用 PUT 更新资源 def demo_put_update(): """使用 PUT 请求更新资源示例""" print("=== 示例 9:使用 PUT 请求更新资源 ===") url = "https://jsonplaceholder.typicode.com/posts/1" data = { "id": 1, "title": "更新后的标题", "body": "更新后的内容", "userId": 1 } response = requests.put(url, json=data) print(f"状态码: {response.status_code}") print("更新后的标题:", response.json()['title']) # ==================== # 第四部分:DELETE 请求详解 # ==================== # 示例 10:使用 DELETE 删除资源 def demo_delete_resource(): """使用 DELETE 请求删除资源示例""" print("=== 示例 10:使用 DELETE 请求删除资源 ===") url = "https://jsonplaceholder.typicode.com/posts/1" response = requests.delete(url) print(f"状态码: {response.status_code}") print("响应内容:", response.text) # ==================== # 第五部分:综合实战(最佳实践示例) # ==================== # 示例 11:最佳实践 - 完整请求流程(headers + timeout + session + 异常处理) def demo_best_practice(): """最佳实践示例:完整请求流程 + 安全调用""" print("=== 示例 11:最佳实践 - 完整请求流程 ===") url = "https://jsonplaceholder.typicode.com/posts" headers = { "User-Agent": "BestPracticeApp/1.0", "Accept": "application/json" } data = { "title": "最佳实践文章", "body": "这是一篇测试文章", "userId": 1 } with requests.Session() as session: session.headers.update(headers) try: response = session.post(url, json=data, timeout=5) response.raise_for_status() print("文章创建成功,ID:", response.json()['id']) except requests.exceptions.Timeout: print("请求超时,请检查网络") except requests.exceptions.HTTPError as e: print(f"HTTP 错误: {e}") except requests.exceptions.RequestException as e: print(f"请求异常: {e}") # ==================== # 主函数:运行所有示例 # ==================== if __name__ == "__main__": print("🚀 开始演示 requests 核心请求方法详解") demo_get_simple() demo_get_with_params() demo_get_with_headers() demo_get_with_timeout() demo_post_simple_json() demo_post_form_data() demo_post_json_with_headers() demo_post_with_timeout() demo_put_update() demo_delete_resource() demo_best_practice() # 最佳实践 print("\n✅ 所有演示完成") 这个文件用的都是别人的接口,不稳定,你帮我在本地写一个接口,支持以上所有的请求方式,并且能返回我们输入的内容
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值