{"id":1819,"date":"2015-12-21T16:12:44","date_gmt":"2015-12-21T08:12:44","guid":{"rendered":"http:\/\/www.aoisnow.net\/blog\/?p=1819"},"modified":"2015-12-21T16:12:44","modified_gmt":"2015-12-21T08:12:44","slug":"day-9937-%e9%a5%ad%e5%90%a6%e6%b6%88%e6%81%af%e8%bf%87%e6%bb%a4%e4%bb%a3%e7%90%86","status":"publish","type":"post","link":"https:\/\/www.aoisnow.net\/blog\/archives\/1819","title":{"rendered":"Day 3611 \u4e2d\u95f4\u4eba\u653b\u51fb\u5f0f\u996d\u5426\u6d88\u606f\u8fc7\u6ee4\u4ee3\u7406"},"content":{"rendered":"<p>\u8fd9\u4e2a\u4e1c\u897f\u7684\u6700\u521d\u8bbe\u8ba1\u76ee\u6807\u662f\uff1a\u5728\u4e0d\u5bf9\u67d0\u4e9b\u4eba\u53d6\u6d88\u5173\u6ce8\uff08\u52a0\u9ed1\u540d\u5355\u4e5f\u4f1a\u53d6\u6d88\u5173\u6ce8\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u901a\u8fc7\u4e2d\u95f4\u4eba\u653b\u51fb\uff08\u4e0d\u662f\u552c\u4eba\uff0c\u5176\u5b9e\u672c\u8d28\u5c31\u662f\u7be1\u6539\u8fd4\u56de\u7ed3\u679c\uff09\u4e3a\u4e0d\u652f\u6301\u6d88\u606f\u8fc7\u6ee4\u7684\u996d\u5426\u5ba2\u6237\u7aef\uff08\u5b9e\u9645\u4e0a\uff0c\u6ca1\u6709\u4efb\u4f55\u4e00\u6b3e\u996d\u5426\u5ba2\u6237\u7aef\u548c\u5b98\u65b9\u754c\u9762\u6709\u8fd9\u4e2a\u529f\u80fd\uff0c\u636e\u672c\u4eba\u6240\u77e5\u7684\u552f\u4e00\u9014\u5f84\u662f<a href=\"https:\/\/chrome.google.com\/webstore\/detail\/fanatic\/nnfgpokjdjekoafapiikeklhjhbckjah\" target=\"_blank\">Chrome\u63d2\u4ef6Fanatic<\/a>\uff0c\u4f46\u4e5f\u53ea\u80fd\u5bf9\u996d\u5426\u7f51\u9875\u7248\u8d77\u4f5c\u7528\uff09\u63d0\u4f9b\u76f8\u5e94\u529f\u80fd\u3002<\/p>\n<p>\u7531\u4e8e\u6ca1\u6709\u4e00\u6b3e\u5ba2\u6237\u7aef\u652f\u6301\u81ea\u5b9a\u4e49API\u5730\u5740\uff0c\u6240\u4ee5\u91c7\u53d6\u7684\u65b9\u5f0f\u662f\uff1a\u5728\u672c\u5730\u7528hosts\u5c06API\u6240\u5728\u4e3b\u673a\uff08api.fanfou.com\uff09\u91cd\u5b9a\u5411\uff0c\u7136\u540e\u5728\u76ee\u6807\u670d\u52a1\u5668\u63a5\u53d7\u89e3\u6790\uff0c\u7b49\u4e8e\u6b3a\u9a97\u4e00\u4e0b\u5ba2\u6237\u7aef\uff0c\u8ba9\u5b83\u4ee5\u4e3a\u8fde\u63a5\u7684\u662f\u5b98\u65b9\u7684API\u670d\u52a1\u5668\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u65e2\u7136\u662f\u4e2d\u95f4\u4eba\u653b\u51fb\uff0c\u90a3\u4e48\u5176\u5b9e\u60f3\u5bf9\u8fd4\u56de\u7ed3\u679c\u505a\u4ec0\u4e48\u90fd\u53ef\u4ee5\uff0c\u672c\u6765\u9664\u4e86\u8fc7\u6ee4\u7279\u5b9a\u4eba\u4e4b\u5916\u8fd8\u60f3\u52a0\u5165\u66f4\u591a\u529f\u80fd\uff0c\u53ef\u662f\u5199\u5b8c\u5c31\u61d2\u4e86\u3002<\/p>\n<p>\u4ee3\u7801\u5199\u5f97\u5f88\u9762\u6761\u5f88\u70c2\uff0c\u8bf7\u591a\u5305\u6db5\u3002<\/p>\n<p>\u4f7f\u7528\u65b9\u6cd5\uff08\u4ee5Apache 2.4.4 + PHP 5.3\u4e3a\u4f8b\uff09\uff1a<\/p>\n<p>\uff11\u3001\u5c06\u6587\u4ef6\u5185\u5bb9\u53e6\u5b58\u4e3aUTF-8\u65e0BOM\u683c\u5f0f\uff0c\u6587\u4ef6\u540d\u4e3aindex.php\uff08\u6216\u4efb\u4f55\u76ee\u6807\u670d\u52a1\u5668\u652f\u6301\u7684\u9ed8\u8ba4\u6587\u6863\u540d\uff09<\/p>\n<p>\uff12\u3001\u786e\u8ba4PHP\u5f00\u542fcURL\u6269\u5c55\uff0cApache\u5f00\u542f\u4e86Rewrite\u6269\u5c55\uff0c\u4fee\u6539httpd-vhosts.conf\uff08\u6216Apache\u865a\u62df\u4e3b\u673a\u914d\u7f6e\u6587\u4ef6\u6240\u5728\u5904\uff09\uff1a<\/p>\n<blockquote>\n<pre>&lt;VirtualHost *:80&gt;\n    ServerName api.fanfou.com\n    DocumentRoot \"\u6587\u4ef6\u6240\u5728\u8def\u5f84\"\n&lt;\/VirtualHost&gt;\n&lt;Directory \"\u6587\u4ef6\u6240\u5728\u8def\u5f84\"&gt;\n    Order Allow,Deny\n    Allow from All\n    RewriteEngine On\n    RewriteCond %{REQUEST_FILENAME} !-f\n    #-f\u7684\u542b\u610f\u662f\u5c06\u8bf7\u6c42\u7684\u8def\u5f84\u5f53\u4f5c\u6587\u4ef6\u6765\u770b\u5f85\uff0c\u7531\u4e8e-f\u4f1a\u68c0\u6d4b\u6587\u4ef6\u662f\u5426\u771f\u5b9e\u5b58\u5728\uff0c\u6240\u4ee5!\u4e4b\n    RewriteRule ^(.*)$ index.php?reqf=$1 [QSA]\n    #QSA == Query strings appended\uff0c\u5373\u5c06\u539f\u59cbQuery String\u5185\u5bb9\u539f\u6837\u8f6c\u53d1\n&lt;\/Directory&gt;<\/pre>\n<\/blockquote>\n<p>\uff13\u3001\u914d\u7f6e\u4e3b\u673a\uff0c\u5c06api.fanfou.com\u7ed1\u5b9a\u5230\u521a\u521a\u914d\u7f6e\u7684Apache\u670d\u52a1\u5668\u4e0a\u3002<\/p>\n<p>\uff14\u3001\u5728\u8981\u4f7f\u7528\u8be5\u4ee3\u7406\u7684\u5ba2\u6237\u7aef\u4e0a\uff0c\u914d\u7f6ehosts\u6587\u4ef6\uff0c\u5c06api.fanfou.com\u6307\u5411\u6587\u4ef6\u6240\u5728\u7684\u4e3b\u673a\u3002<!--more--><\/p>\n<p>2016-02-03\u66f4\u65b0\uff1a<\/p>\n<p>\u5728\u8c03\u8bd5\u81ea\u5df1\u7684\u996d\u5426Lib\u65f6\uff0c\u53d1\u73b0\u4efb\u4f55\u8fd4\u56de\u7684HTTP\u72b6\u6001\u7801\u90fd\u662f200\uff0c\u68c0\u67e5\u4e00\u4e0b\u53d1\u73b0\u662f\u4ee3\u7406\u6ca1\u6709\u8f6c\u53d1\u996d\u5426API\u670d\u52a1\u5668\u8fd4\u56de\u7684\u72b6\u6001\u7801\uff0c\u5df2\u5728\u5173\u95edcURL\u53e5\u67c4\u524d\u8fdb\u884c\u5904\u7406\u3002<\/p>\n<p>2016-01-13\u66f4\u65b0\uff1a<\/p>\n<p>\uff11\uff0e\u5f53\u53d1\u9001\u56fe\u7247\u4fe1\u606f\uff08\u6b64\u65f6Content-Type\u4e3amultipart\/form-data\uff09\uff0c\u4e14\u6d88\u606f\u5185\u5bb9\u5f00\u5934\u4e3a@\u65f6\uff0cstatus\u53c2\u6570\u4f1a\u88abcURL\u8ba4\u4e3a\u662f\u6587\u4ef6\u6307\u5411\uff0c\u9020\u6210\u51fa\u73b0can&#8217;t open file\u9519\u8bef\uff0c\u5bfc\u81f4\u6d88\u606f\u53d1\u9001\u5931\u8d25\u3002\u672c\u6765\u4ee5\u4e3a\u56e0\u4e3a\u6539\u52a8POST\u5185\u5bb9\uff0c\u4f1a\u5bfc\u81f4OAuth\u7b7e\u540d\u5931\u6548\uff0c\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u4f1a\u5f88\u9ebb\u70e6\uff0c\u4ee5\u81f4\u505a\u597d\u4e86\u8981\u53cd\u7f16\u8bd1\u5ba2\u6237\u7aef\u3001\u62ffOAuth Consumer\u4fe1\u606f\u7684\u51c6\u5907\uff0c\u7ed3\u679c\u7b2c\u4e00\u6b21\u8bd5\u63a2\u5373\u544a\u6210\u529f\uff0c\u89e3\u51b3\u65b9\u6cd5\u7adf\u7136\u662f<span style=\"color: blue; font-weight: bold;\">\u5728status\u6570\u636e\u7684\u5f00\u5934\u52a0\u4e00\u4e2a\u7a7a\u683c\u5c31\u53ef\u4ee5\u4e86<\/span>\uff0c\u800c\u4e14\u7b7e\u540d\u4f3c\u4e4e\u4ecd\u7136\u6709\u6548\uff0c\u5e76\u4e0d\u4f1a\u5f71\u54cd\u6d88\u606f\u7684\u6210\u529f\u53d1\u9001\uff0c\u771f\u662f\u795e\u5947\u3002<\/p>\n<p>\uff12\uff0e\u89e3\u51b3\u4e4b\u524d\u7248\u672c\u9519\u5c06Debug\u5f00\u5173\u5199\u6210\u5c40\u90e8\u53d8\u91cf$debug\uff0c\u5bfc\u81f4\u65e0\u8bba\u5982\u4f55\u90fd\u4e0d\u4f1a\u8f93\u51fa\u65e5\u5fd7\u7684\u95ee\u9898\uff0c\u73b0\u5df2\u4fee\u6539\u4e3a\u5e38\u91cfDEBUG_MODE\u3002<\/p>\n<pre class=\"line-numbers\"><code class=\"language-php\">&lt;?php\nconst DEBUG_MODE = TRUE; \/\/\u8c03\u8bd5\u5f00\u5173\uff0c\u8bbe\u7f6e\u4e3a true \u4ee5\u8f93\u51fa\u65e5\u5fd7\n\/\/\u83b7\u53d6 Rewrite \u4f20\u5165\u7684 Query string \u53c2\u6570 reqf \uff0c\u5305\u542b\u4e86\u5ba2\u6237\u7aef\u539f\u59cb\u8bf7\u6c42\u7684API\u8def\u5f84\nif (!$_GET['reqf'] || empty($_GET['reqf'])) die(\"No API path to request specified!\");\n\/\/\u83b7\u53d6\u8c03\u7528\u7684API\u6a21\u5f0f\uff0c\u7528\u4e8e\u5904\u7406\u8fd4\u56de\u65f6\u5feb\u901f\u8df3\u8f6c\u76f8\u5e94\u5904\u7406\u6a21\u5757\n$api_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);\n$api_name = strtolower(pathinfo($api_path) ['filename']);\n$api_ext = strtolower(pathinfo($api_path) ['extension']);\nwritelog(\"Requested API extension: \" . $api_ext);\n\/\/\u83b7\u53d6\u5ba2\u6237\u7aef\u8bf7\u6c42 Method\n$method = strtoupper($_SERVER['REQUEST_METHOD']);\n\/\/\u6784\u9020\u8fdc\u7aef API \u8bf7\u6c42 URL\n$api_url = \"http:\/\/api.fanfou.com\/\" . $_GET['reqf'];\n\/\/\u6574\u7406\u8981\u8f6c\u53d1\u7684 headers\n$request_headers = array();\nforeach (apache_request_headers() as $arhk =&gt; $arhv) {\n    writelog($method . \" Header [\" . $arhk . \"] =&gt; \" . $arhv);\n    $request_headers[] = $arhk . ': ' . $arhv;\n}\n\/\/\u5982\u679c\u6709 Query string \u53c2\u6570\uff0c\u6784\u9020\u4e00\u4e2a\u53bb\u6389 reqf \u9879\u7684 GET \u53c2\u6570\u6570\u7ec4\n$clientQS = '';\nif ($_GET &amp;&amp; sizeof($_GET) &gt; 1) {\n    foreach ($_GET as $gk =&gt; $gv) {\n        if (strtolower($gk) != 'reqf') $clientQS = $clientQS . '&amp;' . $gk . '=' . $gv;\n    }\n    if (substr($clientQS, 0, 1) == '&amp;') $clientQS = '?' . substr($clientQS, 1);\n    $api_url = $api_url . $clientQS;\n}\n\/\/\u5bf9 URL \u4e2d\u7684\u7a7a\u683c\u66ff\u6362\u4e3a+\n\/\/\u8fd9\u4e00\u884c\u7684\u4e3b\u8981\u7528\u9014\u662f\u4fee\u590d\u8611\u83c7\u996d\u63d0\u4ea4\u5e26\u56fe\u6d88\u606f\u65f6\uff0c\u5728Query String\u4e2d\u53c8\u5199\u4e86\u4e00\u904d\u5df2\u7ecf\u5728POST\u91cc\u5199\u8fc7\u7684status\u53c2\u6570\uff0c\u5374\u53c8\u4e0d\u5c06\u7a7a\u683c\u8f6c\u5316\u6210+\uff08\u897f\u6587\u52a0\u53f7\uff09\uff0c\u5bfc\u81f4\u7b7e\u540d\u4e0d\u7b26\u8fc7\u4e0d\u4e86OAuth\u9a8c\u8bc1\n$api_url = str_replace(\" \", \"+\", $api_url);\nwritelog($method . ' ' . $api_url);\n\/\/\u51c6\u5907 cURL \u5bf9\u8c61\n$c = curl_init();\ncurl_setopt($c, CURLOPT_URL, $api_url);\ncurl_setopt($c, CURLOPT_ENCODING, 'gzip,deflate');\ncurl_setopt($c, CURLOPT_TIMEOUT_MS, 3000);\ncurl_setopt($c, CURLOPT_RETURNTRANSFER, true);\n\/\/\u6839\u636e Method \u4e0d\u540c\u8fdb\u884c\u4e0d\u540c\u7684 curl \u64cd\u4f5c\nswitch ($method) {\n    case 'GET':\n        \/\/GET\uff1a\u8ffd\u52a0header\n        curl_setopt($c, CURLOPT_HTTPHEADER, $request_headers);\n        break;\n\n    case 'POST':\n        \/\/POST \u5c06\u8981\u63d0\u4ea4\u7684\u6570\u636e\u6574\u7406\u540e\u8ffd\u52a0\uff0c\u5206\u60c5\u51b5\u5904\u7406\n        curl_setopt($c, CURLOPT_POST, true);\n        if (strpos(strtolower($_SERVER[\"CONTENT_TYPE\"]) , \"multipart\/form-data\") !== FALSE) {\n            \/\/\u6309multipart\/form-data\u5904\u7406\n            writelog(\"Posting multipart\/form-data content...\");\n            \/\/\u9488\u5bf9cURL\u91cd\u5199\u7684\u8bf7\u6c42\u5bf9header\u8fdb\u884c\u4fee\u6b63\n            for ($rhidx = 0; $rhidx &lt; sizeof($request_headers); $rhidx++) {\n                \/\/\u5220\u9664\u539f\u6709\u7684Content-Type\u53c2\u6570\uff08boundary\u4f1a\u88ab\u91cd\u590d\u6dfb\u52a0\uff0c\u4e0e\u539f\u59cb\u503c\u4e0d\u4e00\u81f4\uff0c\u5bfc\u81f4\u670d\u52a1\u5668\u65e0\u6cd5\u5206\u5272\u6570\u636e\uff09\n                if (stristr($request_headers[$rhidx], \"Content-Type\") !== FALSE) $request_headers[$rhidx] = '';\n                \/\/\u5220\u9664\u539f\u6709\u7684Content-Length\u53c2\u6570\uff08cURL\u5bf9\u8bf7\u6c42\u91cd\u5199\u540e\u4e0e\u539f\u59cb\u957f\u5ea6\u4e0d\u4e00\u81f4\uff0c\u5982\u679c\u539f\u59cb\u503c\u6bd4\u65b0\u503c\u957f\uff0c\u670d\u52a1\u5668\u5c31\u4f1a\u4e00\u81f4\u7b49\u5f85\u672a\u4f20\u8f93\u5b8c\u6210\u7684\u6570\u636e\uff0c\u76f4\u5230\u8d85\u65f6\uff09\n                if (stristr($request_headers[$rhidx], \"Content-Length\") !== FALSE) $request_headers[$rhidx] = '';\n            }\n            \/\/Debug\u6a21\u5f0f\u4e0b\u8f93\u51fa\u6574\u7406\u540e\u7684Request Header\n            if (DEBUG_MODE === TRUE) {\n                foreach ($request_headers as $rh) {\n                    writelog(\"Request header: \" . $rh);\n                }\n            }\n            curl_setopt($c, CURLOPT_HTTPHEADER, $request_headers);\n            \/\/\u91cd\u65b0\u7ec4\u7ec7POST\u6570\u636e\uff0c\u4e3b\u8981\u4e3a\u4e86\u5c06\u4e0a\u4f20\u7684\u6587\u4ef6\u91cd\u65b0\u9644\u52a0\n            $postdata = array();\n            foreach ($_POST as $pdk =&gt; $pdv) {\n                writelog(\"POST data: [\" . $pdk . \"] =&gt; \" . $pdv);\n                $postdata[$pdk] = $pdv;\n            }\n            \/\/\u5982\u679c\u63d0\u4ea4\u7684\u6570\u636e\u6709\u6587\u4ef6\u6570\u636e\uff08\u5bf9\u996d\u5426\u6765\u8bf4\u53ea\u6709\u4e00\u79cd\u60c5\u51b5\uff1aphoto\uff09\uff0cPHP\u4f1a\u5c06\u5176\u6309 $_FILES\uff08POST\u63d0\u4ea4\u7684\u6587\u4ef6\uff09\u5904\u7406\uff0c\u9700\u8981\u91cd\u65b0\u7f16\u5165\u51c6\u5907\u63d0\u4ea4\u7684\u6570\u636e\n            if ($_FILES['photo']) {\n                writelog(\"File uploaded as \" . $_FILES['photo']['tmp_name']);\n                $postdata['photo'] = '@' . $_FILES['photo']['tmp_name'] . ';filename=' . $_FILES['photo']['name'] . ';type=' . $_FILES['photo']['type'];\n\t\t\t\tif(strpos($postdata['status'], '@') === 0) $postdata['status'] = \" \".$postdata['status'];\n            }\n\t\t\twritelog(\"POST data in a nutshell: \".var_export($postdata, TRUE));\n            curl_setopt($c, CURLOPT_POSTFIELDS, $postdata);\n        } else {\n            \/\/\u6309application\/x-www-form-urlencoded\u5904\u7406\n            writelog(\"POST data: \" . http_build_query($_POST));\n            curl_setopt($c, CURLOPT_HTTPHEADER, $request_headers);\n            curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($_POST));\n        }\n        break;\n\n    default:\n        \/\/\u9664\u6b64\u4e4b\u5916\u7684\u65b9\u6cd5\u90fd\u4e0d\u652f\u6301\n        die(\"Unsupported request method [\" . $method . \"]!\");\n    }\n    \/\/\u63d0\u4ea4\u8bf7\u6c42\u5e76\u83b7\u53d6\u8fd4\u56de\n    $output = curl_exec($c);\n    writelog($method . \" executed.\");\n    if ($output === false) {\n        writelog($method . \" cURL error: \" . curl_error($c));\n    }\n \n    \/\/\u8bbe\u7f6e\u8fd4\u56de\u7684HTTP Status Code\n    http_response_code(curl_getinfo($c, CURLINFO_HTTP_CODE));\n \n    \/\/\u5173\u95ed curl \u53e5\u67c4\n    curl_close($c);\n \n    \/\/\u5904\u7406\u7ed3\u679c\n    switch ($api_ext) {\n        case 'xml':\n            \/\/\u4f7f\u7528 simpleXML \u52a0\u8f7d\u8fd4\u56de\u5185\u5bb9\n            $xml = simplexml_load_string($output);\n            \/\/\u5982\u679c\u8bd5\u56fe\u6253\u5f00 XML \u51fa\u9519\uff0c\u539f\u6837\u8fd4\u56de\uff0c\u5e76\u5728\u65e5\u5fd7\u4e2d\u8bb0\u5f55\n            if ($xml === FALSE) {\n                writelog(\"Error parsing XML return...\");\n                break;\n            }\n            \/\/\u7531\u4e8e\u6682\u65f6\u7528\u4e0d\u5230 XML \u8fc7\u6ee4\uff0c\u4ec0\u4e48\u4e5f\u6ca1\u6709\u5199\uff0c\u6709\u9700\u6c42\u53ef\u81ea\u884c\u6269\u5c55\n            break;\n\n        case 'json':\n            \/\/\u53ea\u5bf9\u7279\u5b9a\u7684 API \u8fdb\u884c\u5904\u7406\n            if ($api_name == \"home_timeline\" || $api_name == \"mentions\" || $api_name == \"public_timeline\") {\n                \/\/\u5c06 JSON \u8fd4\u56de\u89e3\u6790\u4e3a\u5bf9\u8c61\u6570\u7ec4\n                $json_array = json_decode($output);\n                \/\/\u5982\u679c\u8bd5\u56fe\u6253\u5f00 JSON \u51fa\u9519\uff0c\u539f\u6837\u8fd4\u56de\uff0c\u5e76\u5728\u65e5\u5fd7\u4e2d\u8bb0\u5f55\n                if (json_last_error() !== JSON_ERROR_NONE) {\n                    writelog(\"Error parsing JSON return...\");\n                    break;\n                }\n                \/\/\u5f00\u59cb\u5904\u7406JSON\n                \/\/\u8303\u4f8b\uff1a\u8fc7\u6ee4\u5404\u79cd Timeline \u4e2d\uff0cuser \u7684 id \u4e3a ifanfou \u7684\u6d88\u606f\n                foreach ($json_array as $json_ek =&gt; $json_ev) {\n                    if ($json_ev-&gt;{'user'}-&gt;{'id'} === \"ifanfou\") unset($json_array[$json_ek]);\n                }\n                \/\/\u4ee5\u4e0b\u4ee3\u7801\u89e3\u91ca\uff1ahttps:\/\/stackoverflow.com\/questions\/20372982\/removing-array-index-reference-when-using-json-encode-in-php\n                \/\/\u89e3\u91ca\uff1a\u5982\u679c\u4e0a\u9762\u7684foreach\u5b9e\u9645\u6267\u884c\u4e86\u8fc7\u6ee4\u64cd\u4f5c\uff08\u987a\u4fbf\u8bf4\u4e00\u53e5 foreach \u80fd\u505a\u5230\u5728\u5176\u5faa\u73af\u4e2d\u5220\u9664\u5143\u7d20\u5176\u5b9e\u662f\u4e0d\u5bf9\u7684\uff09\uff0c\n                \/\/\u90a3\u4e48 $json_array \u7684\u6570\u7ec4\u7d22\u5f15\u5c31\u4f1a\u53d8\u6210\u4e0d\u8fde\u7eed\u7684\uff0c\u800c\u4e0d\u8fde\u7eed\u7684\u7d22\u5f15\u4f1a\u88ab\u89c6\u4e3a json \u4e0d\u652f\u6301\u7684\u5173\u8054\u6570\u7ec4\uff0c\n                \/\/\u6240\u4ee5 json_encode() \u4f1a\u5c06\u7d22\u5f15\u89c6\u4e3a\u4e00\u4e2a\u5916\u5c42\u5d4c\u5957\u5143\u7d20\uff0c\u53d8\u6210 [ \"1\": {\"created_at\": ...} ] \u7684\u5f62\u5f0f\uff0c\u800c\u5ba2\u6237\u7aef\u662f\u4e0d\u80fd\u89e3\u6790\u8fd9\u79cd\u7ed3\u6784\u7684\u3002\n                \/\/array_values() \u7684\u4f5c\u7528\u662f\u63d0\u53d6\u6570\u7ec4\u4e2d\u7684\u6240\u6709\u503c\uff0c\u5e76\u4e3a\u5176\u91cd\u65b0\u5efa\u7acb\u6570\u5b57\u7d22\u5f15\uff0c\u5f53\u6570\u5b57\u7d22\u5f15\u7684\u503c\u8fde\u7eed\u8d77\u6765\u540e\uff0c\u518d\u8fdb\u884c json_encode() \u5c31\u53ef\u4ee5\u5f97\u5230\u9700\u8981\u7684\u8f93\u51fa\u4e86\u3002\n                $json_array = array_values($json_array);\n                \/\/\u91cd\u65b0\u5c06\u6570\u7ec4\u7f16\u8bd1\u4e3aJSON\u5b57\u7b26\u4e32\n                $output = json_encode($json_array);\n            }\n            break;\n\n        default: \/\/\u5982\u679c\u662f\u996d\u5426API\u53ea\u5269\u4e0b\u4e00\u79cd\u53ef\u80fd\uff1arss\uff0c\u4e0d\u8fdb\u884c\u5904\u7406\n            break;\n        }\n        \/\/\u8f93\u51fa\u7ed3\u679c\n        echo ($output);\n\t\t\/\/\u672c\u5730\u65b9\u6cd5\uff1a\u5199\u5165\u65e5\u5fd7\n\t\tfunction writelog($s) {\n\t\t\tif (DEBUG_MODE === TRUE) {\n\t\t\t\t$s = (string)$s;\n\t\t\t\t$s = '[' . date('Y-m-d H:i:s') . '] ' . $s;\n\t\t\t\t$f = fopen(\"log_\" . date('Ymd') . \".txt\", \"a\");\n\t\t\t\tfwrite($f, \"\\r\\n\" . $s);\n\t\t\t\tfclose($f);\n\t\t\t}\n\t\t}\n?&gt;\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u4e2a\u4e1c\u897f\u7684\u6700\u521d\u8bbe\u8ba1\u76ee\u6807\u662f\uff1a\u5728\u4e0d\u5bf9\u67d0\u4e9b\u4eba\u53d6\u6d88\u5173\u6ce8\uff08\u52a0\u9ed1\u540d\u5355\u4e5f\u4f1a\u53d6\u6d88\u5173\u6ce8\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u901a\u8fc7\u4e2d\u95f4\u4eba\u653b\u51fb\uff08\u4e0d\u662f\u552c\u4eba\uff0c\u5176\u5b9e [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-1819","post","type-post","status-publish","format-standard","hentry","category-works"],"_links":{"self":[{"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/posts\/1819","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/comments?post=1819"}],"version-history":[{"count":0,"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/posts\/1819\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/media?parent=1819"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/categories?post=1819"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aoisnow.net\/blog\/wp-json\/wp\/v2\/tags?post=1819"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}