Linux 下curl模拟Http 的get or post请求

本文详细介绍了curl命令的基本使用,包括GET和POST请求的使用方法,以及各种常用参数的解释和示例。通过实例演示,帮助读者掌握curl命令在实际开发中的应用。

一、get请求


curl "http://www.baidu.com"  如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地

curl -i "http://www.baidu.com"  显示全部信息

curl -l "http://www.baidu.com" 只显示头部信息

curl -v "http://www.baidu.com" 显示get请求全过程解析


wget "http://www.baidu.com"也可以


二、post请求

curl -d "param1=value1&param2=value2" "http://www.baidu.com"




用途说明

curl命令是一个功能强大的网络工具,它能够通过http、ftp等方式下载文件,也能够上传文件。其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息。类似的工具还有wget

curl命令使用了libcurl库来实现,libcurl库常用在C程序中用来处理HTTP请求,curlpp是libcurl的一个C++封装,这几个东西可以用在抓取网页、网络监控等方面的开发,而curl命令可以帮助来解决开发过程中遇到的问题。

常用参数

curl命令参数很多,这里只列出我曾经用过、特别是在shell脚本中用到过的那些。

-A:随意指定自己这次访问所宣称的自己的浏览器信息

-b/--cookie <name=string/file> cookie字符串或文件读取位置,使用option来把上次的cookie信息追加到http request里面去。

-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中

-C/--continue-at <offset>  断点续转

-d/--data <data>   HTTP POST方式传送数据

-D/--dump-header <file> 把header信息写入到该文件中

-F/--form <name=content> 模拟http表单提交数据

-v/--verbose 小写的v参数,用于打印更多信息,包括发送的请求信息,这在调试脚本是特别有用。

-m/--max-time <seconds> 指定处理的最大时长

-H/--header <header> 指定请求头参数

-s/--slient 减少输出的信息,比如进度

--connect-timeout <seconds> 指定尝试连接的最大时长

-x/--proxy <proxyhost[:port]> 指定代理服务器地址和端口,端口默认为1080

-T/--upload-file <file> 指定上传文件路径

-o/--output <file> 指定输出文件名称

--retry <num> 指定重试次数

-e/--referer <URL> 指定引用地址

-I/--head 仅返回头部信息,使用HEAD请求

-u/--user <user[:password]>设置服务器的用户和密码

-O:按照服务器上的文件名,自动存在本地

-r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围

-T/--upload-file <file> 上传文件

使用示例

1,抓取页面内容到一个文件中

  [root@xi mytest]# curl -o home.html http://www.baidu.com   --将百度首页内容抓下到home.html中

     [root@xi mytest]#curl -o #2_#1.jpghttp://cgi2.tky.3web.ne.jp/~{A,B}/[001-201].JPG

           由于A/B下的文件名都是001,002...,201,下载下来的文件重名,这样,自定义出来下载下来的文件名,就变成了这样:原来: A/001.JPG —-> 下载后: 001-A.JPG 原来: B/001.JPG ---> 下载后: 001-B.JPG

2,用-O(大写的),后面的url要具体到某个文件,不然抓不下来。还可以用正则来抓取东西

  [root@xi mytest]# curl -O http://www.baidu.com/img/bdlogo.gif

         运行结果如下:

        % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                                                   Dload  Upload   Total   Spent    Left  Speed
       100  1575  100  1575    0     0  14940      0 --:--:-- --:--:-- --:--:-- 1538k

          会在当前执行目录中生成一张bdlogo.gif的图片。

  [root@xi mytest]# curl -O http://XXXXX/screen[1-10].JPG  --下载screen1.jpg~screen10.jpg

3,模拟表单信息,模拟登录,保存cookie信息

  [root@xi mytest]# curl -c ./cookie_c.txt -F log=aaaa -F pwd=******http://www.XXXX.com/wp-login.php

4,模拟表单信息,模拟登录,保存头信息

  [root@xi mytest]# curl -D ./cookie_D.txt -F log=aaaa -F pwd=******http://www.XXXX.com/wp-login.php

  -c(小写)产生的cookie和-D里面的cookie是不一样的。

5,使用cookie文件

  [root@xi mytest]# curl -b ./cookie_c.txt http://www.XXXX.com/wp-admin

