使用TP5创建一个REST API
Posted wcu1117
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用TP5创建一个REST API相关的知识,希望对你有一定的参考价值。
原文在这里 : http://hmw.iteye.com/blog/1190827
tp自带的api,get请求接口
/** * 显示资源列表 * * @return \think\Response */ public function index(Request $request) { // $request_method = strtolower($_SERVER[‘REQUEST_METHOD‘]); // $return_onj = new RestRequest(); // $data = db(‘ShopGoods‘)->select(); $data = RestUtils::processRequest(); $method = $data->getMethod(); // print_r($method); switch($method){ case ‘get‘: $user_list = db(‘ShopGoods‘)->limit(2)->select(); // print_r($user_list); if($data->getHttpAccept() == ‘json‘){ RestUtils::sendResponse(200, json_encode($user_list), ‘application/json‘); }else if ($data->getHttpAccept() == ‘xml‘) { // using the XML_SERIALIZER Pear Package $options = array ( ‘indent‘ => ‘ ‘, ‘addDecl‘ => false, // ‘rootName‘ => $fc->getAction(), XML_SERIALIZER_OPTION_RETURN_RESULT => true ); $serializer = new XML_Serializer($options); RestUtils::sendResponse(200, $serializer->serialize($user_list), ‘application/xml‘); } break; case ‘post‘: $user = new User(); $user->setFirstName($data->getData()->first_name); // just for example, this should be done cleaner // and so on... $user->save(); break; // etc, etc, etc... } }
2、 实现接口请求处理和请求处理的方法‘’
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/6/26 * Time: 10:18 */ namespace app\api\controller; use app\api\controller\RestRequest; //简单的class来存储request的一些信息(RestRequest),和一个提供几个静态方法的class来处理请求和响应 class RestUtils { //根据请求的内容类型来处理JSON或者XML,但是让我们现在简单一点。那么,我们处理请求的方法将会类似于这样 public static function processRequest(){ // get our verb 获取动作 $request_method = strtolower($_SERVER[‘REQUEST_METHOD‘]); $return_obj = new RestRequest(); // we‘ll store our data here 在这里存储请求数据 $data = array(); switch ($request_method){ // gets are easy... case ‘get‘: $data = $_GET; break; // so are posts case ‘post‘: $data = $_POST; break; // here‘s the tricky bit... case ‘put‘: // basically, we read a string from PHP‘s special input location, // and then parse it out into an array via parse_str... per the PHP docs: // Parses str as if it were the query string passed via a URL and sets // variables in the current scope. parse_str(file_get_contents(‘php://input‘), $put_vars); $data = $put_vars; break; case ‘delete‘: break; } // store the method $return_obj->setMethod($request_method); // set the raw data, so we can access it if needed (there may be // other pieces to your requests) $return_obj->setRequestVars($data); if(isset($data[‘data‘])){ // translate the JSON to an Object for use however you want $return_obj->setData(json_decode($data[‘data‘])); } return $return_obj; } public static function sendResponse($status = 200, $body = ‘‘, $content_type = ‘text/html‘){ $status_header = ‘HTTP/1.1 ‘ . $status . ‘ ‘ . RestUtils::getStatusCodeMessage($status); // set the status header($status_header); // set the content type header(‘Content-type: ‘ . $content_type); // pages with body are easy if($body != ‘‘){ // send the body echo $body; exit; } // we need to create the body if none is passed else { // create some body messages $message = ‘‘; // this is purely optional, but makes the pages a little nicer to read // for your users. Since you won‘t likely send a lot of different status codes, // this also shouldn‘t be too ponderous to maintain switch($status) { case 401: $message = ‘You must be authorized to view this page.‘; break; case 200: $message = ‘You must be authorized to view this page. 200‘; break; case 404: $message = ‘The requested URL ‘ . $_SERVER[‘REQUEST_URI‘] . ‘ was not found.‘; break; case 500: $message = ‘The server encountered an error processing your request.‘; break; case 501: $message = ‘The requested method is not implemented.‘; break; } // servers don‘t always have a signature turned on (this is an apache directive "ServerSignature On") $signature = ($_SERVER[‘SERVER_SIGNATURE‘] == ‘‘) ? $_SERVER[‘SERVER_SOFTWARE‘] . ‘ Server at ‘ . $_SERVER[‘SERVER_NAME‘] . ‘ Port ‘ . $_SERVER[‘SERVER_PORT‘] : $_SERVER[‘SERVER_SIGNATURE‘]; // this should be templatized in a real-world solution $body = ‘<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>‘ . $status . ‘ ‘ . RestUtils::getStatusCodeMessage($status) . ‘</title> </head> <body> <h1>‘ . RestUtils::getStatusCodeMessage($status) . ‘</h1> ‘ . $message . ‘ <hr /> <address>‘ . $signature . ‘</address> </body> </html>‘; echo $body; exit; } } public static function getStatusCodeMessage($status){ // these could be stored in a .ini file and loaded // via parse_ini_file()... however, this will suffice // for an example // 这些应该被存储在一个.ini的文件中,然后通过parse_ini_file()函数来解析出来,然而这样也足够了,比如: $codes = Array( 100 => ‘Continue‘, 101 => ‘Switching Protocols‘, 200 => ‘OK‘, 201 => ‘Created‘, 202 => ‘Accepted‘, 203 => ‘Non-Authoritative Information‘, 204 => ‘No Content‘, 205 => ‘Reset Content‘, 206 => ‘Partial Content‘, 300 => ‘Multiple Choices‘, 301 => ‘Moved Permanently‘, 302 => ‘Found‘, 303 => ‘See Other‘, 304 => ‘Not Modified‘, 305 => ‘Use Proxy‘, 306 => ‘(Unused)‘, 307 => ‘Temporary Redirect‘, 400 => ‘Bad Request‘, 401 => ‘Unauthorized‘, 402 => ‘Payment Required‘, 403 => ‘Forbidden‘, 404 => ‘Not Found‘, 405 => ‘Method Not Allowed‘, 406 => ‘Not Acceptable‘, 407 => ‘Proxy Authentication Required‘, 408 => ‘Request Timeout‘, 409 => ‘Conflict‘, 410 => ‘Gone‘, 411 => ‘Length Required‘, 412 => ‘Precondition Failed‘, 413 => ‘Request Entity Too Large‘, 414 => ‘Request-URI Too Long‘, 415 => ‘Unsupported Media Type‘, 416 => ‘Requested Range Not Satisfiable‘, 417 => ‘Expectation Failed‘, 500 => ‘Internal Server Error‘, 501 => ‘Not Implemented‘, 502 => ‘Bad Gateway‘, 503 => ‘Service Unavailable‘, 504 => ‘Gateway Timeout‘, 505 => ‘HTTP Version Not Supported‘ ); return (isset($codes[$status])) ? $codes[$status] : ‘‘; } }
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/6/26 * Time: 10:18 */ namespace app\api\controller; use app\api\controller\RestUtils; //简单的class来存储request的一些信息(RestRequest),和一个提供几个静态方法的class来处理请求和响应 class RestRequest { private $request_vars; private $data; private $http_accept; private $method; public function __construct() { $this->request_vars = array(); $this->data = ‘‘; $this->http_accept = ‘json‘;//(strpos($_SERVER[‘HTTP_ACCEPT‘],‘json‘)) ? ‘json‘ : ‘xml‘; $this->method = ‘get‘; } public function setData($data){ $this->data = $data; } public function setMethod($method){ $this->method = $method; } public function setRequestVars($request_vars){ $this->request_vars = $request_vars; } public function getData(){ return $this->data; } public function getMethod(){ return $this->method; } public function getHttpAccept(){ return $this->http_accept; } public function getRequestVars(){ return $this->request_vars; } }
以上是关于使用TP5创建一个REST API的主要内容,如果未能解决你的问题,请参考以下文章
400错误代码,当使用RestTemplate进行Rest API时。
TP5报如下的错误 Indirect modification of overloaded element of thinkpaginatorCollection has no effect(代码片段
我应该在具有多个步骤的 REST API 上使用啥响应代码?