รูปร่างบ้า คำอธิบายของออบเจ็กต์การตอบสนอง html การตอบสนองของ Savage
หากต้องการรับอินสแตนซ์ของคลาสนี้ ให้ใช้การเรียกเมธอด wa()->getResponse() เช่น:
Wa()->getResponse()->getHeader("ประเภทเนื้อหา")
วิธีการ
งานสาธารณะ addCss ($url, $app_id = เท็จ)
เพิ่ม URL ในรายการไฟล์ CSS URL ไฟล์ CSS ที่เพิ่มทั้งหมดสามารถเรียกค้นได้ในเทมเพลต Smarty โดยใช้วิธี ($wa->css())
ตัวเลือก
- $url
URL สัมพัทธ์ของไฟล์ CSS หากระบุค่าของพารามิเตอร์ $app_id ควรระบุ URL ของไฟล์โดยสัมพันธ์กับ URL ของไดเร็กทอรีที่มีไฟล์ของแอปพลิเคชันที่เกี่ยวข้อง มิฉะนั้น ควรระบุ URL แบบสัมพันธ์โดยสัมพันธ์กับไดเร็กทอรีการติดตั้งเฟรมเวิร์ก
- $app_id
รหัสแอปพลิเคชัน
ตัวอย่าง
วา()->getResponse()->addCss("css/myapp.css", "myapp");งานสาธารณะ เพิ่ม GoogleAnalytics ($str)
เพิ่มข้อมูลโค้ด JavaScript สำหรับ Google Analytics รหัสของ Googleการวิเคราะห์ (รวมถึงที่เพิ่มโดยวิธีนี้) เชื่อมต่ออยู่ในเทมเพลต HTML ของไซต์โดยใช้วิธี ($wa->headJs())
ตัวเลือก
- $str
ส่วนโค้ด JavaScript
งานสาธารณะ เพิ่มส่วนหัว ($name, $value, $replace = true)
เพิ่มส่วนหัวที่เซิร์ฟเวอร์จะถูกส่งเพื่อตอบสนองต่อคำขอของผู้ใช้ ส่วนหัวทั้งหมดที่เพิ่มด้วยวิธีนี้จะถูกส่งไปยังผู้ใช้เมื่อมีการดำเนินการวิธีการนี้
ตัวเลือก
- $ชื่อ
ชื่อหัวเรื่อง.
- $value
ค่าชื่อเรื่อง
- $แทนที่
ธงบ่งชี้ความจำเป็นในการเปลี่ยนก่อนหน้านี้ ตั้งค่าสำหรับส่วนหัวที่ระบุ
ตัวอย่าง
wa()->getResponse()->addHeader("ประเภทเนื้อหา", "application/json");งานสาธารณะ เพิ่มJs ($url, $app_id = เท็จ)
เพิ่ม URL ในรายการไฟล์ JavaScript URL ไฟล์ JavaScript ที่เพิ่มทั้งหมดสามารถเรียกค้นได้ในเทมเพลต Smarty โดยใช้วิธี ($wa->js())
ตัวเลือก
- $url
URL ของไฟล์ที่มีโค้ด JavaScript หากระบุค่าของพารามิเตอร์ $app_id ควรระบุ URL ของไฟล์โดยสัมพันธ์กับ URL ของไดเร็กทอรีที่มีไฟล์ของแอปพลิเคชันที่เกี่ยวข้อง มิฉะนั้น ควรระบุ URL แบบสัมพันธ์โดยสัมพันธ์กับไดเร็กทอรีการติดตั้งเฟรมเวิร์ก
- $app_id
รหัสแอปพลิเคชัน
ตัวอย่าง
วา()->getResponse()->addJs("js/myapp.js", "myapp");งานสาธารณะ getCss ($html = จริง, $เข้มงวด = เท็จ)
ส่งคืนรายการลิงก์ไฟล์ CSS ที่เพิ่มไว้ก่อนหน้านี้
ตัวเลือก
- $html
แฟล็กระบุความจำเป็นในการส่งคืนโค้ด HTML สำหรับการเชื่อมต่อไฟล์ CSS หากระบุเป็นเท็จ วิธีการจะส่งกลับอาร์เรย์ของ URL สำหรับไฟล์ดังกล่าว
- $เข้มงวด
ตั้งค่าสถานะเพื่อใช้รูปแบบ XHTML แทน HTML เมื่อ $html ถูกตั้งค่าเป็นจริง
ตัวอย่าง
วา()->getResponse()->getCss();งานสาธารณะ getHeader ($ชื่อ = โมฆะ)
ส่งกลับค่าของส่วนหัวการตอบกลับ
ตัวเลือก
- $ชื่อ
ID ของส่วนหัวซึ่งมีค่าที่จะถูกส่งกลับ หากไม่ได้ระบุไว้ วิธีการจะส่งกลับอาร์เรย์ส่วนหัวปัจจุบันทั้งหมด
ตัวอย่าง
wa()->getResponse()->addHeader("ประเภทเนื้อหา", "application/json"); wa()->getResponse()->getHeader("ประเภทเนื้อหา");ผลลัพธ์
แอปพลิเคชัน/jsonงานสาธารณะ รับจ ($html = จริง)
ส่งคืนรายการลิงก์ไฟล์ตอบกลับ JavaScript
ตัวเลือก
- $html
ธงทางเลือกที่บ่งชี้ถึงความจำเป็นในการส่งคืนโค้ด HTML สำหรับการเชื่อมต่อไฟล์ JavaScript มิฉะนั้นเมธอดจะส่งกลับอาร์เรย์ปัจจุบันของ URL ของไฟล์
ตัวอย่าง
วา()->getResponse()->getJs();งานสาธารณะ getMeta ($ชื่อ = โมฆะ)
ส่งกลับเนื้อหาของข้อมูล META: ชื่อหน้า ("ชื่อ") คำหลักแท็ก META ("คำหลัก") คำอธิบาย ("คำอธิบาย")
ตัวเลือก
- $ชื่อ
ตัวระบุองค์ประกอบข้อมูล META ที่มีค่าที่จะถูกส่งกลับ หากไม่ได้ระบุไว้ วิธีการนี้จะส่งคืนอาร์เรย์ข้อมูล META ปัจจุบันทั้งหมด
ตัวอย่าง
วา()->getResponse()->getMeta("คำหลัก");งานสาธารณะ รับสถานะ()
ส่งกลับสถานะการตอบสนองของเซิร์ฟเวอร์ที่ตั้งไว้ก่อนหน้านี้
ตัวอย่าง
วา()->getResponse()->setStatus(200); วา()->getResponse()->getStatus();ผลลัพธ์
200งานสาธารณะ getTitle()
ส่งกลับชื่อเรื่อง (TITLE) ของหน้า
ตัวอย่าง
wa()->getResponse()->setTitle("ร้านค้าออนไลน์ของฉัน"); วา()->getResponse()->getTitle();ผลลัพธ์
ร้านค้าออนไลน์ของฉันงานสาธารณะ เปลี่ยนเส้นทาง ($url, $code = null)
เปลี่ยนเส้นทางผู้ใช้ไปยัง URL ที่ระบุ
ตัวเลือก
- $url
URL ที่ผู้ใช้ควรถูกเปลี่ยนเส้นทาง
- $รหัส
รหัสตอบกลับของเซิร์ฟเวอร์ที่ควรมาพร้อมกับการเปลี่ยนเส้นทาง
ตัวอย่าง
วา()->getResponse()->เปลี่ยนเส้นทาง("http://otherdomain.ru/", 301);งานสาธารณะ sendHeaders()
ส่งส่วนหัวที่ตั้งไว้ก่อนหน้านี้
ตัวอย่าง
wa()->getResponse()->addHeader("ประเภทเนื้อหา", "application/json"); วา()->getResponse()->sendHeaders();งานสาธารณะ ตั้งค่าคุกกี้ ($name, $value, $expire = null, $path = null, $domain = "", $secure = false, $http_only = false)
ตั้งค่าของรายการคุกกี้โดยใช้ฟังก์ชัน setcookie PHP
ตัวเลือก
- $ชื่อ
รหัสบันทึก
- $value
บันทึกมูลค่า
- $หมดอายุ
เวลาหมดอายุ
- $เส้นทาง
เส้นทางไปยัง URI "ไดเรกทอรีย่อย" ซึ่งค่าของรายการนั้นถูกต้อง
- $โดเมน
ชื่อโดเมนซึ่งค่าที่ป้อนนั้นถูกต้อง
- $ปลอดภัย
แฟล็กที่ระบุว่ารายการจะพร้อมใช้งานเฉพาะเมื่อมีการโอนค่าผ่านโปรโตคอล HTTPS
- $http_เท่านั้น
ธงที่ระบุว่าค่าบันทึกสามารถเข้าถึงได้ผ่านโปรโตคอล HTTP เท่านั้น และไม่สามารถเข้าถึงได้ผ่านสคริปต์ไคลเอ็นต์ (JavaScript)
ตัวอย่าง
wa()->getResponse()->setCookie("code", $code, time() + 30 * 86400, null, "", false, true);งานสาธารณะ setMeta ($ชื่อ, $value = null)
ตั้งค่าข้อมูล META ค่านี้มีอยู่ในเทมเพลต Smarty โดยใช้วิธี ($wa->meta())
ตัวเลือก
- $ชื่อ
ตัวระบุองค์ประกอบข้อมูล META: ชื่อหน้า ("ชื่อ") คำสำคัญแท็ก META ("คำหลัก") และคำอธิบาย ("คำอธิบาย")
- $value
ค่าองค์ประกอบ
ตัวอย่าง
wa()->getResponse()->setMeta("คำหลัก", $คำหลัก);งานสาธารณะ ตั้งค่าสถานะ ($รหัส)
ตั้งค่าสถานะการตอบสนองของเซิร์ฟเวอร์
ตัวเลือก
- $รหัส
รหัสสถานะ
ตัวอย่าง
วา()->getResponse()->setStatus(404);งานสาธารณะ ตั้งชื่อเรื่อง ($หัวเรื่อง)
ตั้งชื่อเรื่อง (TITLE) ของเพจ เนื้อหาชื่อเรื่องมีอยู่ในเทมเพลต Smarty โดยใช้วิธี ($wa->title())
สมมติว่าเราจำเป็นต้องได้รับข้อมูลจากเว็บไซต์ ซึ่งการรวบรวมข้อมูลด้วยตนเองนั้นทำไม่ได้ในทางปฏิบัติหรือเป็นไปไม่ได้เนื่องจากมีปริมาณข้อมูลมาก ในกรณีนี้ เราสามารถทำให้กระบวนการเป็นอัตโนมัติโดยใช้เครื่องมือที่อธิบายไว้ด้านล่าง
ขอห้องสมุด
ไลบรารี Python สำหรับส่งคำขอไปยังเซิร์ฟเวอร์และประมวลผลการตอบสนอง รากฐานของสคริปต์แยกวิเคราะห์และอาวุธหลักของเรา การใช้ไลบรารีนี้ทำให้เราได้รับเนื้อหาของหน้า แบบฟอร์ม HTMLเพื่อแยกวิเคราะห์เพิ่มเติม
การตอบสนองคำขอนำเข้า = คำขอ get ("https://ya.ru") # get-request พิมพ์ (ตอบกลับ . ข้อความ ) #เนื้อหาหน้าเอาท์พุท payload = ( "key1" : "value1" , "key2" : "value2") การตอบสนอง = คำขอ รับ ("http://httpbin.org/get" , params = เพย์โหลด ) #คำขอพร้อมพารามิเตอร์ headers = ( "user-agent" : "my-app/0.0.1" ) response = คำขอ รับ (url, ส่วนหัว = ส่วนหัว) # คำขอพร้อมส่วนหัว html เฉพาะ
เอพีไอ
อินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน - อินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชันจัดทำโดยเจ้าของแอปพลิเคชันเว็บสำหรับนักพัฒนารายอื่น การไม่มี API ที่สามารถตอบสนองความต้องการของเราได้คือสิ่งแรกที่เราควรตรวจสอบให้แน่ใจก่อนที่จะรีบวิเคราะห์ซอร์สโค้ดของเพจและเขียน parser สำหรับมัน ไซต์ยอดนิยมหลายแห่งมี API และเอกสารประกอบของตัวเองที่อธิบายวิธีใช้งาน เราสามารถใช้ API ในลักษณะนี้ - เราสร้างคำขอ http ตามเอกสารประกอบ และรับการตอบกลับโดยใช้คำขอ
บีเอส4
Beautifulsoup4 เป็นไลบรารีสำหรับแยกวิเคราะห์ html และ เอกสาร xml- ช่วยให้คุณเข้าถึงเนื้อหาของแท็กใดๆ ใน html ได้โดยตรง
จาก bs4 import BeautifulSoupซุป = BeautifulSoup (raw_html, "html.parser" ) พิมพ์ (soup . find ( "p" , class_ = "some-class" ) . text ) # ส่งออกเนื้อหาของแท็ก "p" โดยใช้คลาส "some-class"
ไดร์เวอร์เว็บซีลีเนียม
ข้อมูลบนไซต์สามารถสร้างได้แบบไดนามิกโดยใช้จาวาสคริปต์ ในกรณีนี้ จะไม่สามารถแยกวิเคราะห์ข้อมูลนี้โดยใช้ request+bs4 ได้ ความจริงก็คือ bs4 แยกวิเคราะห์ซอร์สโค้ดของเพจโดยไม่ต้องรัน js ในการรันโค้ด js และรับหน้าที่เหมือนกับที่เราเห็นในเบราว์เซอร์ คุณสามารถใช้ซีลีเนียมเว็บไดรเวอร์ - นี่คือชุดไดรเวอร์สำหรับ เบราว์เซอร์ที่แตกต่างกันมาพร้อมกับไลบรารีสำหรับการทำงานกับไดรเวอร์เหล่านี้
จะทำอย่างไรถ้าได้รับอนุญาต?
session = request.Session() data = ("login_username":login", "login_password": "รหัสผ่าน") url = "http://site.com/login.php" การตอบสนอง = session.post (url, data =ข้อมูล)
จะเกิดอะไรขึ้นหากไซต์แบนคุณสำหรับคำขอมากเกินไป?
- ตั้งค่าความล่าช้าระหว่างคำขอ:
การตอบสนอง = request.get (url, หมดเวลา = (10, 0.01)) # หมดเวลาการเชื่อมต่อ, หมดเวลาการอ่าน (เป็นวินาที)
- แกล้งทำเป็นเบราว์เซอร์โดยใช้ไดรเวอร์เว็บซีลีเนียมหรือส่งเนื้อหาของส่วนหัวของตัวแทนผู้ใช้เพื่อสร้างคำขอ:
user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") คำขอ =ร้องขอ.get(url, headers=("User-Agent":user_agent))
- ใช้พร็อกซี:
การสร้างการตอบสนองจากผู้ควบคุม
หลังจากที่คอนโทรลเลอร์ประมวลผลคำขอเสร็จแล้ว โดยปกติจะต้องสร้างการตอบกลับ เมื่อเราสร้างคอนโทรลเลอร์ระดับต่ำโดยใช้อินเทอร์เฟซ IController โดยตรง เราต้องรับผิดชอบทุกแง่มุมของการประมวลผลคำขอ รวมถึงการสร้างการตอบสนองต่อไคลเอนต์
ตัวอย่างเช่น หากต้องการส่งการตอบกลับ HTML คุณจะต้องสร้างและเขียนข้อมูล HTML จากนั้นส่งไปยังไคลเอนต์โดยใช้เมธอด Response.Write() ในทำนองเดียวกัน หากต้องการเปลี่ยนเส้นทางเบราว์เซอร์ของผู้ใช้ไปยัง URL อื่น คุณจะต้องเรียกใช้เมธอด Response.Redirect() และส่งผ่าน URL ที่ต้องการ ทั้งสองวิธีแสดงให้เห็นในโค้ดด้านล่าง ซึ่งแสดงส่วนขยายของคลาส BasicController ที่เราสร้างขึ้นในบทความก่อนหน้านี้โดยใช้อินเทอร์เฟซ IController:
ใช้ System.Web.Mvc; โดยใช้ System.Web.Routing; Namespace ControllersAndActions.Controllers (คลาสสาธารณะ BasicController: IController ( public void Execute(RequestContext requestContext) ( string controller = (string)requestContext.RouteData.Values["controller"]; string action = (string)requestContext.RouteData.Values["action "]; if (action.ToLower() == "redirect") ( requestContext.HttpContext.Response.Redirect("/Derived/Index"); ) else ( requestContext.HttpContext.Response.Write(string.Format("Controller) : (0), วิธีการดำเนินการ: (1)", ตัวควบคุม, การกระทำ)); ) ) ) )
วิธีการเดียวกันนี้สามารถนำไปใช้ในกรณีที่สืบทอดคอนโทรลเลอร์จากคลาสคอนโทรลเลอร์ คลาส HttpResponseBase ซึ่งส่งคืนเมื่อคุณสมบัติ requestContext.HttpContext.Response ถูกอ่านในเมธอด Execute() สามารถเข้าถึงได้ผ่านคุณสมบัติ Controller.Response ดังที่แสดงในตัวอย่างด้านล่าง ซึ่งขยายคลาส DerivedController ที่สร้างขึ้นก่อนหน้านี้ด้วย สืบทอดมาจากคลาสคอนโทรลเลอร์:
การใช้ระบบ; ใช้ System.Web; ใช้ System.Web.Mvc; Namespace ControllersAndActions.Controllers ( คลาสสาธารณะ DerivedController: คอนโทรลเลอร์ ( สาธารณะ ActionResult Index() ( // ... ) โมฆะสาธารณะ ProduceOutput() ( ถ้า (Server.MachineName == "ProfessorWeb") Response.Redirect("/Basic/Index" ); else Response.Write ("ตัวควบคุม: ได้มา, วิธีการดำเนินการ: ProduceOutput");
เมธอด ProduceOutput() ใช้ค่าของคุณสมบัติ Server.MachineName เพื่อตัดสินใจว่าจะส่งการตอบสนองใดไปยังไคลเอนต์ ("ProfessorWeb" คือชื่อของเครื่องที่กำลังพัฒนาของฉัน)
แม้ว่าวิธีการสร้างการตอบสนองต่อผู้ใช้นี้จะได้ผล แต่ก็มีปัญหาหลายประการ:
คลาสคอนโทรลเลอร์ต้องมีข้อมูลโครงสร้าง HTML หรือ URL ซึ่งทำให้คลาสอ่านและบำรุงรักษาได้ยาก
คอนโทรลเลอร์ที่สร้างการตอบสนองต่อเอาต์พุตโดยตรงนั้นยากต่อการทดสอบหน่วย คุณจะต้องสร้างการใช้งานจำลองของออบเจ็กต์ Response จากนั้นจึงจะสามารถประมวลผลเอาต์พุตจากคอนโทรลเลอร์เพื่อพิจารณาว่าคืออะไร ซึ่งอาจหมายถึง เช่น จำเป็นต้องแยกวิเคราะห์มาร์กอัป HTML คำหลักซึ่งเป็นกระบวนการที่ยาวนานและน่าเบื่อหน่าย
การประมวลผลรายละเอียดเล็กๆ น้อยๆ ของแต่ละคำตอบในลักษณะนี้มีความซับซ้อนและเกิดข้อผิดพลาดได้ง่าย โปรแกรมเมอร์บางคนชอบการควบคุมแบบสัมบูรณ์โดยการสร้างคอนโทรลเลอร์ระดับต่ำ แต่มักจะซับซ้อนอย่างรวดเร็ว
โชคดีที่ MVC Framework มีเครื่องมือที่มีประโยชน์ซึ่งช่วยแก้ปัญหาเหล่านี้ทั้งหมดได้ ซึ่งก็คือผลลัพธ์ของการดำเนินการ ส่วนต่อไปนี้จะอธิบายแนวคิดของผลลัพธ์ของการดำเนินการและแสดง วิธีต่างๆใช้เพื่อสร้างการตอบสนองจากผู้ควบคุม
ผลลัพธ์ของการกระทำ
ผลลัพธ์การดำเนินการในกรอบงาน MVC ใช้เพื่อแยกข้อความแสดงเจตจำนงออกจากการดำเนินการตามเจตนา (ขออภัยที่ซ้ำซาก) แนวคิดนี้จะดูเรียบง่ายเมื่อคุณเข้าใจแล้ว แต่อาจต้องใช้เวลาพอสมควรในการทำความเข้าใจเนื่องจากมีบางอย่างทางอ้อม
แทนที่จะจัดการโดยตรงกับวัตถุ Response วิธีการกระทำจะส่งกลับวัตถุของคลาสที่ได้รับมา ผลการดำเนินการซึ่งอธิบายว่าการตอบสนองจากคอนโทรลเลอร์ควรเป็นอย่างไร เช่น เรนเดอร์มุมมองหรือเปลี่ยนเส้นทางไปยัง URL อื่นหรือวิธีดำเนินการ อย่างไรก็ตาม (นี่คือความอ้อมมาก) คำตอบไม่ได้ถูกสร้างขึ้นโดยตรง แต่วัตถุ ActionResult จะถูกสร้างขึ้นแทน ซึ่ง MVC Framework ประมวลผลเพื่อสร้างผลลัพธ์หลังจากเรียกใช้วิธีการดำเนินการแล้ว
ระบบผลลัพธ์การดำเนินการเป็นตัวอย่างของรูปแบบการออกแบบคำสั่ง รูปแบบนี้แสดงถึงสถานการณ์ที่คุณจัดเก็บและส่งวัตถุที่อธิบายการดำเนินการที่กำลังดำเนินการ
เมื่อ MVC Framework ได้รับวัตถุ ActionResult จากวิธีการดำเนินการ มันจะเรียก วิธีการ ExecuteResult()กำหนดไว้ในคลาสของวัตถุนี้ จากนั้นการนำผลลัพธ์ของการดำเนินการไปใช้จะดำเนินการบนออบเจ็กต์ Response โดยสร้างผลลัพธ์ที่ตรงกับเจตนาของคุณ เพื่อสาธิตการใช้งานจริง เรามาสร้างโฟลเดอร์ Infrastructure และเพิ่มเข้าไป ไฟล์ใหม่คลาสชื่อ CustomRedirectResult.cs พร้อมการใช้งาน ActionResult แบบกำหนดเองที่แสดงในตัวอย่างด้านล่าง:
ใช้ System.Web.Mvc; Namespace ControllersAndActions.Infrastructure (คลาสสาธารณะ CustomRedirectResult: ActionResult ( Url สตริงสาธารณะ ( get; set; ) การแทนที่สาธารณะเป็นโมฆะ ExecuteResult (บริบทของ ControllerContext) ( string fullUrl = UrlHelper.GenerateContentUrl (Url, context.HttpContext); context.HttpContext.Response.Redirect (URL แบบเต็ม);
คลาสนี้ขึ้นอยู่กับวิธีการทำงานของคลาส System.Web.Mvc.RedirectResult ข้อดีประการหนึ่งของ MVC Framework แบบโอเพ่นซอร์สคือความสามารถในการสำรวจ งานภายในอะไรก็ตาม. คลาส CustomRedirectResult นั้นง่ายกว่า MVC ที่เทียบเท่ากันมาก แต่ก็เพียงพอสำหรับวัตถุประสงค์ของบทความนี้
เมื่อสร้างอินสแตนซ์คลาส RedirectResult เราจะส่ง URL ที่ควรเปลี่ยนเส้นทางผู้ใช้ไป เมธอด ExecuteResult() ซึ่งจะถูกดำเนินการโดย MVC Framework เมื่อวิธีการดำเนินการเสร็จสมบูรณ์ ได้รับอ็อบเจ็กต์ Response สำหรับการร้องขอผ่านอ็อบเจ็กต์ ControllerContext ที่ให้มาของ Framework และเรียกเมธอด RedirectPermanent() หรือเมธอด Redirect() (นี่คือ สิ่งที่ทำไปแล้วในการใช้งาน IController ระดับต่ำในตัวอย่างก่อนหน้าในบทความ)
การใช้คลาส CustomRedirectResult แสดงในตัวอย่างด้านล่าง ซึ่งแสดงการเปลี่ยนแปลงที่เกิดขึ้นกับ Derived controller:
// ... ใช้ ControllersAndActions.Infrastructure; namespace ControllersAndActions.Controllers ( คลาสสาธารณะ DerivedController: คอนโทรลเลอร์ ( สาธารณะ ActionResult Index() ( // ... ) สาธารณะ ActionResult ProduceOutput() ( ถ้า (Server.MachineName == "MyMachineName") ส่งคืน CustomRedirectResult ใหม่ ( Url = "/Basic/ ดัชนี" ); else ( Response.Write("Controller: Derived, Action method: ProduceOutput"); return null; ) ) ) )
โปรดทราบว่าเราถูกบังคับให้เปลี่ยนผลลัพธ์ของวิธีการดำเนินการเพื่อส่งคืน ActionResult เราจะคืนค่า null หากเราไม่ต้องการให้ MVC Framework ดำเนินการใดๆ เมื่อดำเนินการตามวิธีดำเนินการ ซึ่งเป็นสิ่งที่เราทำหากอินสแตนซ์ CustomRedirectResult ไม่ถูกส่งคืน
ตัวควบคุมการทดสอบหน่วยและการดำเนินการ
MVC Framework หลายส่วนได้รับการออกแบบมาเพื่อให้การทดสอบหน่วยง่ายขึ้น โดยเฉพาะอย่างยิ่งกับการดำเนินการและตัวควบคุม มีสาเหตุหลายประการสำหรับการสนับสนุนนี้:
คุณสามารถทดสอบการดำเนินการและตัวควบคุมภายนอกเว็บเซิร์ฟเวอร์ได้ ออบเจ็กต์บริบทเข้าถึงได้ผ่านคลาสพื้นฐาน (เช่น HttpRequestBase) ซึ่งจำลองได้ง่าย
หากต้องการทดสอบผลลัพธ์ของวิธีดำเนินการ คุณไม่จำเป็นต้องแยกวิเคราะห์มาร์กอัป HTML เพื่อให้แน่ใจว่าคุณได้รับผลลัพธ์ตามที่คาดหวัง คุณสามารถตรวจสอบออบเจ็กต์ ActionResult ที่ส่งคืนได้
ไม่จำเป็นต้องจำลองคำขอของลูกค้า ระบบการเชื่อมโยงโมเดลของ MVC Framework ช่วยให้คุณสามารถเขียนวิธีดำเนินการที่รับอินพุตในพารามิเตอร์ได้ หากต้องการทดสอบวิธีดำเนินการ คุณเพียงแค่เรียกมันโดยตรงและระบุ ค่าที่สอดคล้องกันพารามิเตอร์
บทความในอนาคตเกี่ยวกับการสร้างข้อมูลจากคอนโทรลเลอร์จะแสดงวิธีสร้างการทดสอบหน่วย ประเภทต่างๆผลลัพธ์ของการกระทำ
อย่าลืมว่าการทดสอบหน่วยเป็นเพียงส่วนหนึ่งของภาพเท่านั้น ลักษณะการทำงานที่ซับซ้อนในแอปพลิเคชันเกิดขึ้นเมื่อเรียกใช้วิธีดำเนินการตามลำดับ การทดสอบหน่วยจะทำงานได้ดีที่สุดเมื่อรวมกับวิธีการทดสอบอื่นๆ
ตอนนี้คุณรู้แล้วว่าผลลัพธ์พิเศษของการดำเนินการเปลี่ยนเส้นทางทำงานอย่างไร คุณสามารถเปลี่ยนไปใช้สิ่งที่เทียบเท่ากับกรอบงาน MVC ซึ่งมีประสิทธิภาพมากกว่าและได้รับการทดสอบอย่างละเอียดโดย Microsoft การเปลี่ยนแปลงที่จำเป็นใน Derived controller มีดังต่อไปนี้:
// ... สาธารณะ ActionResult ProduceOutput() ( ส่งคืน RedirectResult ใหม่ ("/Basic/Index"); ) // ...
คำสั่งแบบมีเงื่อนไขถูกลบออกจากวิธีดำเนินการแล้ว ซึ่งหมายความว่าหลังจากเรียกใช้แอปพลิเคชันและนำทางไปยัง URL เช่น /Derived/ProduceOutput เบราว์เซอร์จะถูกเปลี่ยนเส้นทางไปยัง URL เช่น /Basic/Index เพื่อลดความซับซ้อนของโค้ดวิธีดำเนินการ คลาสคอนโทรลเลอร์จะรวมวิธีการสร้างที่สะดวกสบายไว้ด้วย ประเภทต่างๆออบเจ็กต์ผลการดำเนินการ ตัวอย่างเช่น เราสามารถบรรลุผลแบบเดียวกับในตัวอย่างข้างต้นได้โดยการส่งคืนผลลัพธ์ของเมธอด Redirect():
// ... สาธารณะ ActionResult ProduceOutput() ( return Redirect("/Basic/Index"); ) // ...
ไม่มีอะไรซับซ้อนเป็นพิเศษเกี่ยวกับระบบผลลัพธ์ของการดำเนินการ แต่ท้ายที่สุดแล้วจะช่วยสร้างโค้ดที่เรียบง่ายขึ้น สะอาดกว่า และสอดคล้องกันมากขึ้น ซึ่งอ่านง่ายและทดสอบหน่วยได้ ตัวอย่างเช่น ในกรณีของการเปลี่ยนเส้นทาง คุณสามารถตรวจสอบว่าวิธีดำเนินการส่งคืนอินสแตนซ์ RedirectResult ซึ่งมีคุณสมบัติ Url มีเป้าหมายที่คาดหวังไว้หรือไม่
กรอบงาน MVC กำหนดประเภทผลลัพธ์การดำเนินการในตัวหลายประเภท ซึ่งอธิบายไว้ในตารางด้านล่าง:
พิมพ์ | คำอธิบาย | วิธีการช่วยเหลือของคลาสคอนโทรลเลอร์ |
---|---|---|
ดูผลลัพธ์ | แสดงผลเทมเพลตมุมมองที่ระบุหรือมาตรฐาน |
ดู() |
ผลลัพธ์มุมมองบางส่วน | แสดงผลเทมเพลตมุมมองบางส่วนที่ระบุหรือมาตรฐาน |
มุมมองบางส่วน() |
เปลี่ยนเส้นทางไปยังRouteResult | ออก HTTP 301 หรือ 302 เปลี่ยนเส้นทางไปยังวิธีดำเนินการหรือรายการเส้นทางที่ระบุ สร้าง URL ตามการกำหนดค่าเส้นทาง |
เปลี่ยนเส้นทางไปยังการดำเนินการ() เปลี่ยนเส้นทางไปยังการดำเนินการถาวร () เปลี่ยนเส้นทางไปยังเส้นทาง() เปลี่ยนเส้นทางไปยังเส้นทางถาวร() |
ผลลัพธ์การเปลี่ยนเส้นทาง | ออก HTTP 301 หรือ 302 เปลี่ยนเส้นทางไปยัง URL ที่กำหนด |
เปลี่ยนเส้นทาง() เปลี่ยนเส้นทางถาวร() |
ผลลัพธ์ของเนื้อหา | ส่งคืนข้อมูลข้อความที่ไม่ได้จัดรูปแบบไปยังเบราว์เซอร์ โดยตั้งค่าส่วนหัวของประเภทเนื้อหาเพิ่มเติม |
เนื้อหา() |
ไฟล์ผลลัพธ์ | ถ่ายโอนข้อมูลไบนารี (เช่น ไฟล์บนดิสก์หรืออาร์เรย์ไบต์ในหน่วยความจำ) ไปยังเบราว์เซอร์โดยตรง |
ไฟล์() |
JsonResult | ทำให้ออบเจ็กต์ .NET เป็นอนุกรมลงใน JSON และส่งเป็นการตอบกลับ การตอบสนองประเภทนี้มักถูกสร้างขึ้นเมื่อใช้เครื่องมือ Web API และ AJAX |
เจสัน() |
JavaScriptResult | ส่งซอร์สโค้ด JavaScript บางส่วนเพื่อให้เบราว์เซอร์ดำเนินการ |
จาวาสคริปต์() |
ผลลัพธ์ที่ไม่ได้รับอนุญาต Http | ตั้งค่ารหัสสถานะการตอบสนอง HTTP เป็น 401 (หมายถึง "ไม่ได้รับอนุญาต") ซึ่งจะบังคับให้กลไกการตรวจสอบความถูกต้องมีผล (การตรวจสอบความถูกต้องของแบบฟอร์มหรือ การรับรองความถูกต้องของ Windows) เชิญผู้เยี่ยมชมให้เข้าสู่ระบบ |
เลขที่ |
HttpNotFoundResult | ส่งกลับรหัสข้อผิดพลาด HTTP 404 - ไม่พบ |
HttpNotFound() |
ผลลัพธ์ HttpStatusCode | ส่งคืนรหัส HTTP ที่ระบุ |
เลขที่ |
ผลว่างเปล่า | ไม่ทำอะไรเลย |
เลขที่ |
ประเภทเหล่านี้ทั้งหมดได้มาจากคลาส ActionResult และหลายประเภทมีวิธีการช่วยเหลือที่สะดวกในคลาส Controller เราจะสาธิตการใช้ผลลัพธ์ประเภทเหล่านี้ในบทความต่อๆ ไป
หลังจากได้รับและตีความข้อความร้องขอแล้ว เซิร์ฟเวอร์จะตอบกลับด้วยข้อความตอบกลับ HTTP:
- บรรทัดสถานะ
- ช่องส่วนหัวเป็นศูนย์หรือมากกว่า (ทั่วไป|การตอบสนอง|เอนทิตี) ตามด้วย CRLF
- บรรทัดว่าง (เช่น บรรทัดที่ไม่มีสิ่งใดอยู่ข้างหน้า CRLF) ระบุจุดสิ้นสุดของฟิลด์ส่วนหัว
- เนื้อหาข้อความหรือไม่ก็ได้
ส่วนต่อไปนี้แต่ละส่วนจะอธิบายเกี่ยวกับเอนทิตีที่ใช้ในข้อความตอบกลับ HTTP
สถานะข้อความ-บรรทัด
Status-Line ประกอบด้วยเวอร์ชันโปรโตคอลตามด้วยรหัสสถานะตัวเลขและข้อความที่เกี่ยวข้อง องค์ประกอบจะถูกคั่นด้วยอักขระ SP ช่องว่าง
เวอร์ชัน HTTP
เซิร์ฟเวอร์ที่รองรับ HTTP เวอร์ชัน 1.1 จะส่งคืนข้อมูลเวอร์ชันต่อไปนี้:
HTTP-เวอร์ชัน = HTTP/1.1
รหัสสถานะ
องค์ประกอบรหัสสถานะเป็นจำนวนเต็ม 3 หลัก โดยที่หลักแรกของรหัสสถานะจะกำหนดคลาสของการตอบสนอง และตัวเลขสองหลักสุดท้ายไม่มีบทบาทในการจัดหมวดหมู่ หลักแรกมี 5 ค่า:
เอส.เอ็น. | รหัสและคำอธิบาย |
---|---|
1 | 1xx: ข้อมูล หมายความว่าได้รับคำขอแล้วและกระบวนการกำลังดำเนินต่อไป |
2 | 2xx: สำเร็จ หมายความว่าการดำเนินการได้รับ เข้าใจ และยอมรับเรียบร้อยแล้ว |
3 | 3xx: การเปลี่ยนเส้นทาง หมายความว่าจะต้องดำเนินการเพิ่มเติมเพื่อดำเนินการตามคำขอให้เสร็จสิ้น |
4 | 4xx: ข้อผิดพลาดของไคลเอ็นต์ หมายความว่าคำขอมีไวยากรณ์ที่ไม่ถูกต้องหรือไม่สามารถดำเนินการได้ |
5 | 5xx: ข้อผิดพลาดของเซิร์ฟเวอร์ หมายความว่าเซิร์ฟเวอร์ไม่สามารถตอบสนองคำขอที่ถูกต้องได้ |
รหัสสถานะ HTTP สามารถขยายได้ และแอปพลิเคชัน HTTP ไม่จำเป็นต้องเข้าใจความหมายของรหัสสถานะที่ลงทะเบียนทั้งหมด รายการรหัสสถานะทั้งหมดได้รับการระบุไว้ในบทแยกต่างหากเพื่อเป็นข้อมูลอ้างอิงของคุณ
ฟิลด์ส่วนหัวการตอบกลับ
เราจะศึกษา General-header และ Entity-header ในบทที่แยกต่างหาก เมื่อเราจะเรียนรู้ฟิลด์ส่วนหัว HTTP ในตอนนี้ เรามาตรวจสอบว่าฟิลด์ส่วนหัวของการตอบกลับคืออะไร
ฟิลด์ส่วนหัวการตอบกลับอนุญาตให้เซิร์ฟเวอร์ส่งข้อมูลเพิ่มเติมเกี่ยวกับการตอบกลับที่ไม่สามารถวางในบรรทัดสถานะ ฟิลด์ส่วนหัวเหล่านี้ให้ข้อมูลเกี่ยวกับเซิร์ฟเวอร์และการเข้าถึงทรัพยากรเพิ่มเติมที่ระบุโดย Request-URI
-
พร็อกซี-รับรองความถูกต้อง
-
WWW-รับรองความถูกต้อง
คุณสามารถแนะนำฟิลด์ที่คุณกำหนดเองได้ในกรณีที่คุณกำลังจะเขียนเว็บไคลเอ็นต์และเซิร์ฟเวอร์ที่คุณกำหนดเอง
ตัวอย่างข้อความตอบกลับ
ตอนนี้เรามารวบรวมทั้งหมดเข้าด้วยกันเพื่อสร้างการตอบสนอง HTTP สำหรับคำขอเพื่อดึงข้อมูล สวัสดี.htmหน้าจากเว็บเซิร์ฟเวอร์ที่ทำงานบนไซต์
HTTP/1.1 200 ตกลง วันที่: จันทร์ 27 ก.ค. 2552 12:28:53 GMT เซิร์ฟเวอร์: Apache/2.2.14 (Win32) แก้ไขล่าสุด: พุธ 22 ก.ค. 2552 19:15:56 GMT ความยาวเนื้อหา: 88 เนื้อหา - ประเภท: ข้อความ/html การเชื่อมต่อ: ปิด
สวัสดีชาวโลก!
ตัวอย่างต่อไปนี้แสดงข้อความตอบกลับ HTTP ที่แสดงเงื่อนไขข้อผิดพลาดเมื่อเว็บเซิร์ฟเวอร์ไม่พบหน้าที่ร้องขอ:
HTTP/1.1 404 ไม่พบ วันที่: อาทิตย์ 18 ต.ค. 2555 เวลา 10:36:20 น. GMT เซิร์ฟเวอร์: Apache/2.2.14 (Win32) ความยาวเนื้อหา: 230 การเชื่อมต่อ: ปิดประเภทเนื้อหา: ข้อความ / html; ชุดอักขระ=iso-8859-1
ไม่พบ
ไม่พบ URL ที่ร้องขอ /t.html บนเซิร์ฟเวอร์นี้
ต่อไปนี้เป็นตัวอย่างของข้อความตอบกลับ HTTP ที่แสดงเงื่อนไขข้อผิดพลาดเมื่อเว็บเซิร์ฟเวอร์พบเวอร์ชัน HTTP ที่ไม่ถูกต้องในคำขอ HTTP ที่กำหนด:
HTTP/1.1 400 วันที่คำขอไม่ถูกต้อง: อาทิตย์ 18 ต.ค. 2555 เวลา 10:36:20 น. GMT เซิร์ฟเวอร์: Apache/2.2.14 (Win32) ความยาวเนื้อหา: 230 ประเภทเนื้อหา: ข้อความ / html; charset=iso-8859-1 การเชื่อมต่อ: ปิด
คำขอไม่ถูกต้อง
เบราว์เซอร์ของคุณส่งคำขอว่าเซิร์ฟเวอร์นี้ไม่สามารถเข้าใจได้
บรรทัดคำขอมีอักขระที่ไม่ถูกต้องตามสตริงโปรโตคอล
วัตถุที่อธิบายเป็นเครื่องมือที่มีประโยชน์และทรงพลังมาก วัตถุนี้มีหลายวิธี คำอธิบายมีดังต่อไปนี้:
คอลเลกชัน:
วิธีการ:
คุณสมบัติ:
การตอบสนองคอลเลกชันคุกกี้
คอลเลกชันคุกกี้จะกำหนดค่าให้กับคุกกี้ หากไม่มีคุกกี้ที่ระบุ ระบบจะสร้างคุกกี้ขึ้นมา หากมีคุกกี้อยู่ คุกกี้จะใช้ค่าใหม่และทำลายคุกกี้เก่า
Response.Cookies(คุกกี้) [(คีย์) | - คุณลักษณะ ] = ค่า
พารามิเตอร์:
- คุกกี้- ชื่อคุกกี้
- สำคัญ- พารามิเตอร์ทางเลือก หากมีการระบุ คุกกี้จะเป็นไดเร็กทอรี (ซ้อนกัน) และคีย์คือชุดของค่า
- คุณลักษณะ- ข้อมูลที่ระบุเกี่ยวกับคุกกี้นั้นเอง พารามิเตอร์นี้สามารถเป็นหนึ่งในสิ่งต่อไปนี้:
- ความหมาย- ระบุค่าที่จะกำหนด กุญแจนี้หรือคุณลักษณะ
ชื่อ | คำอธิบาย |
โดเมน | การบันทึกเท่านั้น หากระบุไว้ คุกกี้จะถูกส่งเมื่อมีการร้องขอจากโดเมนนี้เท่านั้น |
หมดอายุ | การบันทึกเท่านั้น วันที่คุกกี้หมดอายุ ต้องตั้งค่าวันที่นี้จึงจะเขียนคุกกี้ถึงไคลเอนต์ได้ ฮาร์ดไดรฟ์หลังจากสิ้นสุดเซสชั่น หากไม่ได้ตั้งค่าแอตทริบิวต์นี้ วันที่หมดอายุของคุกกี้จะถือว่าเป็นวันที่ปัจจุบัน คุกกี้จะหมดอายุทันทีหลังจากสิ้นสุดเซสชัน |
ฮาสคีย์ | อ่านอย่างเดียว บ่งชี้ว่าคุกกี้มีรหัสที่กำหนดหรือไม่ |
เส้นทาง | การบันทึกเท่านั้น หากระบุไว้ คุกกี้จะถูกส่งเมื่อมีการร้องขอจากเส้นทางนี้เท่านั้น หากไม่ได้ตั้งค่าพารามิเตอร์ ระบบจะใช้เส้นทางไปยังแอปพลิเคชัน |
ปลอดภัย | การบันทึกเท่านั้น ระบุว่าคุกกี้จะได้รับการคุ้มครองหรือไม่ |
ความคิดเห็น:
หากคีย์คุกกี้ถูกสร้างขึ้นตามที่แสดงในสคริปต์ต่อไปนี้
<% Response.Cookies("mycookie")("type1") = "сахар" Response.Cookies("mycookie")("type2") = "печенье" %>
จากนั้นส่วนหัวต่อไปนี้จะถูกส่ง:
ชุดคุกกี้:MYCOOKIE=TYPE1=sugar&TYPE2=cookies
หากคุณกำหนดค่าให้กับ mycookie โดยไม่ใช้คีย์ การดำเนินการนี้จะทำลายคีย์ type1 และ type2 ตัวอย่างเช่น:<% Response.Cookies("myCookie") = "шоколадный зефир" %>
ในตัวอย่างก่อนหน้านี้ คีย์ type1 และ type2 จะถูกทำลายและค่าของมันจะหายไป ตอนนี้ Mycookie จะมีมาร์ชแมลโลว์ช็อคโกแลตที่มีคุณค่า
คุณยังสามารถตรวจสอบการมีอยู่ของคีย์เฉพาะได้ด้วยวิธีต่อไปนี้:
<% = Response.Cookies("myCookie").HasKeys %>
หากแสดง TRUE แสดงว่าคีย์ดังกล่าวมีอยู่ หากเป็น FALSE จะไม่มี
การตอบสนองวิธีการเขียน
การตอบสนองเขียนตัวแปร_หรือ_ค่า
พารามิเตอร์:
- ตัวแปร_หรือ_ค่า- ข้อมูลที่จะแสดงบนหน้าจอเบราว์เซอร์ผ่าน HTML พารามิเตอร์นี้สามารถเป็นประเภทใดก็ได้ที่ VisualBasic Scripting Edition รองรับ นั่นคือข้อมูลสามารถเป็นประเภทต่อไปนี้: วันที่, สตริง, ตัวอักษร, ค่าตัวเลข ความหมาย พารามิเตอร์นี้ไม่สามารถมี %> ชุดค่าผสมได้ คุณสามารถใช้ชุดค่าผสมที่เทียบเท่า %\> แทนได้ เว็บเซิร์ฟเวอร์จะแปลงลำดับนี้เป็นลำดับที่จำเป็นเมื่อเรียกใช้สคริปต์
ตัวอย่างต่อไปนี้แสดงวิธีการทำงานของเมธอด Response.write เพื่อส่งข้อความไปยังไคลเอนต์
ฉันจะบอกคุณว่า:<%Response.write "Привет всем!!!"%>และชื่อของคุณ<%Response.write(Request.Form("name"))%>
ตัวอย่างต่อไปนี้เพิ่มแท็ก HTML ให้กับหน้าเว็บ เนื่องจากวิธีนี้ไม่สามารถมีชุดค่าผสม %> ได้ เราจึงใช้ลำดับ %\> ดังนั้นสคริปต์ตัวอย่าง:
<% Response.write "