6,断点续传,-C(大写)

  [root@xi mytest]# curl -C -O http://www.baidu.com/img/bdlogo.gif

7,传送数据,最好用登录页面测试,因为你传值过去后,curl回抓数据,你可以看到你传值有没有成功

  [root@xi mytest]# curl -d log=aaaa http://www.XXXX.com/wp-login.php

8,显示抓取错误,下面这个例子,很清楚的表明了。

  [root@xi mytest]# curl -fhttp://www.XXXX.com/asdf

  curl: (22) The requested URL returned error: 404

  [root@xi mytest]# curlhttp://www.XXXX.com/asdf

  <HTML><HEAD><TITLE>404,not found</TITLE>

9,伪造来源地址,有的网站会判断,请求来源地址,防止盗链。

  [root@xi mytest]# curl -ehttp://localhosthttp://www.XXXX.com/wp-login.php

10,当我们经常用curl去搞人家东西的时候,人家会把你的IP给屏蔽掉的,这个时候,我们可以用代理

  [root@xi mytest]# curl -x 24.10.28.84:32779 -o home.htmlhttp://www.XXXX.com

11,比较大的东西,我们可以分段下载

  [root@xi mytest]# curl -r 0-100 -o img.part1http://www.XXXX.com/wp-content/uploads/2010/09/compare_varnish.jpg

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

  Dload  Upload   Total   Spent    Left  Speed

  100   101  100   101    0     0    105      0 --:--:-- --:--:-- --:--:--     0

  [root@xi mytest]# curl -r 100-200 -o img.part2http://www.XXXX.com/wp-ontent/uploads/2010/09/compare_varnish.jpg

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

  Dload  Upload   Total   Spent    Left  Speed

  100   101  100   101    0     0     57      0  0:00:01  0:00:01 --:--:--     0

  [root@xi mytest]# curl -r 200- -o img.part3http://www.XXXX.com/wp-content/uploads/2010/09/compare_varnish.jpg

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

  Dload  Upload   Total   Spent    Left  Speed

  100  104k  100  104k    0     0  52793      0  0:00:02  0:00:02 --:--:-- 88961

  [root@xi mytest]# ls |grep part | xargs du -sh

  4.0K    one.part1

  112K    three.part3

  4.0K    two.part2

  用的时候,把他们cat一下就OK,cat img.part* >img.jpg

12,不会显示下载进度信息

  [root@xi mytest]# curl -s -o aaa.jpg http://www.baidu.com/img/bdlogo.gif

13,显示下载进度条

  [root@xi mytest]# curl  -0 http://www.baidu.com/img/bdlogo.gif     (以http1.0协议请求)

####################################################################### 100.0%

14,通过ftp下载文件

  [xifj@Xi ~]$ curl -u用户名:密码 -Ohttp://www.XXXX.com/demo/curtain/bbstudy_files/style.css

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

  Dload  Upload   Total   Spent    Left  Speed

  101  1934  101  1934    0     0   3184      0 --:--:-- --:--:-- --:--:--  7136

  [xifj@Xi ~]$ curl -u 用户名:密码 -O http://www.XXXX.com/demo/curtain/bbstudy_files/style.css

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

  Dload  Upload   Total   Spent    Left  Speed

  101  1934  101  1934    0     0   3184      0 --:--:-- --:--:-- --:--:--  7136

  或者用下面的方式

  [xifj@Xi ~]$ curl -O ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/style.css

  [xifj@Xi ~]$ curl -O ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/style.css

  15,通过ftp上传

  [xifj@Xi ~]$ curl -T test.sql ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/

  [xifj@Xi ~]$ curl -T test.sql ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/

15,模拟浏览器头

  [xifj@Xi ~]$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txthttp://www.www.baidu.com

16,PUT、GET、POST

比如 curl -T localfile http://cgi2.tky.3web.ne.jp/~zz/abc.cgi,这时候,使用的协议是HTTP的PUT method 
刚才说到PUT,自然想起来了其他几种methos--GET和POST。 
http提交一个表单,比较常用的是POST模式和GET模式 
GET模式什么option都不用,只需要把变量写在url里面就可以了
比如:
curl http://www.yahoo.com/login.cgi?user=nick&password=12345 
而POST模式的option则是 -d 
比如,curl -d "user=nick&password=12345" http://www.yahoo.com/login.cgi
就相当于向这个站点发出一次登陆申请~~~~~ 
到底该用GET模式还是POST模式,要看对面服务器的程序设定。 
一点需要注意的是,POST模式下的文件上的文件上传,比如
<form method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zz/up_file.cgi">
<input type=file name=upload>
<input type=submit name=nick value="go">
</form>
这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:
curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zz/up_file.cgi 

