当前位置:去回答>百科问答>curl是什么?

curl是什么?

2024-11-10 23:07:31 编辑:join 浏览量:614

curl是什么?

就是模拟数据传输的一个库

可以抓取网页内容

也可传输内容给网页

最近有空,去php中文社区看了一下,首页就有关于curl的,感觉写的还不错,来一小段,

在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑 ...

来源:segmentfault 时间:2016-8-10 09:21 阅读数:2839 作者:StinsonZhao

摘要:七夕啦,作为开发,妹子没得撩就“撩”下服务器吧,妹子有得撩的同学那就左拥妹子右抱服务器吧,况且妹子是要礼物的,服务器又不用。好啦,长话短说再长说,祭出今天的工具——CURL(Client URL Library),当然今天以 ...

0. curl是个什么东西

PHP supports libcurl, a library created by Daniel Stenberg, that allows you to connect and communicate to many different types of servers with many different types of protocols. libcurl currently supports the http, https, ftp, gopher, telnet, dict, file, and ldap protocols. libcurl also supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading (this can also be done with PHP's ftp extension), HTTP form based upload, proxies, cookies, and user+password authentication.

这是PHP对于curl的一个解释,简单地说就是,curl是一个库,能让你通过URL和许多不同种的服务器进行勾搭、搭讪和深入交流,并且还支持许多协议。并且人家还说了curl可以支持https认证、http post、ftp上传、代理、cookies、简单口令认证等等功能啦。

说了那么多其实没什么感觉吧,在应用中才有感觉,我起初也是需要在服务器端向另一个服务器发起一个POST请求才开始接触curl的,然后才有了感觉。

在正式讲怎么用之前啊,先提一句,你得先在你的PHP环境中安装和启用curl模块,具体方式我就不讲了,不同系统不同安装方式,可以google查一下,或者查阅PHP官方的文档,还挺简单的。

1. 拿来先试试手

工具到手,先要把玩,试试顺不顺手,不然一拿来就用,把你自己的代码搞得乌烟瘴气还怎么去撩服务器呢?

比如我们以著名的“测试网络是否连接”的网站——百度为例,来尝试下curl

当你在本地环境浏览器打开这个php文件时,页面出现的是百度的首页,特么我刚才输入的“localhost”呢?

上面的代码和注释已经充分说明了这段代码在干啥。

$ch = curl_init(),创建了一个curl会话资源,成功返回一个句柄;

curl_setopt($ch, CURLOPT_URL, " http:// baidu.com "),设置URL,不用说;

连接地址

php中的cURL是一个可以让你发送http请求的库,当然不只限于http协议。http请求本来就可以“发送数据”和“接收数据”, 更多内容还是去学习下php的文档吧。都是中文的 PHP: cURL - Manual

有时候经常会需要在本地模拟接口访问,有时候会使用GET,但是有时候会使用POST。这时候就会想到一个简便的工具:curl

curl格式:curl -H 请求头 -d 请求体 -X POST 接口地址

以下列举几种工作中比较常用的curl命令方法:

1、application/x-www-form-urlencoded

最常见的一种 POST 请求,用 curl 发起这种请求也很简单。

-H 表示指定内容发送

2、application/json

跟发起 application/x-www-form-urlencoded 类型的 POST 请求类似,-d 参数值是 JSON 字符串,并且多了一个 Content-Type: application/json 指定发送内容的格式。

3、multipart/form-data

这种请求一般涉及到文件上传。后端对这种类型请求的处理也复杂一些。

4、把文件内容作为要提交的数据

如果要提交的数据不像前面例子中只有一个 name: allenjol 键值对,数据比较多,都写在命令行里很不方便,也容易出错,那么可以把数据内容先写到文件里,通过 -d @filename 的方式来提交数据。这是 -d 参数的一种使用方式,所以前面用到 -d 参数的地方都可以这样用。

实际上就是把 -d 参数值写在命令行里,变成了写在文件里。跟 multipart/form-data 中上传文件的 POST 方式不是一回事。@ 符号表明后面跟的是文件名,要读取这个文件的内容作为 -d 的参数。

例如,有一个 JSON 文件 data.json 内容如下:

就可以通过以下命令来提交数据。

5、curl使用GET请求的时候带上用户名密码鉴权:

这个是访问nacos的例子。如果说不带上-u参数则会出现403 forbidden,因为权限被拒绝访问

假设目标url 为:127.0.0.1:8080/login

使用curl发送GET请求格式:

带用户名密码参数的访问:

使用curl发送POST请求格式:

公众号:运维开发故事

github: https:// github.com/orgs/sunshar ing-note/dashboard

爱生活,爱运维

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈。您的支持和鼓励是我最大的动力。喜欢就请关注我吧~

前段时间群里讨论,想实现某个文件定时上传到服务器要怎么来实现。我记得之前做过 一个项目: 为高通的iot模组编写FOTA功能 :实现模组可以远程下载升级镜像包,实现版本升级功能。并当时使用的一个超级强大的工具cURL。心血来潮,决定专门写一篇文章,送给需要的朋友。

文章分两部分

cURL 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。

cURL 的原作者是 Daniel Stenberg (目前是 cURL 的核心开发者),同时也是 IETF HTTPbis 工作组的资深成员。Daniel 在 1998 年创建了 curl 项目,他编写了最初的 curl 版本,并创建了 libcurl 库。到目前为止,代码仓库包括的 24000 次 commit 有超过一半是 Daniel 本人提交的,他依然是项目的核心开发者。Daniel 表示已将 curl 视为自己的孩子。

作为一款强力工具,支持的协议包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),还支持POST、cookies、认证、从指定偏移处下载部分文件等功能,具有用户代理字符串、限速、文件大小、进度条、cookie支持、用户认证、断点续传等特征。

