php 请求一个函数,3分钟短文 | 有挑战!PHP用1个函数实现post请求,你用哪个?...

本文介绍了如何利用file_get_contents()函数实现POST请求,包括构造请求参数、设置流上下文以及处理https和基本认证场景。通过实例演示了如何定制请求头和超时,让读者深入了解此函数的多功能应用。
摘要由CSDN通过智能技术生成

引言

前天的文章,我们说到了如何高效的下载网络资源,对于小体积的文件。可以便捷的使用file_put_contents()进行请求。与之配对的函数file_get_contents()则是读取资源。

957b6ef87537b735114b339bcd4ed211.png

今天我们讨论一下,有没有一种可能,使用一个函数,就可以给服务器发送post请求的数据呢?

学习时间

上一段中我们已经提示了,有一个函数可以用于读取网络资源,也就是间接的发起网络请求。默认file_get_contents()是使用 GET 请求,如果是POST请求按道理也应该做的来。不过要怎么写呢?

file_get_contents()函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。

其参数形式如下:

string file_get_contents( string $filename[, bool $use_include_path = false[, resource $context[, int $offset = -1[, int $maxlen]]]] )

复杂的功能,我们需要组装后面的参数即可。我们需要使用流操作的上下文 context,传入该函数。

首先构造请求的参数,也就是键值对,这里需要使用 & 进行多参数连接:

$postdata = http_build_query(

array(

'name' => 'joe',

'age' => '13'

)

);

接着构造请求结构体:

$opts = array('http' =>

array(

'method' => 'POST',

'header' => 'Content-Type: application/x-www-form-urlencoded',

'content' => $postdata

)

);

最重要的一步,创建基于流的上下文,使用

$context = stream_context_create($opts);

写到这里就“万事俱备只欠东风”了。我们隆重地清楚主旨函数处理这些参数:

$result = file_get_contents('http://example.com/submit.php', false, $context);

之后结果,或者错误内容,就会输出到 $result 对象。使用 false 判断,或者使用已知的接口返回数据类型,进一步处理。

深度定制

上一节的内容并没有考虑网络超时,接口授权,等等情形。本节我们说一个复杂度高一些的,要求处理一个https请求,并配置了 basic auth 的 url,并使用 post 上传数据。

首先还是裁剪请求体:

$opts = array('http' =>

array(

'method' => 'POST',

'header' => "Content-Type: text/xml\r\n.Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",

'content' => $body,

'timeout' => 60

)

);

注意我们在请求上添加了 header,这是根据目标 url 的要求添加的。$body 就是上一节中的 $postdata 结构类型。

接着创建流上下文:

$context = stream_context_create($opts);

最后调用函数:

$url = 'https://'.$https_server;

$result = file_get_contents($url, false, $context, -1, 40000);

写在最后

通过上面两个细节的函数处理,大家是不是对file_get_contents()有了更加深入的看法,原来这家伙还可以这么用,真是开了眼界!

Happy coding :_)

我是@程序员小助手,持续分享编程知识,欢迎关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值