2020.2.24UPD:之前这篇文章是一篇毫无意义的水文……现在重新写过了,记录了一点PHP编写API的入门知识。
机房大佬语录:“”
为了学习一下PHP编写API,顺便练个手,就写了个类似一言的机房大佬语录,记录一下机房大佬们的神仙发言(并且可以看学弟们互相撕B)。
网上有Eolinker和Phalapi等框架可以使用,不过为了更多的自由,我在2020.2.24左右自己重新写了机房大佬语录API,这篇文章也是对于纯手写的一些入门,主要为个人记录,如果有错误欢迎在评论里指出 。
该文章还有一些不会提到的前·前置知识(与API开发间接相关,如PHP连接数据库和SQL),不知道的话可以百度一下 (因为很多东西我也只是懂个皮毛,咕咕咕)。
关于header()
的详细介绍可以看菜鸟教程,这里说两个常用的:
header('Location:'.$url);
跳转到$url
这个地址。header('Content-type:'.$type);
指定PHP返回的类型$type
,比如Content-Type:application/json
表示接下来返回的类型是json
,一般API返回的数据都使用json
。资料:Content-type
的对照表。
那么你可以在index.php
中这么写:
<?php
header('Location:https://zigzagk.top');
这样你就得到了一个自动跳转到https://zigzagk.top
的API(大雾)。
可以用来发起get
和post
等请求,写简单的API不需要详细了解(其实就是我不懂),有这两个函数geturl
和posturl
就行了。
function geturl($url){ //获取$url这个链接返回的json数据
$headerArray=array("Content-type:application/json;","Accept:application/json");
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($url,CURLOPT_HTTPHEADER,$headerArray);
$output=curl_exec($ch);
curl_close($ch);
$output=json_decode($output,true);
return $output;
}
function posturl($url,$data){ //将数组$data传给$url,然后返回得到的json数据
$headerArray=array("Accept:application/json");
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl,CURLOPT_POST,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$data); //传入数组$data
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$output=curl_exec($curl);
curl_close($curl);
return json_decode($output,true);
}
可以对上面的两个模板进行魔改满足不同需求。
如果注意观察,会发现有些PHP网址后面加了些奇怪的东西:
https://api.zigzagk.top/dictumapi/index.php?type=dictum&encode=js
在访问这个PHP的时候,会将?
后面的type=dictum&encode=js
作为$_GET
数组传入PHP中,比如上面这个网址就可以通过$_GET['type']
和$_GET['encode']
获取传入的参数dictum
和js
。
$_POST
也是传入数据的方法,但是和$_GET
不同,它不是通过网址传入的,而是通过form
提交表单,ajax
的post
请求,cURL
的post
请求等方式传入的。
比如通过上面的posturl($url,$data)
访问$url
,被访问的PHP的$_POST
就包含了$data
。
post
方法传入的数据是不可见的,所以账号密码用post
传输更好一些。
其实有了前置知识,剩下的就是自己发挥了,下面用一个登陆的API举例(未经测试,可认为是伪代码)。
创建一个api.php
,写入:
<?php
try {$db=new PDO(dbtype.':host='.server.';dbname='.dbname.';',username,password);}
catch(PDOException $error) {die($error->getMessage());}
//连接到数据库
$gets=$_GET;$posts=$_POST;
if ($gets['type']=='login'){ //如果操作类型是登陆
$username=$posts['username'];$password=$posts['password'];
//从$_POST中获取传入的数据
$sql=$db->prepare("SELECT * FROM usertable WHERE username=?");
$sql->execute(array($username));$user=$sql->fetch();
//从usertable表获取用户名为$username的数据$user
if (empty($user) || $user['password']!=$password){
header('Content-type:application/json'); //返回json
die(json_encode(array('status'=>'Access Denied!')));
} //无用户或密码错误,登陆失败
header('Content-type:application/json');
die(json_encode(array('status'=>'Success'))); //登陆成功
}
在前端写一个login.php
用于接收网页表单和api.php
的数据:
<?php
$data=array('username'=>$_POST['username'],'password'=>$_POST['password']);
//接收从表单post的数据,再post到api.php
$status=posturl('API路径/api.php/?type=login',$data); //?type=login传入操作类型
if ($status['status']=='Success') ...; //记录Session和Cookie
header('Location: ./'); //跳转回主页面
网页里需要写一个提交表单<form>
:
<form action="login.php" method="post">
<!-- action为提交链接;method为提交方法(采用post) -->
用户名:<input type="text" name="username" />
<!-- name="username"在传入时为$_POST['username'],下同 -->
密码:<input type="password" name="password" />
<button type="submit">登录</button>
</form>
然后根据Session
和Cookie
判断是否登陆成功就行了。
有初中竞赛机房内味儿了hhh可惜后来退了
2020年前来考古
dalao,话说您知道怎么限制单 IP 单位时间内 API 的请求次数吗……网上搜索好像都要用 Redis……
@SkyWT
本来写了点东西,看到你的博文已经写的很细致了 😂
@SkyWT
其实我只是随便弄了个玩,限流什么的完全不懂
日记没法评论,差评qwq
@可耐的菊花茶
下个版本可能会加上
迷之评论233...
来都来了,我就提前祝 Zig'zagk dalao 中秋快乐吧
@初夏阳光
中秋节快乐QwQ
(然而我校还没放假 )
机房语录海星
妈耶,做你的校友可真不容易,说句话都记红宝书
@初夏阳光
信息竞赛界互膜泛滥2333
@ZigZagK
商业互吹还行。 添加评论拦截关键词:“大佬”