URL的格式定义要参考 RFC 1808 。

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。 也可认为由4部分组成: 协议、主机、端口、路径 URL的一般语法格式为:

(带方括号[]的为可选项)。

指定使用的传输协议,下表列出 protocol 属性的有效方案名称。 最常用的是HTTP协议,它也是WWW中应用最广的协议。

是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。

整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL中就不能省略端口号这一项。

由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

这是用于指定特殊参数的可选项。

可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ http:// ASP.NET 等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。

由于linux curl功能十分强大,所以命令参数十分多,下表只筛选出来部分常用的参数,更多参数请运行“man curl”命令查看。

ble d ata-draft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">

下面是linux curl命令的错误代码和她们的相应的错误消息,命令执行错误的时候可以通过错误码来查看出错原因,方便开发调试。

ble da ta-d raft-node="block" data-draft-type="table" data-size="normal" data-row-style="normal">

为节省篇幅,部分操作不再贴上执行结果。

直接在curl命令后加上网址,就可以看到网页源码。我们以网址 http://www. sina.com 为例(选择该网址,主要因为它的网页代码较短):

执行结果显示 307 Temporary Redirect ,说明该网址需要重定向。

如果要把这个网页保存下来,可以使用 -o 参数,这就相当于使用wget命令了。

有的网址是自动跳转的。使用 -L 参数,curl就会跳转到新的网址。

键入上面的命令,结果就自动跳转为 http://www. sohu.com.cn 。

-i 参数可以显示http response的头信息,连同网页代码一起。

-I 参数则是只显示http response的头信息。

-v 参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。

如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。

或者

运行后,请打开output.txt文件查看。

发送表单信息有GET和POST两种方法。GET方法相对简单,只要把数据附在网址后面就行。

POST方法必须把数据和网址分开,curl就要用到--data参数。

如果你的数据没有经过表单编码,还可以让curl为你编码,参数是 --data-urlencode 。

curl默认的HTTP动词是GET,使用 -X 参数可以支持其他动词。

假定文件上传的表单是下面这样:

你可以用curl这样上传文件:

有时你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。

这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。

iPhone4的User Agent是

curl可以这样模拟:

使用 --cookie 参数,可以让curl发送cookie。

至于具体的cookie的值,可以从http response头信息的 Set-Cookie 字段中得到。

-c cookie-file 可以保存服务器返回的cookie到文件, -b cookie-file 可以使用这个文件作为cookie信息,进行后续的请求。

有时需要在http request之中,自行增加一个头信息。 --header 参数就可以起到这个作用。

使用curl选项 -u 可以完成HTTP或者FTP的认证,可以指定密码,也可以不指定密码在后续操作中输入密码:

例如:在IP地址192.168.43.117上搭建FTP服务器,并设置用户名为 user ,密码为 123456 现在我们要显示服务器上根目录下的所有文件信息,命令如下:

执行结果如下:

简洁写法:

执行结果如下:

格式

示例如下: 从服务器的根目录下下载文件test.c,保存到本地,本地文件名也为test.c。 如果没有-o选项,程序会吧数据流定向到stdout,即直接把文件内容显示到终端上。

执行结果如下:

简洁模式

执行结果如下:

举例如下:

可以看到文件并没有上传成功,返回错误码是25,参考第五章

可知,是因为服务器没有赋予存储的权限,所以设置服务器的write权限即可。

首先记录当前log文件时间,并记录到全局变量 last_mtime 中。

读取文件最后修改时间,并和 last_mtime 进行比较,如果相同就返回0,不同就返回1.

将当前的日志文件拷贝成备份文件,备份文件名字加上当前时间。

得到对应文件的属性信息,存放到struct stat结构体变量中。

执行参数中字符串对应的命令

第一步:

因为log文件没有被修改过,所以程序不会上传。

第二步: 手动输入字符串 yikoulinux 到日志文件 t.log中。

第三步: 因为文件发生了改变,所以打印“file updated”,同时可以看到curl上传文件的log信息。

以下是FTP服务器的根目录,可以看到,上传的日志文件: t-2020-7-26-1-19-45.log 。

想和博主交流,请关注公众号「一口Linux」

标签:curl

版权声明:文章由 去回答 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.quhuida.com/answer/340271.html
热门文章