ZigZagK的博客
机房大佬语录API | PHP编写API入门
2019年8月6日 11:46
PHP
查看标签

2020.2.24UPD:之前这篇文章是一篇毫无意义的水文……现在重新写过了,记录了一点PHP编写API的入门知识。

机房大佬语录:“


为了学习一下PHP编写API,顺便练个手,就写了个类似一言的机房大佬语录,记录一下机房大佬们的神仙发言(并且可以看学弟们互相撕B)

网上有EolinkerPhalapi等框架可以使用,不过为了更多的自由,我在2020.2.24左右自己重新写了机房大佬语录API,这篇文章也是对于纯手写的一些入门,主要为个人记录,如果有错误欢迎在评论里指出 我的滑稽会冒汗

该文章还有一些不会提到的前·前置知识(与API开发间接相关,如PHP连接数据库和SQL),不知道的话可以百度一下 (因为很多东西我也只是懂个皮毛,咕咕咕)。

1.一些前置知识

PHP header

关于header()的详细介绍可以看菜鸟教程,这里说两个常用的:

  1. header('Location:'.$url);跳转到$url这个地址。
  2. 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(大雾)。

PHP cURL

可以用来发起getpost等请求,写简单的API不需要详细了解(其实就是我不懂),有这两个函数geturlposturl就行了。

点击展开代码

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 $_GET

如果注意观察,会发现有些PHP网址后面加了些奇怪的东西:

https://api.zigzagk.top/dictumapi/index.php?type=dictum&encode=js

在访问这个PHP的时候,会将?后面的type=dictum&encode=js作为$_GET数组传入PHP中,比如上面这个网址就可以通过$_GET['type']$_GET['encode']获取传入的参数dictumjs

PHP $_POST

$_POST也是传入数据的方法,但是和$_GET不同,它不是通过网址传入的,而是通过form提交表单,ajaxpost请求,cURLpost请求等方式传入的。

比如通过上面的posturl($url,$data)访问$url,被访问的PHP的$_POST就包含了$data

post方法传入的数据是不可见的,所以账号密码用post传输更好一些。

2.编写API

其实有了前置知识,剩下的就是自己发挥了,下面用一个登陆的API举例(未经测试,可认为是伪代码)。

后端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'))); //登陆成功
}

前端PHP

在前端写一个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>

然后根据SessionCookie判断是否登陆成功就行了。

版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!
请不要发毫无意义或内容不文明的评论。与本文无关评论请发留言板!
Node Sans
2020-10-16 23:09:18Node Sans
2020-10-16 23:09:18

2020年前来考古

访客
2019-10-07 19:41:35SkyWT
2019-10-07 19:41:35

dalao,话说您知道怎么限制单 IP 单位时间内 API 的请求次数吗……网上搜索好像都要用 Redis……

访客
冷曜
2020-03-20 21:34:39冷曜
2020-03-20 21:34:39
@SkyWT 

本来写了点东西,看到你的博文已经写的很细致了 😂

访客
2019-10-07 22:17:01ZigZagK
2019-10-07 22:17:01
@SkyWT 

其实我只是随便弄了个玩,限流什么的完全不懂

博主
可耐的菊花茶
2019-09-11 21:21:28可耐的菊花茶
2019-09-11 21:21:28

日记没法评论,差评qwq

访客
2019-09-12 22:39:57ZigZagK
2019-09-12 22:39:57
@可耐的菊花茶 

下个版本可能会加上

博主
2019-09-08 23:13:20初夏阳光
2019-09-08 23:13:20

迷之评论233...

来都来了,我就提前祝 Zig'zagk dalao 中秋快乐吧

访客
2019-09-12 22:41:24ZigZagK
2019-09-12 22:41:24
@初夏阳光 

中秋节快乐QwQ
(然而我校还没放假 )

博主
2019-08-30 17:14:16ohmyga
2019-08-30 17:14:16

无奈.jpg 机房语录海星

访客
2019-08-16 10:42:46初夏阳光
2019-08-16 10:42:46

妈耶,做你的校友可真不容易,说句话都记红宝书
向大佬低头

访客
2019-08-16 10:46:13ZigZagK
2019-08-16 10:46:13
@初夏阳光 

信息竞赛界互膜泛滥2333

博主
2019-08-16 11:10:49初夏阳光
2019-08-16 11:10:49
@ZigZagK 

商业互吹还行。 滑天下之大稽 添加评论拦截关键词:“大佬”

访客