2014-10-02 */ abstract class PhalApi_Response { /** * @var int $ret 返回状态码,其中:200成功,400非法请求,500服务器错误 */ protected $ret = 200; /** * @var array 待返回给客户端的数据 */ protected $data = array(); /** * @var string $msg 错误返回信息 */ protected $msg = ''; /** * @var array $headers 响应报文头部 */ protected $headers = array(); /** * @var array $debug 调试信息 */ protected $debug = array(); /** ------------------ setter ------------------ **/ /** * 设置返回状态码 * @param int $ret 返回状态码,其中:200成功,400非法请求,500服务器错误 * @return PhalApi_Response */ public function setRet($ret) { $this->ret = $ret; return $this; } /** * 设置返回数据 * @param array/string $data 待返回给客户端的数据,建议使用数组,方便扩展升级 * @return PhalApi_Response */ public function setData($data) { $this->data = $data; return $this; } /** * 设置错误信息 * @param string $msg 错误信息 * @return PhalApi_Response */ public function setMsg($msg) { $this->msg = $msg; return $this; } /** * 设置调试信息 * @param string $key 键值标识 * @param mixed $value 调试数据 * @return PhalApi_Response */ public function setDebug($key, $value) { if (DI()->debug) { $this->debug[$key] = $value; } return $this; } /** * 添加报文头部 * @param string $key 名称 * @param string $content 内容 */ public function addHeaders($key, $content) { $this->headers[$key] = $content; } /** ------------------ 结果输出 ------------------ **/ /** * 结果输出 */ public function output() { $this->handleHeaders($this->headers); $rs = $this->getResult(); echo $this->formatResult($rs); } /** ------------------ getter ------------------ **/ /** * 根据状态码调整Http响应状态码 */ public function adjustHttpStatus() { $httpStatus = array ( 100 => 'HTTP/1.1 100 Continue', 101 => 'HTTP/1.1 101 Switching Protocols', 200 => 'HTTP/1.1 200 OK', 201 => 'HTTP/1.1 201 Created', 202 => 'HTTP/1.1 202 Accepted', 203 => 'HTTP/1.1 203 Non-Authoritative Information', 204 => 'HTTP/1.1 204 No Content', 205 => 'HTTP/1.1 205 Reset Content', 206 => 'HTTP/1.1 206 Partial Content', 300 => 'HTTP/1.1 300 Multiple Choices', 301 => 'HTTP/1.1 301 Moved Permanently', 302 => 'HTTP/1.1 302 Found', 303 => 'HTTP/1.1 303 See Other', 304 => 'HTTP/1.1 304 Not Modified', 305 => 'HTTP/1.1 305 Use Proxy', 307 => 'HTTP/1.1 307 Temporary Redirect', 400 => 'HTTP/1.1 400 Bad Request', 401 => 'HTTP/1.1 401 Unauthorized', 402 => 'HTTP/1.1 402 Payment Required', 403 => 'HTTP/1.1 403 Forbidden', 404 => 'HTTP/1.1 404 Not Found', 405 => 'HTTP/1.1 405 Method Not Allowed', 406 => 'HTTP/1.1 406 Not Acceptable', 407 => 'HTTP/1.1 407 Proxy Authentication Required', 408 => 'HTTP/1.1 408 Request Time-out', 409 => 'HTTP/1.1 409 Conflict', 410 => 'HTTP/1.1 410 Gone', 411 => 'HTTP/1.1 411 Length Required', 412 => 'HTTP/1.1 412 Precondition Failed', 413 => 'HTTP/1.1 413 Request Entity Too Large', 414 => 'HTTP/1.1 414 Request-URI Too Large', 415 => 'HTTP/1.1 415 Unsupported Media Type', 416 => 'HTTP/1.1 416 Requested range not satisfiable', 417 => 'HTTP/1.1 417 Expectation Failed', 500 => 'HTTP/1.1 500 Internal Server Error', 501 => 'HTTP/1.1 501 Not Implemented', 502 => 'HTTP/1.1 502 Bad Gateway', 503 => 'HTTP/1.1 503 Service Unavailable', 504 => 'HTTP/1.1 504 Gateway Time-out', 505 => 'HTTP/1.1 505 HTTP Version not supported', ); $str = isset($httpStatus[$this->ret]) ? $httpStatus[$this->ret] : "HTTP/1.1 {$this->ret} PhalApi Unknown Status"; @header($str); return $this; } public function getResult() { $rs = array( 'ret' => $this->ret, 'data' => $this->data, 'msg' => $this->msg, ); if (!empty($this->debug)) { $rs['debug'] = $this->debug; } return $rs; } /** * 获取头部 * * @param string $key 头部的名称 * @return string/array 对应的内容,不存在时返回NULL,$key为NULL时返回全部 */ public function getHeaders($key = NULL) { if ($key === NULL) { return $this->headers; } return isset($this->headers[$key]) ? $this->headers[$key] : NULL; } /** ------------------ 内部方法 ------------------ **/ protected function handleHeaders($headers) { foreach ($headers as $key => $content) { @header($key . ': ' . $content); } } /** * 格式化需要输出返回的结果 * * @param array $result 待返回的结果数据 * * @see PhalApi_Response::getResult() */ abstract protected function formatResult($result); }