我有一个ai助手主程序,现在我需要制作ui部分,我有一个api工具 # api_server.py import threading import time from flask import Flask, request, jsonify from werkzeug.serving import make_server from flask_cors import CORS # pip install flask-cors # 假设这些函数来自你的主程序模块 # from Progress.app import get_ai_assistant, get_task_executor, get_tts_engine, get_voice_recognizer # --- 全局状态共享 --- current_status = { "is_listening": False, "is_tts_playing": False, "current_timeout": 8.0, "last_command_result": None, "timestamp": int(time.time()) } # --- 模拟服务实例(实际项目中应替换为真实对象)--- class MockAssistant: def process_voice_command(self, text): return {"action": "mock_action", "target": text} class MockExecutor: def execute_task_plan(self, plan): return {"success": True, "message": f"已执行 {plan['target']}", "data": {}} class MockTTS: def speak(self, text, async_mode=False): print(f"[TTS] 正在播报: {text}") if not async_mode: time.sleep(1) # 模拟播放延迟 else: def _async_play(): time.sleep(1) threading.Thread(target=_async_play, daemon=True).start() class MockRecognizer: def start_listening(self): global current_status current_status["is_listening"] = True current_status["timestamp"] = int(time.time()) print("🎙️ 开始监听用户语音...") def stop_listening(self): global current_status current_status["is_listening"] = False current_status["timestamp"] = int(time.time()) # 实例化模拟组件(上线时替换为真实导入) assistant = MockAssistant() executor = MockExecutor() tts_engine = MockTTS() recognizer = MockRecognizer() class APIServer: def __init__(self): self.app = Flask(__name__) CORS(self.app) # ✅ 启用跨域支持 self.server = None self.thread = None self.running = False self._add_routes() def _update_status(self, **kwargs): """更新全局状态""" current_status.update(kwargs) current_status["timestamp"] = int(time.time()) def _add_routes(self): """注册所有 API 路由""" # 1. GET /api/health - 健康检查 @self.app.route('/api/health', methods=['GET']) def health(): return jsonify({ "status": "ok", "service": "ai_assistant", "timestamp": int(time.time()) }) # 2. GET /api/status - 查询当前状态 @self.app.route('/api/status', methods=['GET']) def status(): return jsonify({**current_status}) # 3. POST /api/start - 启动助手 @self.app.route('/api/start', methods=['POST']) def start(): # 可以触发一些初始化逻辑 self._update_status(is_listening=True) return jsonify({ "status": "running", "message": "AI 助手已就绪", "features": ["voice", "tts", "file", "app_control"], "timestamp": int(time.time()) }) # 4. POST /api/command - 执行用户指令 @self.app.route('/api/command', methods=['POST']) def handle_command(): try: data = request.get_json() if not data or 'text' not in data: return jsonify({ "success": False, "response_to_user": "未收到有效指令" }), 400 text = data['text'] context = data.get('context', {}) options = data.get('options', {}) should_speak = options.get('should_speak', True) return_plan = options.get('return_plan', False) print(f"📩 收到命令: '{text}' | 上下文: {context}") # 👇 调用 AI 助手核心逻辑(请替换为你的真实模块) # from Progress.app import get_ai_assistant, get_task_executor, get_tts_engine # assistant = get_ai_assistant() # executor = get_task_executor() # tts = get_tts_engine() decision = assistant.process_voice_command(text) result = executor.execute_task_plan(decision) ai_reply = result["message"] if not result["success"] and not ai_reply.startswith("抱歉"): ai_reply = f"抱歉,{ai_reply}" # 更新状态:正在处理 self._update_status( is_processing=True, last_command_result={"success": result["success"], "message": ai_reply, "operation": decision.get("action")} ) # 异步播报 if should_speak: self._update_status(is_tts_playing=True) tts_engine.speak(ai_reply, async_mode=True) # 模拟 TTS 结束后恢复状态 def _finish_tts(): time.sleep(1) self._update_status(is_tts_playing=False) threading.Thread(target=_finish_tts, daemon=True).start() # 构造响应 response_data = { "success": result["success"], "response_to_user": ai_reply, "operation": decision.get("action"), "details": result, "should_speak": should_speak, "timestamp": int(time.time()), } if return_plan: response_data["plan"] = decision self._update_status(is_processing=False) return jsonify(response_data), 200 except Exception as e: print(f"❌ 处理命令失败: {e}") return jsonify({ "success": False, "error": str(e), "timestamp": int(time.time()) }), 500 # 5. POST /api/tts/speak - 主动播报语音 @self.app.route('/api/tts/speak', methods=['POST']) def speak(): try: data = request.get_json() if not data or 'text' not in data: return jsonify({"error": "Missing 'text'"}), 400 text = data['text'] print(f"[TTS] 请求播报: {text}") self._update_status(is_tts_playing=True) tts_engine.speak(text, async_mode=True) def _finish(): time.sleep(1) self._update_status(is_tts_playing=False) threading.Thread(target=_finish, daemon=True).start() return jsonify({ "status": "speaking", "text": text, "timestamp": int(time.time()) }) except Exception as e: return jsonify({"error": str(e)}), 500 # 6. POST /api/wakeup - 远程唤醒 @self.app.route('/api/wakeup', methods=['POST']) def wakeup(): try: data = request.get_json() or {} device = data.get("device", "unknown") location = data.get("location", "unknown") print(f"🔔 远程唤醒信号来自 {device} @ {location}") # 播放提示音(可通过 pygame 或 winsound 实现) print("💡 滴—— 唤醒成功!") # 设置为倾听模式 recognizer.start_listening() self._update_status(is_listening=True) return jsonify({ "status": "ready", "message": "已进入倾听模式", "timestamp": int(time.time()) }) except Exception as e: return jsonify({"error": str(e)}), 500 def start(self, host="127.0.0.1", port=5000, debug=False): """启动 API 服务(非阻塞)""" if self.running: print("⚠️ API 服务器已在运行") return try: self.server = make_server(host, port, self.app) self.running = True def run_flask(): print(f"🌐 AI 助手 API 已启动 → http://{host}:{port}/api") self.server.serve_forever() self.thread = threading.Thread(target=run_flask, daemon=True) self.thread.start() except Exception as e: print(f"❌ 启动 API 服务失败: {e}") raise def stop(self): """关闭 API 服务""" if not self.running: return print("🛑 正在关闭 API 服务...") try: self.server.shutdown() except: pass finally: self.running = False if self.thread: self.thread.join(timeout=3) if self.thread.is_alive(): print("⚠️ API 服务线程未能及时退出") print("✅ API 服务已关闭") # ----------------------------- # 使用示例 # ----------------------------- if __name__ == '__main__': api = APIServer() api.start() try: while True: time.sleep(1) except KeyboardInterrupt: api.stop() 和一个api文档 # 🌐 AI 助手 API 接口文档 服务地址: http://127.0.0.1:5000/api 协议: HTTP/HTTPS 编码: UTF-8 内容类型: application/json 跨域支持: ✅ 已启用 CORS # 🔑 认证方式(可选)暂时不加密钥 目前为本地服务,默认信任内网调用。 如需安全增强,请添加: http X-API-Key: your-secret-token 或使用 HTTPS + IP 白名单。 # 📚 接口列表 路径 方法 功能 /health GET 健康检查 /status GET 获取当前运行状态 /start POST 启动或唤醒助手 /command POST 发送自然语言指令 /tts/speak POST 主动播放语音 /wakeup POST 远程唤醒信号 1. GET /api/health - 健康检查 💡 描述 检查后端服务是否正常运行。 请求示例 http GET /api/health 成功响应 { "status": "ok", "service": "ai_assistant", "timestamp": 1719876543 } 字段 类型 说明 status string 固定为 "ok" 表示存活 service string 服务名称 timestamp number 当前时间戳 ✅ 用途:Flutter App 启动时探测服务是否存在。 2. GET /api/status - 查询当前状态 💡 描述 获取语音识别器和 TTS 的实时状态。 请求示例 http GET /api/status 成功响应 { "is_listening": true, "is_tts_playing": false, "current_timeout": 8, "last_command_result": { "success": true, "message": "正在播放音乐", "operation": "play_music" }, "timestamp": 1719876543 } 字段 类型 说明 is_listening boolean 是否正在监听麦克风 is_tts_playing boolean 是否正在播报语音 current_timeout float 下一次监听超时时间(秒) last_command_result object 上一条命令执行结果 timestamp number 时间戳 📌 用途: 控制前端 UI 显示“AI 正在说话” 防止冲突收音 3. POST /api/start - 启动助手 💡 描述 用于前端点击“启动”按钮时触发。如果服务已运行则返回状态。 ⚠️ 注意:不能真正“启动一个进程”,但可以确认服务就绪。 请求示例 http POST /api/start Content-Type: application/json json {} 成功响应 { "status": "running", "message": "AI 助手已就绪", "features": ["voice", "tts", "file", "app_control"], "timestamp": 1719876543 } 字段 类型 说明 status string "running" message string 提示信息 features array 支持的功能列表 timestamp number 当前时间戳 4. POST /api/command - 执行用户指令(核心接口) 💡 描述 发送一条自然语言命令,走完整 AI 决策 → 执行 → 播报流程。 请求参数 { "text": "打开记事本", "context": { "user_id": "U123", "device": "phone", "location": "bedroom" }, "options": { "should_speak": true, "return_plan": false } } 参数 类型 必填 说明 text string ✅ 用户输入的自然语言文本 context object ❌ 上下文信息(可用于日志追踪) options.should_speak boolean ❌ 是否让 TTS 播报结果(默认 true) options.return_plan boolean ❌ 是否返回详细的执行计划(调试用) 成功响应 { "success": true, "response_to_user": "已为您打开记事本", "operation": "open_app", "details": { "app_name": "notepad" }, "should_speak": true, "plan": { ... }, // 仅当 return_plan=true 时存在 "timestamp": 1719876543 } 字段 类型 说明 success boolean 执行是否成功 response_to_user string 要对用户说的话 operation string 主要操作类型(如 open_app) details object 操作详情 should_speak boolean 是否应播报语音 plan object 完整任务计划(仅当开启时返回) timestamp number 时间戳 错误响应(400 Bad Request) { "success": false, "response_to_user": "未收到有效指令" } 5. POST /api/tts/speak - 主动播报语音 💡 描述 不经过 AI 决策,直接让助手说出一句话。 请求示例 http POST /api/tts/speak Content-Type: application/json json { "text": "您的会议将在五分钟后开始" } 成功响应 { "status": "speaking", "text": "您的会议将在五分钟后开始", "timestamp": 1719876543 } 字段 类型 说明 status string "speaking" text string 正在播报的内容 timestamp number 时间戳 📌 用途:通知、提醒、异常报警等场景。 6. POST /api/wakeup - 远程唤醒 💡 描述 当手机检测到“小智小智”唤醒词后,发送此请求通知电脑准备接收指令。 请求示例 http POST /api/wakeup Content-Type: application/json 设备位置 { "device": "phone", "location": "living_room" } 成功响应 { "status": "ready", "message": "已进入倾听模式", "timestamp": 1719876543 } 后端行为 设置 recognizer.is_listening = True 可播放提示音“滴”一声表示唤醒成功 📌 注意:建议配合 /api/command 使用,唤醒后再发命令。 🧪 测试建议(使用 curl) # 检查健康 curl http://127.0.0.1:5000/api/health # 唤醒 curl -X POST http://127.0.0.1:5000/api/wakeup # 发送命令 curl -X POST http://127.0.0.1:5000/api/command \ -H "Content-Type: application/json" \ -d '{"text": "打开浏览器"}' # 播报语音 curl -X POST http://127.0.0.1:5000/api/tts/speak \ -H "Content-Type: application/json" \ -d '{"text": "你好,我是你的语音助手"}' ✅ 最佳实践建议 项目 建议 🔐 安全性 生产环境加 Token 或 HTTPS 📦 打包部署 使用 PyInstaller 打包成 .exe 并设置开机自启 🔄 状态同步 前端轮询 /api/status 判断是否可交互 📈 日志记录 记录所有 /api/command 调用用于调试 🧭 唤醒策略 手机端做离线唤醒词检测,再发 /api/wakeup 帮我选择GUI框架,并给我所有代码
最新发布
10-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值