tp5restful API的搭建(1)

gongzhiyang 3月前 540

最近开了一下thinkphp5,发现restful API没有做详细的介绍。于是就想搭建一个。言归正传,首先要看一下tp5手册,之后再来看一下,比较好一些。

一. 测试工具用的google扩展测试工具
在这里插入图片描述

二、项目

  1. 在application下创建一个api目录,api下创建两大目录如下
    在这里插入图片描述

2.我们在v1下创建news.php 控制器。代码如下:

<?php
namespace app\api\controller\v1;

use think\Controller;
use app\api\common\model\VendorNews;
use think\facade\Request;

/**
 * Created by News.php
 * User: gongzhiyang
 * Date: 18/12/18
 * Time: 4:36 下午
 */
class News extends Controller
{



	//获取列表  http://tp5.gzy/v1/News
	public function index()
	{
		$model = new VendorNews;
		$data = $model->getNewsList();// 查询数据
		if ($data) {
			$code = 200;
		} else {
			$code = 404;
		}
		$data = [
			'code' => $code,
			'data' => $data
		];
		return json($data);

	}

	//获取详情 http://tp5.gzy/v1/News/3
	public function view($id)
	{
		//$id = input('id');
		//echo "$id";
//		$id = input('id');
		$model = new VendorNews;
		//$data = $model::getNews($id);

		$data = $model->getNews($id);// 查询数据
		if ($data) {
			$code = 200;
		} else {
			$code = 404;
		}
		$data = [
			'code' => $code,
			'data' => $data
		];
		return json($data);
	}

	//创建 http://tp5.gzy/v1/News
	public function create()
	{

		$model = new VendorNews;
		//$data = $model::getNews($id);
		$postData = Request::post();
		//var_dump() $postData;

		$data = $model->getCreate($postData);// 查询数据
		if ($data) {
			$code = 201;
		} else {
			$code = 404;
		}
		$data = [
			'code' => $code,
			//'data' => $data
		];

		return json($data);
	}

	//更新 http://tp5.gzy/v1/News/25
	public function update($id)
	{
		if(!$id){

			json(["code"=>5001,"message"=>"没有获取到id"]);
		}

		$model = new VendorNews;
		//$data = $model::getNews($id);
		$postData = Request::param();
		//var_dump() $postData;

		$data = $model->getUpdate($postData,$id);// 查询数据
		if ($data) {
			$code = 201;
		} else {
			$code = 404;
		}
		$data = [
			'code' => $code,
			//'data' => $data
		];

		return json($id);
	}

	//删除 http://tp5.gzy/v1/News/25

	public function delete($id)
	{
		if(!$id){

			json(["code"=>5001,"message"=>"没有获取到id"]);
		}

		$model = new VendorNews;
		//$data = $model::getNews($id);
		$postData = Request::delete();
		//var_dump() $postData;

		$data = $model->getDelete($postData,$id);// 查询数据
		if ($data) {
			$code = 204;
		} else {
			$code = 404;
		}
		$data = [
			'code' => $code,
			//'data' => $data
		];

		return json($data);
	}




}

3.我们在model下创建VendorNews.php

<?php

 namespace app\api\common\model;

use think\Model;
use think\Db;
/**
 * Created by News.php.
 * User: gongzhiyang
 * Date: 18/12/18
 * Time: 4:38 下午
 */
class VendorNews extends Model
{
	//protected
   //不能写get方法,框架内部定义了get方法,本人一开始就在这里写了get方法
	//导致一直报 xxxx News::get() non static method in class xxx
	public function getNews($id = 1)
	{
		$res = Db::name('vendor_news')->where('news_id', $id)->select();
		 //echo $this->getLastSql();
		//$res='======';
		return $res;
	}

	public function getNewsList()
	{
		$res = Db::name('vendor_news')->select();
		// echo url('picture');
		return $res;
	}

	public function getCreate($postData)
	{
		//var_dump(json_decode($postData));exit;
		$data = [
			"news_title"  => $postData["news_title"],
			"news_author" => $postData["news_author"],
			"news_time"   => time(),
		];

		$res = Db::name('vendor_news')->insert($data);
		//echo $this->getLastSql();
		// echo url('picture');
		return $res;
	}


	public function getUpdate($postData,$id){

		$data = [
			"news_title"  => $postData["news_title"],
			"news_author" => $postData["news_author"],
		];

		$res = Db::name('vendor_news')->where('news_id',$id )->update($data);;
		//echo $this->getLastSql();
		// echo url('picture');
		return $res;

	}

	public function getDelete($postData=[],$id){


		$res = Db::name('vendor_news')->where('news_id',$id )->delete(["news_id"=>$id]);
		//echo $this->getLastSql();
		// echo url('picture');
		return $res;

	}


}
  1. 这时候控制层和model层已经建好,最重要的是路由规则。我们在更目录route下进行配置
    在这里插入图片描述
Route::get('think', function () {
    return 'hello,ThinkPHP5!';
});

Route::get('hello/:name', function ($name) {
    return $name ;
});

Route::get('hello/:name', 'index/hello');
//获取某一个活动
Route::get(':version/News/:id', 'api/:version.News/view')
    ->header('Access-Control-Allow-Origin','*')
    ->header('Access-Control-Allow-Credentials', 'true')
    ->allowCrossDomain(true);
//获取列表
Route::get(':version/News', 'api/:version.News/index');
//创建数据
Route::post(':version/News', 'api/:version.News/create');
//更新数据
Route::put(':version/News/:id', 'api/:version.News/update');//全部更新
Route::PATCH(':version/News/:id', 'api/:version.News/update');//更新个别字段
//删除
Route::delete(':version/News/:id', 'api/:version.News/delete');
//Route::options(':version/News', 'api/:version.News');

这样的话更新、创建、删除、列表、详情 基本就可以实现了如果涉及到跨域。

跨域请求一般会发送一条OPTIONS的请求,一旦设置了跨域请求的话,不需要自己定义OPTIONS请求的路由,系统会自动加上。

如果还不明白,可以参考一下资料。
1.tp5 手册
https://www.kancloud.cn/manual/thinkphp5_1/353960

最新回复 (0)
    • 都市菜鸟网
      2
        立即登录 立即注册 
返回
发新帖