97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

怎樣做自己的導(dǎo)購網(wǎng)站wordpress圖片社交

鶴壁市浩天電氣有限公司 2026/01/24 14:22:56
怎樣做自己的導(dǎo)購網(wǎng)站,wordpress圖片社交,建站公司 源碼申請,coding wordpress第3章:對話規(guī)則:理解HTTP協(xié)議與RESTful API設(shè)計 章節(jié)介紹 學(xué)習(xí)目標 通過本章學(xué)習(xí),你將能夠: 深刻理解HTTP協(xié)議在Web通信中的核心作用.掌握關(guān)鍵HTTP方法(GET, POST, PUT, PATCH, DELETE)的語義與正確使用場景.解讀常見HTTP狀態(tài)碼(如200, 404, 500)的含義,并能在API中正確應(yīng)用.理…第3章:對話規(guī)則:理解HTTP協(xié)議與RESTful API設(shè)計章節(jié)介紹學(xué)習(xí)目標通過本章學(xué)習(xí),你將能夠:深刻理解HTTP協(xié)議在Web通信中的核心作用.掌握關(guān)鍵HTTP方法(GET, POST, PUT, PATCH, DELETE)的語義與正確使用場景.解讀常見HTTP狀態(tài)碼(如200, 404, 500)的含義,并能在API中正確應(yīng)用.理解請求頭與響應(yīng)頭(如Content-Type, Authorization)的作用并熟練使用.掌握RESTful架構(gòu)風(fēng)格的核心思想與設(shè)計規(guī)范.熟練使用JSON作為API數(shù)據(jù)交換格式.在本教程中的作用本章是連接PHP基礎(chǔ)與數(shù)據(jù)庫操作(第1、2章)與動手構(gòu)建API(第4章)的關(guān)鍵橋梁.它將為你揭示W(wǎng)eb應(yīng)用程序(包括你的手機App、瀏覽器中的網(wǎng)頁)與服務(wù)器之間進行對話所遵循的底層規(guī)則.不理解HTTP和RESTful API,就無法構(gòu)建出規(guī)范、易用且安全的后端服務(wù).掌握了本章的對話規(guī)則,你才能在第4章中編寫出合格的API代碼,讓前端開發(fā)者能夠愉快地與你協(xié)作.與前面章節(jié)的銜接在第2章,你學(xué)會了如何使用PHP操作MySQL數(shù)據(jù)庫,這為你存儲和提供數(shù)據(jù)做好了準備.在本章,你將學(xué)習(xí)數(shù)據(jù)如何通過一套標準的規(guī)則(HTTP協(xié)議)被請求和返回.數(shù)據(jù)庫是倉庫,而HTTP協(xié)議是運輸協(xié)議和交通規(guī)則.掌握了本章知識后,你在第4章的任務(wù)就是將PHP代碼與這些HTTP規(guī)則結(jié)合起來,創(chuàng)建出真正的數(shù)據(jù)接口.本章主要內(nèi)容概覽本章將從HTTP協(xié)議的基礎(chǔ)講起,通過比喻幫助你理解客戶端與服務(wù)器如何通信.然后,我們將深入HTTP的各個組成部分:方法、狀態(tài)碼、頭部.接著,引出并詳細講解現(xiàn)代API設(shè)計的流行風(fēng)格——RESTful架構(gòu).最后,我們將通過一個完整的實戰(zhàn)項目——圖書管理系統(tǒng)API設(shè)計,將所有理論知識融會貫通,并用Postman工具進行檢驗.核心概念講解1. HTTP協(xié)議基礎(chǔ)概念:HTTP(超文本傳輸協(xié)議)是用于從網(wǎng)絡(luò)服務(wù)器傳輸超文本(如網(wǎng)頁)到本地瀏覽器的應(yīng)用層協(xié)議.它是Web數(shù)據(jù)通信的基石,所有瀏覽器、App與服務(wù)器的交互都基于此.核心模型:客戶端-服務(wù)器(Client-Server)客戶端(Client):發(fā)起請求的一方.例如:你的瀏覽器(Chrome, Firefox)、手機App、Postman測試工具.服務(wù)器(Server):接收請求、處理并返回響應(yīng)的一方.例如:運行著你編寫的PHP代碼的Web服務(wù)器(Apache/Nginx).交互過程:客戶端發(fā)送一個HTTP請求(Request)到服務(wù)器 - 服務(wù)器處理請求 - 服務(wù)器返回一個HTTP響應(yīng)(Response)給客戶端.這個過程是無狀態(tài)(Stateless)的,即服務(wù)器不會記住上一次的請求,每次請求都是獨立的.HTTP請求與響應(yīng)結(jié)構(gòu)一個完整的HTTP交互包含兩部分:請求報文和響應(yīng)報文.HTTP請求報文示例:GET /api/books/1 HTTP/1.1 // 請求行:方法 URI 協(xié)議版本 Host: example.com // 請求頭(Headers) User-Agent: Mozilla/5.0... Accept: application/json // 客戶端希望接收JSON格式 (此處空一行,分隔頭部和主體) // 請求主體(Body),GET請求通常沒有Body- **請求行**:定義了要執(zhí)行的動作(GET)、目標資源(/api/books/1)和使用的HTTP版本. - **請求頭**:包含關(guān)于請求的元信息,如客戶端信息、接受的數(shù)據(jù)格式等. - **請求體**:可選,通常用于POST、PUT等方法,攜帶要發(fā)送給服務(wù)器的數(shù)據(jù)(如表單數(shù)據(jù)、JSON).HTTP響應(yīng)報文示例:HTTP/1.1 200 OK // 狀態(tài)行:協(xié)議版本 狀態(tài)碼 狀態(tài)消息 Content-Type: application/json // 響應(yīng)頭(Headers) Content-Length: 85 (此處空一行,分隔頭部和主體) { id: 1, title: 深入理解計算機系統(tǒng) } // 響應(yīng)主體(Body),包含服務(wù)器返回的實際數(shù)據(jù)- **狀態(tài)行**:告知客戶端請求的處理結(jié)果(成功200, 未找到404等). - **響應(yīng)頭**:包含關(guān)于響應(yīng)的元信息,如服務(wù)器類型、返回數(shù)據(jù)的格式、緩存指令等. - **響應(yīng)體**:服務(wù)器返回給客戶端的實際內(nèi)容,如HTML、JSON、圖片等.2. 關(guān)鍵HTTP方法(動詞)HTTP方法定義了客戶端希望對目標資源執(zhí)行的操作.在RESTful API設(shè)計中,方法的選擇至關(guān)重要.方法語義(做什么)是否冪等是否安全典型應(yīng)用場景(以/books資源為例)GET獲取(Fetch)資源是是獲取圖書列表GET /api/books, 獲取id為1的圖書詳情GET /api/books/1POST創(chuàng)建(Create)新資源否否創(chuàng)建一本新圖書POST /api/books(數(shù)據(jù)放在請求體)PUT完整更新(Update/Replace)資源是否更新id為1的圖書(需提供完整字段)PUT /api/books/1PATCH部分更新(Partial Update)資源否否僅更新id為1的圖書的價格字段PATCH /api/books/1DELETE刪除(Delete)資源是否刪除id為1的圖書DELETE /api/books/1重要說明:冪等性(Idempotent):無論請求執(zhí)行一次還是多次,產(chǎn)生的效果(服務(wù)器狀態(tài))相同.例如,刪除一個資源一次和多次,結(jié)果都是該資源不存在.這對網(wǎng)絡(luò)重試、保證數(shù)據(jù)一致性非常重要.GET, PUT, DELETE是冪等的;POST和PATCH通常不是.安全性(Safe):指該方法不應(yīng)改變服務(wù)器狀態(tài)(即只讀).GET是安全的,其他方法都不是.3. 常見HTTP狀態(tài)碼狀態(tài)碼是一個3位數(shù)字代碼,用于表示服務(wù)器對請求的處理結(jié)果.它分為5類:范圍類別含義常見例子1xx信息性請求已接收,繼續(xù)處理100(繼續(xù)), 101(切換協(xié)議)2xx成功請求已成功處理200(OK),201(Created, 資源創(chuàng)建成功), 204(No Content, 成功但無返回體)3xx重定向需要進一步操作以完成請求301(永久重定向), 302(臨時重定向)4xx客戶端錯誤請求包含語法錯誤或無法完成400(Bad Request, 請求參數(shù)錯誤),401(Unauthorized, 需要認證),403(Forbidden, 無權(quán)限),404(Not Found, 資源不存在)5xx服務(wù)器錯誤服務(wù)器處理請求時出錯500(Internal Server Error, 通用服務(wù)器錯誤), 502(網(wǎng)關(guān)錯誤), 503(服務(wù)不可用)在API開發(fā)中的黃金法則:永遠返回恰當?shù)臓顟B(tài)碼.不要所有請求都返回200,然后在響應(yīng)體里用{code: 404}表示錯誤.正確的狀態(tài)碼能讓客戶端(前端、其他服務(wù))快速、標準地判斷請求結(jié)果.4. 請求頭與響應(yīng)頭頭部(Headers)是鍵值對,攜帶了請求或響應(yīng)的元數(shù)據(jù).關(guān)鍵請求頭:Content-Type:至關(guān)重要.告訴服務(wù)器請求體(Body)的格式.例如:application/json,application/x-www-form-urlencoded(表單默認),multipart/form-data(文件上傳).Accept: 客戶端希望接收的響應(yīng)體格式.例如:application/json.Authorization: 用于攜帶認證憑證,如Bearer Token:Authorization: Bearer your_jwt_token_here.User-Agent: 客戶端(瀏覽器/工具)標識.關(guān)鍵響應(yīng)頭:Content-Type:至關(guān)重要.告訴客戶端響應(yīng)體的實際格式.API必須設(shè)置為application/json; charsetutf-8.Cache-Control: 控制緩存行為,如no-cache.Access-Control-Allow-Origin: 用于解決跨域問題(CORS),在第6章詳解.5. RESTful架構(gòu)風(fēng)格REST(Representational State Transfer, 表述性狀態(tài)轉(zhuǎn)移)是一種軟件架構(gòu)風(fēng)格,用于設(shè)計網(wǎng)絡(luò)應(yīng)用程序的API.它強調(diào):以資源為中心:將服務(wù)器提供的數(shù)據(jù)/服務(wù)抽象為資源(Resource),如用戶、文章、訂單.每個資源有唯一的標識符(URI).統(tǒng)一的接口:使用標準的HTTP方法(GET/POST/PUT/DELETE等)來操作資源.無狀態(tài)性:每次請求都包含處理該請求所需的所有信息,服務(wù)器不保存會話狀態(tài).這提高了可擴展性和可靠性.可緩存:響應(yīng)應(yīng)被明確標記為可緩存或不可緩存,以提高性能.分層系統(tǒng):客戶端通常不知道是否直接連接到最終服務(wù)器,還是中間的代理(如負載均衡器、緩存服務(wù)器).RESTful API URI設(shè)計規(guī)范:使用名詞(復(fù)數(shù)形式)表示資源集合,而不是動詞.好:/api/books,/api/users差:/api/getAllBooks,/api/createUser將資源的唯一標識(通常是數(shù)據(jù)庫ID)放在URI路徑中.好:/api/books/1(操作ID為1的圖書)保持URI層級清晰.對于子資源(如某本書的所有評論):/api/books/1/comments(獲取書1的評論)/api/books/1/comments/5(獲取/操作書1下ID為5的評論)使用連字符-提高可讀性,避免下劃線_.版本控制:將API版本號放在URI或頭部中.常見方式:/api/v1/books.6. 數(shù)據(jù)交換格式:JSONJSON(JavaScript Object Notation)已成為現(xiàn)代API數(shù)據(jù)交換的事實標準,因為它輕量、易讀、易解析.JSON基本結(jié)構(gòu):{key1:value1,key2:123,key3:true,key4:null,key5:[item1,item2],key6:{nestedKey:nestedValue}}數(shù)據(jù)以鍵值對形式組織.值可以是字符串(雙引號)、數(shù)字、布爾值、null、數(shù)組(方括號[])或另一個對象(花括號{}).PHP與JSON互轉(zhuǎn):json_encode($php_array_or_object): 將PHP變量轉(zhuǎn)換為JSON字符串.json_decode($json_string, true): 將JSON字符串轉(zhuǎn)換為PHP關(guān)聯(lián)數(shù)組(第二個參數(shù)為true)或?qū)ο?代碼示例示例1:用PHP模擬簡單的HTTP請求與響應(yīng)此示例演示服務(wù)器端如何獲取請求信息并構(gòu)造響應(yīng).?php// 示例:simple_request_response.php// 此腳本模擬一個簡單的端點,根據(jù)不同的查詢參數(shù)返回不同的響應(yīng)// 1. 獲取客戶端請求的方法$requestMethod$_SERVER[REQUEST_METHOD];echo[服務(wù)器日志] 接收到{$requestMethod}請求 ;// 2. 獲取請求的URI$requestUri$_SERVER[REQUEST_URI];echo[服務(wù)器日志] 請求URI:{$requestUri} ;// 3. 獲取查詢字符串參數(shù)(GET參數(shù))// 例如:訪問 /simple_request_response.php?nameJohnage25$name$_GET[name]??未知訪客;// 使用null合并運算符提供默認值$age$_GET[age]??0;// 4. 設(shè)置響應(yīng)頭 - 告訴瀏覽器返回的是純文本,編碼為UTF-8header(Content-Type: text/plain; charsetutf-8);// 5. 根據(jù)請求方法做出不同響應(yīng)switch($requestMethod){caseGET:// 返回一個簡單的問候信息$responseBody你好,{$name};if($age0){$responseBody. 聽說你{$age}歲了.;}// 設(shè)置HTTP狀態(tài)碼為200 OKhttp_response_code(200);break;casePOST:// 對于POST請求,我們嘗試從php://input流中獲取原始數(shù)據(jù)$rawPostDatafile_get_contents(php:// input);$responseBody你發(fā)送了一個POST請求.;if(!empty($rawPostData)){$responseBody. 原始數(shù)據(jù)是: .$rawPostData;}http_response_code(201);// 201 Created, 常用于POST成功break;default:$responseBody本示例僅處理GET和POST請求.;http_response_code(405);// 405 Method Not Allowed// 在響應(yīng)頭中告知客戶端允許哪些方法(這是405狀態(tài)碼的最佳實踐)header(Allow: GET, POST);break;}// 6. 輸出響應(yīng)體echo$responseBody;echo --- 請求處理完畢 --- ;?訪問http:// 你的域名/simple_request_response.php?nameAliceage30,預(yù)期輸出:[服務(wù)器日志] 接收到 GET 請求 [服務(wù)器日志] 請求URI: /simple_request_response.php?nameAliceage30 你好,Alice 聽說你30歲了. --- 請求處理完畢 ---示例2:設(shè)置HTTP狀態(tài)碼和JSON響應(yīng)這是構(gòu)建API接口的核心模式.?php// 示例:api_response_demo.php// 演示如何構(gòu)建一個標準的JSON API響應(yīng)/** * 發(fā)送一個標準的JSON API響應(yīng) * * param mixed $data 要返回的主要數(shù)據(jù) * param int $statusCode HTTP狀態(tài)碼,默認200 * param string|null $message 可選的人類可讀消息 * param array $errors 可選的錯誤詳情數(shù)組 */functionsendJsonResponse($data,$statusCode200,$messagenull,$errors[]){// 首先,設(shè)置HTTP狀態(tài)碼http_response_code($statusCode);// 然后,設(shè)置Content-Type頭為JSON,并指定UTF-8編碼防止中文亂碼header(Content-Type: application/json; charsetutf-8);// 構(gòu)造響應(yīng)體數(shù)組$response[success$statusCode200$statusCode300,// 2xx狀態(tài)碼視為成功message$message,data$data,];// 只有在有錯誤時才包含errors字段if(!empty($errors)){$response[errors]$errors;}// 將PHP數(shù)組編碼為JSON字符串并輸出echojson_encode($response,JSON_UNESCAPED_UNICODE);// JSON_UNESCAPED_UNICODE確保中文不被編碼為u形式exit;// 通常響應(yīng)發(fā)送后終止腳本執(zhí)行}// --- 模擬不同的API場景 ---// 場景1:成功獲取數(shù)據(jù)$books[[id1,titlePHP從入門到精通,author張三],[id2,title深入理解MySQL,author李四],];// sendJsonResponse($books, 200, 圖書列表獲取成功);// 場景2:創(chuàng)建資源成功$newBook[id3,title新書,author王五];// sendJsonResponse($newBook, 201, 圖書創(chuàng)建成功);// 場景3:客戶端請求錯誤(例如,缺少必要參數(shù))$validationErrors[title[標題不能為空],author[作者名稱至少2個字符],];// sendJsonResponse(null, 400, 請求參數(shù)驗證失敗, $validationErrors);// 場景4:資源未找到// sendJsonResponse(null, 404, 請求的圖書不存在);// 場景5:需要認證(模擬)// sendJsonResponse(null, 401, 請先登錄);// 場景6:服務(wù)器內(nèi)部錯誤// sendJsonResponse(null, 500, 服務(wù)器內(nèi)部錯誤,請稍后重試);// 實際演示:讓我們模擬一個獲取圖書詳情成功的場景// 假設(shè)我們收到了請求 GET /api/books/1$requestedBookId1;$foundBooknull;foreach($booksas$book){if($book[id]$requestedBookId){$foundBook$book;break;}}if($foundBook){sendJsonResponse($foundBook,200,圖書詳情獲取成功);}else{sendJsonResponse(null,404,ID為{$requestedBookId}的圖書不存在);}?訪問此腳本,預(yù)期輸出為(因為找到了ID為1的圖書):{success:true,message:圖書詳情獲取成功,data:{id:1,title:PHP從入門到精通,author:張三}}示例3:解析JSON請求體當客戶端(如前端)以JSON格式發(fā)送POST或PUT數(shù)據(jù)時,服務(wù)器端需要正確解析.?php// 示例:handle_json_request.php// 演示如何接收并處理客戶端發(fā)送的JSON請求體// 設(shè)置響應(yīng)為JSON格式header(Content-Type: application/json; charsetutf-8);// 只允許POST方法if($_SERVER[REQUEST_METHOD]!POST){http_response_code(405);echojson_encode([successfalse,message只支持POST方法]);exit;}// 1. 獲取原始的POST數(shù)據(jù)(php://input是一個只讀流,用于讀取請求的原始數(shù)據(jù))$jsonPayloadfile_get_contents(php:// input);// 2. 檢查是否收到了數(shù)據(jù)if(empty($jsonPayload)){http_response_code(400);echojson_encode([successfalse,message請求體不能為空]);exit;}// 3. 將JSON字符串解碼為PHP關(guān)聯(lián)數(shù)組$requestDatajson_decode($jsonPayload,true);// 第二個參數(shù)true得到數(shù)組,false得到對象// 4. 檢查JSON解碼是否成功if(json_last_error()!JSON_ERROR_NONE){http_response_code(400);echojson_encode([successfalse,messageJSON格式無效: .json_last_error_msg()]);exit;}// 5. 假設(shè)我們需要title和author字段if(!isset($requestData[title])||!isset($requestData[author])){http_response_code(422);// 422 Unprocessable Entity 常用于請求格式正確但語義錯誤(如缺少字段)echojson_encode([successfalse,message缺少必要字段,required_fields[title,author]]);exit;}// 6. 模擬處理數(shù)據(jù)(例如,存入數(shù)據(jù)庫)// 這里我們只是簡單地將數(shù)據(jù)返回,并模擬一個生成的ID$newBookIdrand(100,999);$processedData[id$newBookId,titlehtmlspecialchars($requestData[title]),// 簡單過濾,防止XSS(后續(xù)章節(jié)詳解)authorhtmlspecialchars($requestData[author]),created_atdate(Y-m-d H:i:s)];// 7. 返回成功響應(yīng)http_response_code(201);// 201 Createdechojson_encode([successtrue,message圖書創(chuàng)建成功,data$processedData],JSON_UNESCAPED_UNICODE);?如何使用Postman測試此API:URL:http:// 你的域名/handle_json_request.php方法:POST頭部(Headers): 添加Content-Type: application/json體(Body): 選擇raw,然后輸入JSON:{title:HTTP權(quán)威指南,author:David Gourley}點擊發(fā)送,預(yù)期收到類似下面的響應(yīng)(ID是隨機生成的):{success:true,message:圖書創(chuàng)建成功,data:{id:456,title:HTTP權(quán)威指南,author:David Gourley,created_at:2023-10-27 15:30:00}}實戰(zhàn)項目:圖書管理系統(tǒng)API設(shè)計項目需求分析我們將為一個簡單的圖書管理系統(tǒng)設(shè)計并模擬實現(xiàn)一套符合RESTful風(fēng)格的API.該系統(tǒng)需要管理圖書信息,每本圖書包含以下屬性:id(整數(shù), 唯一標識, 通常由數(shù)據(jù)庫自動生成)title(字符串, 書名)author(字符串, 作者)isbn(字符串, 國際標準書號, 可選)published_year(整數(shù), 出版年份, 可選)created_at(時間戳, 創(chuàng)建時間)功能需求:查看圖書列表:支持分頁和簡單篩選(如按作者).查看單本圖書詳情.添加新圖書.更新圖書信息(支持完整更新和部分更新).刪除圖書.API接口設(shè)計文檔遵循RESTful規(guī)范,設(shè)計以下接口:功能HTTP方法端點(URI)描述成功狀態(tài)碼獲取圖書列表GET/api/books獲取所有圖書,支持查詢參數(shù)?authorXXXpage1limit10200 OK獲取圖書詳情GET/api/books/{id}獲取指定ID的圖書詳情200 OK創(chuàng)建圖書POST/api/books創(chuàng)建一本新圖書,數(shù)據(jù)在請求體(JSON)中201 Created完整更新圖書PUT/api/books/{id}更新指定ID的圖書(需提供所有字段)200 OK部分更新圖書PATCH/api/books/{id}更新指定ID的圖書(僅提供需修改的字段)200 OK刪除圖書DELETE/api/books/{id}刪除指定ID的圖書204 No Content分步驟實現(xiàn)與說明我們將創(chuàng)建一個PHP文件來模擬實現(xiàn)這個API(暫不連接真實數(shù)據(jù)庫,使用數(shù)組模擬數(shù)據(jù)存儲).步驟1:創(chuàng)建項目結(jié)構(gòu)并初始化模擬數(shù)據(jù)?php// 項目文件:book_rest_api.php// 這是一個簡化的、單一文件的RESTful API示例,用于演示核心概念.// 第1部分:配置與初始化 // 設(shè)置響應(yīng)頭為JSON,并允許跨域(方便本地前端測試,第6章詳解)header(Content-Type: application/json; charsetutf-8);header(Access-Control-Allow-Origin: *);// 在生產(chǎn)環(huán)境中應(yīng)限制為具體域名header(Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS);header(Access-Control-Allow-Headers: Content-Type);// 如果是OPTIONS請求(CORS預(yù)檢請求),直接返回200if($_SERVER[REQUEST_METHOD]OPTIONS){http_response_code(200);exit;}// 啟用錯誤報告(開發(fā)環(huán)境)error_reporting(E_ALL);ini_set(display_errors,1);// 模擬一個數(shù)據(jù)庫 - 使用全局數(shù)組$books[1[id1,title深入理解計算機系統(tǒng),authorRandal E.Bryant,isbn9787111321330,published_year2010],2[id2,title代碼整潔之道,authorRobert C. Martin,isbn9787121177407,published_year2011],3[id3,titleHTTP權(quán)威指南,authorDavid Gourley,isbn9787115281487,published_year2012],];$nextId4;// 用于模擬自增ID// 輔助函數(shù):發(fā)送JSON響應(yīng)functionsendJson($data,$statusCode200,$message){http_response_code($statusCode);$response[success$statusCode200$statusCode300];if($message){$response[message]$message;}$response[data]$data;echojson_encode($response,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);exit;}// 獲取當前請求的HTTP方法$method$_SERVER[REQUEST_METHOD];// 解析請求路徑.在實際框架中,這部分由路由組件完成.$pathparse_url($_SERVER[REQUEST_URI],PHP_URL_PATH);// 我們簡單地從路徑中提取ID.更復(fù)雜的路由需要正則匹配.$pathPartsexplode(/,$path);$requestedIdnull;if(isset($pathParts[3])is_numeric($pathParts[3])){// 假設(shè)路徑是 /api/books/1$requestedId(int)$pathParts[3];}?步驟2:實現(xiàn)路由分發(fā)(根據(jù)HTTP方法和路徑?jīng)Q定執(zhí)行什么操作)?php// 第2部分:路由分發(fā)與核心邏輯 // 注意:這是一個非常簡化的路由.真實項目應(yīng)使用框架的路由器.// 定義資源基礎(chǔ)路徑$basePath/api/books;// 檢查請求是否針對我們的APIif(strpos($path,$basePath)0){// 處理 /api/books 集合資源if($path$basePath||$path$basePath./){handleBookCollection($method,$books,$nextId);}// 處理 /api/books/{id} 單個資源elseif($requestedId!null){handleSingleBook($method,$requestedId,$books,$nextId);}else{sendJson(null,404,接口路徑不存在);}}else{sendJson(null,404,歡迎使用圖書管理API,請訪問 /api/books);}// 第3部分:具體請求處理函數(shù) /** * 處理針對圖書集合(/api/books)的請求 */functionhandleBookCollection($method,$books,$nextId){global$books,$nextId;// 使用全局變量模擬數(shù)據(jù)存儲(實際應(yīng)用中應(yīng)操作數(shù)據(jù)庫)switch($method){caseGET:// 獲取圖書列表// 模擬分頁和過濾$authorFilter$_GET[author]??null;$filteredBooksarray_values($books);// 獲取所有書籍的值if($authorFilter){$filteredBooksarray_filter($filteredBooks,function($book)use($authorFilter){returnstripos($book[author],$authorFilter)!false;});$filteredBooksarray_values($filteredBooks);// 重置索引}sendJson($filteredBooks,200,圖書列表獲取成功);break;casePOST:// 創(chuàng)建新圖書$inputDatajson_decode(file_get_contents(php:// input),true);if(json_last_error()!JSON_ERROR_NONE){sendJson(null,400,無效的JSON格式);}// 驗證必要字段if(empty($inputData[title])||empty($inputData[author])){sendJson(null,422,缺少必要字段:title 和 author 是必填的);}// 創(chuàng)建新圖書對象$newBook[id$nextId,titlehtmlspecialchars($inputData[title]),authorhtmlspecialchars($inputData[author]),isbnhtmlspecialchars($inputData[isbn]??),published_yearisset($inputData[published_year])?(int)$inputData[published_year]:null,created_atdate(Y-m-d H:i:s)];// 保存到模擬數(shù)據(jù)庫$books[$nextId]$newBook;$nextId;sendJson($newBook,201,圖書創(chuàng)建成功);break;default:// 不允許的方法header(Allow: GET, POST);sendJson(null,405,不允許的請求方法);break;}}/** * 處理針對單本圖書(/api/books/{id})的請求 */functionhandleSingleBook($method,$id,$books,$nextId){global$books;// 檢查圖書是否存在if(!isset($books[$id])){sendJson(null,404,ID為{$id}的圖書不存在);}$book$books[$id];// 引用,便于直接修改switch($method){caseGET:// 獲取圖書詳情sendJson($book,200,圖書詳情獲取成功);break;casePUT:// 完整更新 - 需要提供所有字段$inputDatajson_decode(file_get_contents(php:// input),true);if(json_last_error()!JSON_ERROR_NONE){sendJson(null,400,無效的JSON格式);}// 驗證所有必需字段(根據(jù)你的業(yè)務(wù)邏輯定義)$requiredFields[title,author];foreach($requiredFieldsas$field){if(!isset($inputData[$field])){sendJson(null,422,字段 {$field} 是必填的(PUT要求完整更新));}}// 執(zhí)行完整更新$book[title]htmlspecialchars($inputData[title]);$book[author]htmlspecialchars($inputData[author]);$book[isbn]htmlspecialchars($inputData[isbn]??$book[isbn]);// 保持原值或更新$book[published_year]isset($inputData[published_year])?(int)$inputData[published_year]:$book[published_year];$book[updated_at]date(Y-m-d H:i:s);// 添加更新時間戳sendJson($book,200,圖書信息已完整更新);break;casePATCH:// 部分更新 - 只更新提供的字段$inputDatajson_decode(file_get_contents(php:// input),true);if(json_last_error()!JSON_ERROR_NONE){sendJson(null,400,無效的JSON格式);}// 如果沒有提供任何可更新的字段$updatableFields[title,author,isbn,published_year];$hasUpdatefalse;foreach($updatableFieldsas$field){if(array_key_exists($field,$inputData)){// 使用array_key_exists,因為值可能為null$book[$field]is_string($inputData[$field])?htmlspecialchars($inputData[$field]):$inputData[$field];$hasUpdatetrue;}}if(!$hasUpdate){sendJson(null,400,未提供任何可更新的字段);}$book[updated_at]date(Y-m-d H:i:s);sendJson($book,200,圖書信息已部分更新);break;caseDELETE:// 刪除圖書unset($books[$id]);// 返回204 No Content,通常沒有響應(yīng)體http_response_code(204);// 可以輸出一個空響應(yīng),或者直接exitexit;break;default:header(Allow: GET, PUT, PATCH, DELETE);sendJson(null,405,不允許的請求方法);break;}}?項目測試指南使用Postman對實現(xiàn)的API進行全面測試:測試1:獲取所有圖書方法:GETURL:http:// 你的域名/book_rest_api.php/api/books預(yù)期響應(yīng):包含3本初始圖書的JSON數(shù)組,狀態(tài)碼200.測試2:按作者過濾圖書方法:GETURL:http:// 你的域名/book_rest_api.php/api/books?authorDavid預(yù)期響應(yīng):僅包含作者名包含David的圖書.測試3:獲取單本圖書詳情方法:GETURL:http:// 你的域名/book_rest_api.php/api/books/2預(yù)期響應(yīng):ID為2的圖書詳情,狀態(tài)碼200.測試4:創(chuàng)建新圖書(POST)方法:POSTURL:http:// 你的域名/book_rest_api.php/api/books頭部:Content-Type: application/jsonBody(raw JSON):{title:設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ),author:Erich Gamma,isbn:9787111618331,published_year:2019}預(yù)期響應(yīng):狀態(tài)碼201,響應(yīng)體中包含新創(chuàng)建的圖書信息(帶有新ID).測試5:完整更新圖書(PUT)方法:PUTURL:http:// 你的域名/book_rest_api.php/api/books/1(更新第一本書)頭部:Content-Type: application/jsonBody:{title:深入理解計算機系統(tǒng)(原書第3版),author:Randal E.Bryant David R.OHallaron,isbn:9787111544937,published_year:2016}預(yù)期響應(yīng):狀態(tài)碼200,返回更新后的完整圖書信息.隨后用GET請求驗證.測試6:部分更新圖書(PATCH)方法:PATCHURL:http:// 你的域名/book_rest_api.php/api/books/1頭部:Content-Type: application/jsonBody:{published_year:2022}預(yù)期響應(yīng):狀態(tài)碼200,返回的圖書信息中僅published_year和updated_at字段被修改.測試7:刪除圖書(DELETE)方法:DELETEURL:http:// 你的域名/book_rest_api.php/api/books/3預(yù)期響應(yīng):狀態(tài)碼204,無響應(yīng)體.隨后用GET/api/books或 GET/api/books/3驗證已刪除(應(yīng)返回404).測試8:錯誤處理測試獲取不存在的圖書:GET /api/books/999- 應(yīng)返回404.用錯誤方法請求:POST /api/books/1- 應(yīng)返回405,并在Allow頭中告知允許的方法.發(fā)送無效JSON:POST /api/books但Body是{invalid json- 應(yīng)返回400.創(chuàng)建時缺少必填字段:POST /api/books只提供{title: 書}- 應(yīng)返回422.項目部署入門(簡易)為了讓你的API能被他人(或你的前端頁面)通過網(wǎng)絡(luò)訪問,你需要將其部署到服務(wù)器.這里提供一個最基礎(chǔ)的本地模擬部署概念:本地服務(wù)器:使用你在第1章安裝的XAMPP或PHPStudy.將book_rest_api.php文件放入Web服務(wù)器的根目錄(如XAMPP的htdocs文件夾).確保Apache服務(wù)正在運行.在瀏覽器或Postman中,通過http:// localhost/book_rest_api.php/api/books即可訪問你的API.虛擬主機/云服務(wù)器(概念):購買一個域名和虛擬主機(支持PHP和MySQL).使用FTP工具(如FileZilla)將你的PHP文件上傳到主機商指定的目錄(通常是public_html或htdocs).通過你的域名(如http:// yourdomain.com/book_rest_api.php/api/books)訪問API.注意:生產(chǎn)環(huán)境需要考慮安全性(關(guān)閉錯誤顯示)、性能、數(shù)據(jù)庫連接等,這將在第6章進一步探討.最佳實踐RESTful API設(shè)計規(guī)范總結(jié)使用名詞,而非動詞:URI標識資源,HTTP動詞定義操作.正確使用HTTP狀態(tài)碼:這是API與客戶端溝通的語言,務(wù)必準確.版本化你的API:將版本號(如v1)納入URI(/api/v1/books)或通過請求頭(如Accept: application/vnd.myapp.v1json)管理.這為未來不兼容的變更提供回旋余地.提供清晰的文檔:使用工具如Swagger/OpenAPI自動生成API文檔,或至少維護一個清晰的Markdown文檔.一致的命名約定:URI使用小寫字母、連字符-分隔單詞.字段名使用蛇形命名法(snake_case)或駝峰命名法(camelCase),但整個API應(yīng)保持一致.使用合適的HTTP方法:牢記GET(讀)、POST(創(chuàng))、PUT(全更新)、PATCH(部分更新)、DELETE(刪)的語義.合理的分頁、過濾和排序:對于返回列表的接口(如GET /api/books),必須支持分頁(?page1limit20)以避免返回海量數(shù)據(jù).同時提供過濾(?authorxxx)和排序(?sort-created_at)參數(shù).返回標準化的響應(yīng)格式:如本章示例所示,使用一個包含success,message,data等字段的包裝結(jié)構(gòu),使錯誤處理標準化.常見錯誤與避坑指南錯誤1:用GET方法執(zhí)行修改操作.現(xiàn)象:GET /api/books/delete/1.問題:GET是安全且冪等的,可能被瀏覽器預(yù)加載、緩存,導(dǎo)致意外刪除.搜索引擎爬蟲也可能觸發(fā)此操作.修正:使用DELETE /api/books/1.錯誤2:忽略狀態(tài)碼,所有響應(yīng)都返回200.現(xiàn)象:即使資源未找到(404)或服務(wù)器錯誤(500),也返回{code: 404, message: ...},但HTTP狀態(tài)碼是200.問題:破壞了HTTP協(xié)議語義,客戶端(如瀏覽器、負載均衡器)無法根據(jù)狀態(tài)碼進行標準處理(如重試、緩存、錯誤頁面).修正:永遠優(yōu)先使用正確的HTTP狀態(tài)碼,然后在響應(yīng)體中提供更詳細的錯誤信息.錯誤3:在URI中使用動詞.現(xiàn)象:/api/getBooks,/api/createUser.問題:不符合RESTful風(fēng)格,URI冗長且不直觀.修正:使用資源名HTTP方法:GET /api/books,POST /api/users.錯誤4:不處理跨域請求(CORS).現(xiàn)象:當你的前端頁面(運行在http:// localhost:3000)嘗試調(diào)用后端API(http://localhost:80)時,瀏覽器控制臺報CORS錯誤.問題:瀏覽器的同源策略阻止了跨域請求.修正:在API的響應(yīng)頭中添加Access-Control-Allow-Origin等CORS頭(如本章示例所示).更安全的做法是在生產(chǎn)環(huán)境中指定確切的來源域名.安全性考慮與漏洞案例(針對本章知識)雖然全面的API安全(如JWT認證、SQL注入防護)將在第5章深入講解,但基于HTTP協(xié)議和基本開發(fā),現(xiàn)在就需要建立安全意識.案例:缺少輸入驗證導(dǎo)致潛在XSS(跨站腳本攻擊)漏洞場景:在POST /api/books接口中,我們接收title和author字段,但未對內(nèi)容進行任何過濾,直接存儲并可能在管理頁面上顯示.攻擊模擬:攻擊者發(fā)送一個創(chuàng)建圖書的請求:{title:一本好書scriptalert(XSS攻擊)/script,author:黑客}- 如果后端直接存儲了這個title,并且前端在顯示圖書列表時未做轉(zhuǎn)義,直接使用innerHTML,那么任何查看圖書列表的用戶瀏覽器都會執(zhí)行alert(XSS攻擊)腳本. - 更危險的腳本可以竊取用戶的Cookie(如果未設(shè)置HttpOnly)或進行其他惡意操作.防護代碼(基礎(chǔ)):?php// 在接收用戶輸入后,進行基本的HTML轉(zhuǎn)義// 使用 htmlspecialchars 函數(shù)$titlehtmlspecialchars($inputData[title],ENT_QUOTES,UTF-8);$authorhtmlspecialchars($inputData[author],ENT_QUOTES,UTF-8);// 存入數(shù)據(jù)庫的是轉(zhuǎn)義后的安全文本// 當這些數(shù)據(jù)被輸出到HTML頁面時,它們將被視為純文本,而不是可執(zhí)行的HTML/JS代碼.?**注意**:htmlspecialchars是輸出到HTML上下文時的防護措施.對于API,更關(guān)鍵的是要明確數(shù)據(jù)的用途.如果API只是將數(shù)據(jù)返回給客戶端,而客戶端決定如何渲染(是作為HTML還是純文本),那么API端進行轉(zhuǎn)義可能不總是合適的.**最佳實踐是在使用的上下文進行編碼**.對于API,應(yīng)通過文檔告知客戶端哪些字段可能包含用戶輸入,建議前端在渲染時自行轉(zhuǎn)義.但對于簡單的演示和防止自身管理界面被攻擊,在入庫前轉(zhuǎn)義也是一種防御深度.案例:不安全的直接文件訪問漏洞場景:你的API文件book_rest_api.php可能包含數(shù)據(jù)庫密碼等敏感配置信息(雖然我們示例中沒用).攻擊模擬:攻擊者直接訪問http:// yoursite.com/config.php.防護:將配置文件放在Web根目錄之外.在包含敏感信息的PHP文件開頭添加if (!defined(IN_APP)) { die(Access Denied); },并通過一個入口文件(如index.php)定義常量后包含它.配置Web服務(wù)器(如Apache的.htaccess)阻止對特定文件的直接訪問.練習(xí)題與挑戰(zhàn)基礎(chǔ)練習(xí)題題目:HTTP狀態(tài)碼分類描述:請列出5個常見的HTTP狀態(tài)碼(每個類別選一個:2xx, 3xx, 4xx, 4xx, 5xx),并分別簡要說明其含義和典型應(yīng)用場景.難度:★☆☆☆☆提示:參考本章常見HTTP狀態(tài)碼表格.參考答案:200 OK:請求成功.一般用于GET、PUT、PATCH請求成功后的響應(yīng).301 Moved Permanently:請求的資源已被永久移動到新URI.瀏覽器會自動重定向到新地址.400 Bad Request:客戶端請求有語法錯誤,服務(wù)器無法理解.常用于參數(shù)格式錯誤.404 Not Found:服務(wù)器無法找到請求的資源.用于URI指向不存在的資源.500 Internal Server Error:服務(wù)器內(nèi)部錯誤,無法完成請求.用于未捕獲的服務(wù)器端異常.題目:RESTful URI設(shè)計描述:為一個博客系統(tǒng)設(shè)計滿足以下功能的RESTful API URI(只寫URI,不寫方法):1. 獲取所有文章列表.2. 獲取ID為5的文章詳情.3. 創(chuàng)建一篇新文章.4. 更新ID為5的文章的標題和內(nèi)容.5. 刪除ID為5的文章.6. 獲取ID為5的文章下的所有評論.7. 為ID為5的文章添加一條新評論.難度:★★☆☆☆提示:資源是文章和評論,注意層級關(guān)系.參考答案:/api/articles/api/articles/5/api/articles/api/articles/5(使用PUT或PATCH方法)/api/articles/5/api/articles/5/comments/api/articles/5/comments進階練習(xí)題題目:用PHP讀取并響應(yīng)HTTP請求頭描述:編寫一個PHP腳本check_headers.php.當用戶訪問時,該腳本應(yīng)檢查請求頭中是否包含Accept頭,并且其值包含application/json.如果包含,則返回JSON格式的響應(yīng){message: 你接受JSON格式},狀態(tài)碼200;如果不包含或值不是JSON,則返回純文本響應(yīng)請使用接受JSON格式的客戶端(如Postman)訪問,狀態(tài)碼406(Not Acceptable).難度:★★★☆☆提示:使用$_SERVER[‘HTTP_ACCEPT’]獲取Accept請求頭.使用strpos函數(shù)判斷是否包含application/json.使用http_response_code和header函數(shù)設(shè)置狀態(tài)碼和內(nèi)容類型.參考答案:?php$acceptHeader$_SERVER[HTTP_ACCEPT]??;if(strpos($acceptHeader,application/json)!false){header(Content-Type: application/json);http_response_code(200);echojson_encode([message你接受JSON格式]);}else{header(Content-Type: text/plain; charsetutf-8);http_response_code(406);echo請使用接受JSON格式的客戶端(如Postman)訪問;}?題目:模擬PATCH請求的部分更新邏輯描述:基于本章的book_rest_api.php示例,假設(shè)現(xiàn)在圖書資源新增了一個price(價格,浮點數(shù))字段.請補充handleSingleBook函數(shù)中PATCH方法的處理邏輯,使其能夠正確地僅更新客戶端提供的price字段(如果提供了的話),同時保持其他字段不變.需要考慮如果提供的price不是有效數(shù)字的處理.難度:★★★☆☆提示:擴展$updatableFields數(shù)組,并在更新price前使用is_numeric或filter_var進行驗證.參考答案(補充部分):// 在handleSingleBook函數(shù)的PATCH case中,修改如下:$updatableFields[title,author,isbn,published_year,price];$hasUpdatefalse;foreach($updatableFieldsas$field){if(array_key_exists($field,$inputData)){// 特別處理price字段if($fieldprice){if(!is_numeric($inputData[price])){sendJson(null,422,字段 price 必須是有效的數(shù)字);}$book[$field](float)$inputData[price];}else{$book[$field]is_string($inputData[$field])?htmlspecialchars($inputData[$field]):$inputData[$field];}$hasUpdatetrue;}}綜合挑戰(zhàn)題題目:設(shè)計并模擬實現(xiàn)用戶收藏API描述:在圖書管理系統(tǒng)的基礎(chǔ)上,擴展功能,允許用戶(我們先假設(shè)用戶已通過某種方式認證,用戶ID為user_id)收藏圖書.你需要設(shè)計新的API接口,并修改book_rest_api.php,用一個模擬數(shù)組$userFavorites(鍵為用戶ID,值為該用戶收藏的圖書ID數(shù)組)來模擬此功能.需求:設(shè)計接口:設(shè)計用戶收藏相關(guān)的RESTful API(方法、URI、描述).考慮如何表示用戶1收藏圖書2這個關(guān)系.實現(xiàn)功能:在現(xiàn)有代碼中,至少實現(xiàn)兩個核心接口:POST /api/users/{user_id}/favorites:用戶收藏一本圖書.請求體需包含book_id.需檢查圖書是否存在,以及是否已收藏.GET /api/users/{user_id}/favorites:獲取用戶收藏的所有圖書詳情列表(需要從$books中取出對應(yīng)ID的完整圖書信息).錯誤處理:對重復(fù)收藏、收藏不存在的圖書等情況返回合適的狀態(tài)碼和錯誤信息.難度:★★★★☆提示:這是一個用戶和圖書之間的多對多關(guān)系.在設(shè)計URI時,可以將其視為用戶的子資源favorites.實現(xiàn)時,注意修改全局模擬數(shù)據(jù)數(shù)組.參考答案(部分核心邏輯):?php// 新增模擬數(shù)據(jù)$userFavorites[1[2,3],// 用戶1收藏了圖書2和3];// 在路由分發(fā)部分,需要新增對/api/users/{id}/favorites路徑的判斷和相應(yīng)處理函數(shù)調(diào)用.// 處理函數(shù)示例片段:functionhandleUserFavorites($method,$userId,$userFavorites,$books){$userId(int)$userId;// 初始化用戶收藏夾(如果不存在)if(!isset($userFavorites[$userId])){$userFavorites[$userId][];}switch($method){caseGET:$favoriteBooks[];foreach($userFavorites[$userId]as$bookId){if(isset($books[$bookId])){$favoriteBooks[]$books[$bookId];}}sendJson($favoriteBooks,200,獲取收藏列表成功);break;casePOST:$inputjson_decode(file_get_contents(php:// input),true);$bookId$input[book_id]??null;if(!$bookId||!is_numeric($bookId)){sendJson(null,400,必須提供有效的book_id);}$bookId(int)$bookId;// 檢查圖書是否存在if(!isset($books[$bookId])){sendJson(null,404,圖書不存在);}// 檢查是否已收藏if(in_array($bookId,$userFavorites[$userId])){sendJson(null,409,該圖書已收藏);// 409 Conflict}// 執(zhí)行收藏$userFavorites[$userId][]$bookId;sendJson([user_id$userId,book_id$bookId],201,收藏成功);break;// 可以繼續(xù)實現(xiàn)DELETE取消收藏等default:header(Allow: GET, POST, DELETE);sendJson(null,405,不允許的請求方法);}}?章節(jié)總結(jié)本章重點知識回顧HTTP協(xié)議是Web通信的基石:理解了客戶端-服務(wù)器模型、無狀態(tài)、請求/響應(yīng)報文結(jié)構(gòu).HTTP動詞定義操作:GET(取)、POST(創(chuàng))、PUT(全更新)、PATCH(部分更新)、DELETE(刪),并理解了冪等性與安全性的概念.HTTP狀態(tài)碼是結(jié)果的語言:熟練掌握了2xx(成功)、4xx(客戶端錯誤)、5xx(服務(wù)器錯誤)系列中的常見狀態(tài)碼及其應(yīng)用場景.頭部(Headers)攜帶元數(shù)據(jù):掌握了關(guān)鍵的Content-Type,Accept,Authorization等頭部的用法.RESTful是一種優(yōu)雅的設(shè)計風(fēng)格:學(xué)會了以資源為中心設(shè)計URI,使用標準的HTTP方法操作資源,使API直觀、易用、符合行業(yè)規(guī)范.JSON是現(xiàn)代API的數(shù)據(jù)通用語:學(xué)會了在PHP中使用json_encode和json_decode處理JSON數(shù)據(jù).技能掌握要求學(xué)完本章后,你應(yīng)該能夠:解讀:使用瀏覽器開發(fā)者工具或Postman,分析任何一個網(wǎng)站的HTTP請求與響應(yīng),理解其使用的方-法、狀態(tài)碼和頭部信息.設(shè)計:為一個新的業(yè)務(wù)需求(如商品管理、“訂單系統(tǒng)”)設(shè)計出一套符合RESTful風(fēng)格的API接口文檔.實現(xiàn):在不依賴框架的情況下,使用PHP編寫能夠處理不同HTTP方法、接收JSON數(shù)據(jù)、返回標準JSON響應(yīng)并設(shè)置正確狀態(tài)碼的簡單API端點.測試:熟練使用Postman等工具,對你設(shè)計的API進行全面的測試,包括成功用例和各類錯誤用例.進一步學(xué)習(xí)建議深入了解HTTP:閱讀RFC 7230等HTTP/1.1標準文檔的部分章節(jié),或閱讀《HTTP權(quán)威指南》一書,以更深入地理解協(xié)議細節(jié)(如緩存、連接管理).探索API設(shè)計進階話題:學(xué)習(xí)HATEOAS(超媒體作為應(yīng)用狀態(tài)引擎)、GraphQL作為一種替代REST的API查詢語言.準備進入實戰(zhàn):你已經(jīng)掌握了構(gòu)建API所需的所有理論規(guī)則.下一章,我們將把這些規(guī)則與第2章的數(shù)據(jù)庫知識結(jié)合起來,真正動手構(gòu)建一個連接數(shù)據(jù)庫的、完整的API項目.建議你在學(xué)習(xí)第4章前,復(fù)習(xí)一下第2章的PDO數(shù)據(jù)庫操作,并確保你的開發(fā)環(huán)境已準備好MySQL數(shù)據(jù)庫.恭喜你你已經(jīng)理解了Web世界最核心的對話規(guī)則.現(xiàn)在,是時候開始用代碼編寫屬于你自己的對話了.讓我們進入第4章,開啟API構(gòu)建之旅
版權(quán)聲明: 本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請聯(lián)系我們進行投訴反饋,一經(jīng)查實,立即刪除!

做網(wǎng)站的免費空間東莞網(wǎng)站建設(shè)服務(wù)首

做網(wǎng)站的免費空間,東莞網(wǎng)站建設(shè)服務(wù)首,域名及密碼登錄域名管理網(wǎng)站,網(wǎng)站前端做報名框遠洋船舶航行日志語音記錄輔助系統(tǒng) 在遠洋航行中#xff0c;一場突如其來的風(fēng)暴、一次主機異常降速#xff0c;或是夜間

2026/01/23 03:56:01

建設(shè)網(wǎng)站聯(lián)盟wordpress網(wǎng)站云備份

建設(shè)網(wǎng)站聯(lián)盟,wordpress網(wǎng)站云備份,珠海網(wǎng)站建設(shè)小小網(wǎng)絡(luò),做免費網(wǎng)站怎么賺錢的企業(yè)級3D抽獎系統(tǒng)重構(gòu)指南#xff1a;打造震撼視覺互動體驗 【免費下載鏈接】log-lottery #x1f38

2026/01/23 15:59:01

網(wǎng)站定制北京網(wǎng)站蜘蛛爬行

網(wǎng)站定制北京,網(wǎng)站蜘蛛爬行,廣州百度網(wǎng)站建設(shè)公司,河南建網(wǎng)站還在為直播、會議或娛樂場景中的音頻播放而煩惱嗎#xff1f;Soundux這款開源跨平臺聲板應(yīng)用或許正是你需要的解決方案。作為一個專為現(xiàn)代化

2026/01/23 02:48:01

網(wǎng)站收錄怎么提高石家莊的網(wǎng)站開發(fā)公司

網(wǎng)站收錄怎么提高,石家莊的網(wǎng)站開發(fā)公司,諾爾諾達網(wǎng)站建設(shè),開發(fā)網(wǎng)站需要什么語言在數(shù)字創(chuàng)意產(chǎn)業(yè)高速發(fā)展的今天#xff0c;3D內(nèi)容制作正面臨前所未有的效率瓶頸。傳統(tǒng)建模流程不僅需要專業(yè)技能#xff0c;

2026/01/21 17:48:02

免費做網(wǎng)站tk新聞發(fā)稿計劃

免費做網(wǎng)站tk,新聞發(fā)稿計劃,成都網(wǎng)站制作服務(wù),最新域名網(wǎng)站文章目錄社區(qū)醫(yī)院管理系統(tǒng)一、項目簡介#xff08;源代碼在文末#xff09;1.運行視頻2.#x1f680; 項目技術(shù)棧3.? 環(huán)境要求說明

2026/01/21 19:12:02