มีอะไรผิดปกติกับจุดสิ้นสุดที่ส่งคืน HTML แทนที่จะเป็นข้อมูล JSON


77

เมื่อฉันเริ่มเรียนรู้ PHP ครั้งแรก (ประมาณ 5 หรือ 6 ปีก่อน) ฉันเรียนรู้เกี่ยวกับAjaxและฉันผ่าน "ขั้นตอน":

  1. เซิร์ฟเวอร์ของคุณส่งคืนข้อมูล HTML และคุณวางไว้ในinnerHTML ของ DOM
  2. คุณเรียนรู้เกี่ยวกับรูปแบบการถ่ายโอนข้อมูลเช่น XML (และพูดว่า "oooh นั่นคือสิ่งที่มันใช้สำหรับ") แล้ว JSON
  3. คุณส่งคืน JSON และสร้าง UI ของคุณโดยใช้รหัสวานิลลา JavaScript
  4. คุณย้ายไปที่ jQuery
  5. คุณเรียนรู้เกี่ยวกับ API, ส่วนหัว, รหัสสถานะ HTTP, REST , CORSและBootstrap
  6. คุณเรียนรู้SPAและเฟรมเวิร์กส่วนหน้า ( React , Vue.jsและAngularJS ) และมาตรฐาน JSON API
  7. คุณได้รับรหัสดั้งเดิมขององค์กรและจากการตรวจสอบพบว่าพวกเขาทำสิ่งที่อธิบายไว้ในขั้นตอนที่ 1

ขณะที่ฉันทำงานกับ codebase ดั้งเดิมฉันไม่ได้คิดว่ามันจะส่งคืน HTML (ฉันหมายความว่าตอนนี้เราเป็นมืออาชีพใช่มั้ย) ดังนั้นฉันจึงยากที่จะมองหาจุดปลาย JSON ที่ส่งคืนข้อมูลที่ การเรียก Ajax จะเติมข้อมูล มันไม่ได้จนกว่าฉันจะถาม "โปรแกรมเมอร์" ที่เขาบอกฉันว่ามันกลับ HTML และถูกผนวกเข้าโดยตรงกับ DOM ด้วย innerHTML

แน่นอนว่ามันยากที่จะยอมรับ ฉันเริ่มคิดหาวิธีที่จะทำให้สิ่งนี้เป็นจุดสิ้นสุดของ JSON โดยคิดถึงการทดสอบหน่วยปลายทางและอื่น ๆ อย่างไรก็ตาม codebase นี้ไม่มีการทดสอบ ไม่ใช่คนเดียว และมันมีมากกว่า 200k เส้น แน่นอนหนึ่งในภารกิจของฉันรวมถึงการเสนอแนวทางสำหรับการทดสอบทั้งหมด แต่ในขณะนี้เรายังไม่ได้แก้ปัญหา

ดังนั้นฉันไม่มีที่มุมสงสัย: ถ้าเราไม่มีการทดสอบใด ๆ ดังนั้นเราจึงไม่มีเหตุผลพิเศษที่จะสร้างจุดสิ้นสุด JSON นี้ (เนื่องจากไม่ใช่ "นำมาใช้ซ้ำ": มันจะส่งคืนข้อมูลที่เหมาะกับส่วนนั้นของ แอปพลิเคชัน แต่ฉันคิดว่านี่เป็นนัยแล้วเพราะมัน ... ส่งคืนข้อมูล HTML)

อะไรกันแน่ที่เป็นธรรมกับการทำเช่นนี้?



3
เกี่ยวข้องกับ: stackoverflow.com/questions/1284381/… <- คำตอบที่ดีมากใน SO
Machado

73
เซิร์ฟเวอร์ที่ใช้ HyperText Transfer Protocol ส่งคืน HyperText หรือไม่! สยองขวัญ!
Andy

3
@Andy จริงๆแล้วมันเป็น Generic Message Transfer Protocol: ไม่มีอะไรเกี่ยวกับการโอนไฮเปอร์เท็กซ์ซึ่งตรงข้ามกับ FTP ซึ่งพูดถึงสิ่งต่าง ๆ ที่เฉพาะเจาะจงกับไฟล์และไดเรกทอรี
Joker_vD

4
@Joker_vD ฉันไม่เคยได้ยินเกี่ยวกับโปรโตคอลที่เรียกว่า GMTP ในขณะที่สิ่งต่าง ๆ มีวิวัฒนาการและคุณสามารถส่งเนื้อหาประเภทอื่น ๆ ผ่าน HTTP มันไม่ใช่เจตนาดั้งเดิม ประเด็นของฉันคือเพียงเพราะคุณสามารถส่งเนื้อหาอื่นนอกเหนือจาก HyperText โดยใช้ HTTP ดูเหมือนว่าโง่ที่จะแนะนำว่ามันไม่ถูกต้องอีกต่อไปที่จะใช้มันเพื่อจุดประสงค์ดั้งเดิม
Andy

คำตอบ:


114

มีอะไรผิดปกติกับจุดสิ้นสุดที่ส่งคืน HTML แทนที่จะเป็นข้อมูล JSON

ไม่มีอะไรจริงๆ. แต่ละแอปพลิเคชันมีข้อกำหนดที่แตกต่างกันและอาจเป็นไปได้ว่าแอปพลิเคชันของคุณไม่ได้ออกแบบมาให้เป็นสปา

อาจเป็นไปได้ว่ากรอบงานที่สวยงามเหล่านี้ที่คุณอ้างถึง (Angular, Vue, React, ฯลฯ ... ) ไม่สามารถใช้ได้ในช่วงการพัฒนาหรือไม่ได้รับการอนุมัติ "enterprisey" สิ่งที่ต้องใช้ในองค์กรของคุณ

ฉันจะบอกคุณนี้: ปลายทางที่ส่งคืน HTML จะลดการพึ่งพาไลบรารี JavaScript และลดการโหลดบนเบราว์เซอร์ของผู้ใช้เนื่องจากไม่จำเป็นต้องตีความ / เรียกใช้รหัส JS เพื่อสร้างวัตถุ DOM - HTML มีอยู่แล้ว มันเป็นเพียงเรื่องของการแยกวิเคราะห์องค์ประกอบและการแสดงผล แน่นอนนี่หมายความว่าเรากำลังพูดถึงปริมาณข้อมูลที่สมเหตุสมผล ข้อมูล HTML ขนาด 10 เมกะไบต์ไม่สมเหตุสมผล

แต่เนื่องจากไม่มีอะไรผิดพลาดกับ HTML ที่ส่งคืนสิ่งที่คุณสูญเสียจากการไม่ใช้ JSON / XML จึงเป็นไปได้ที่จะใช้ปลายทางของคุณเป็น API และนี่คือคำถามที่ยิ่งใหญ่ที่สุด: จำเป็นหรือไม่ที่จะต้องเป็น API

ที่เกี่ยวข้อง: ตกลงเพื่อส่งคืน HTML จาก JSON API หรือไม่


4
ฉันจะย้อนกลับไปก่อนจะบอกว่ามันเป็นแค่ มีการตัดสินใจ "เรื่องใหญ่" ที่คุณต้องทำ: มันเป็น API หรือไม่ฉันมีห้องสมุดที่เหมาะสมที่จะทำงานกับมันเป็นข้อมูล JSON บนไคลเอนต์ซึ่งฉันจะสนับสนุนลูกค้าประเภทใด (เบราว์เซอร์ที่ไม่มี Javascript สำหรับ ตัวอย่างเช่น) สิ่งที่ปริมาณเทียบกับเวลา CPU ผมได้มีการใช้กลยุทธ์โปรแกรมเมอร์ของฉันจะยกระดับดีขึ้น ฯลฯ ฯลฯ ฯลฯ
Machado

7
“ มันไม่จำเป็นต้องตีความรหัส JS เพื่อสร้างวัตถุ DOM - วัตถุ DOM มีอยู่แล้วมันเป็นเพียงเรื่องของการเรนเดอร์” - ดีHTMLนั้นมีอยู่แล้ว (เมื่อมาถึงสาย) เบราว์เซอร์จะต้องแยกวิเคราะห์ HTML และสร้างวัตถุ DOM จากมัน
Paul D. Waite

7
ไม่มีเหตุผลที่ HTML ไม่สามารถทำหน้าที่เป็น API ได้ ศูนย์. ไม่มี. ในความเป็นจริง HAL + JSON และ HAL + XML มีความคล้ายคลึงกับ HTML นี่คือการพูดคุยที่ยอดเยี่ยมเกี่ยวกับ REST ส่วนที่เกี่ยวข้องเกี่ยวกับการส่งคืน HTML จากปลายทางอยู่ใกล้กับจุดสิ้นสุด youtu.be/pspy1H6A3FMส่วนตัวฉันทำให้ปลายทางทั้งหมดของฉันกลับมาทั้ง json และ HTML หากคุณกำลังเขียนบริการที่ค้นพบได้มันทำให้การเรียกดูเป็นเรื่องง่ายใน ... gasp ... เบราว์เซอร์
RubberDuck

4
เพราะมันเป็นตัวเมียที่สมบูรณ์ที่จะดึงข้อมูลที่คุณสนใจจริง ๆ แล้วลองใช้มันในรูปแบบใหม่?
DeadMG

4
ให้บริการ HTML ผ่าน HTTP หรือไม่ นี่คืออะไร? เว็บไซต์?
Ant P

50

JSON และ HTML ตอบสนองวัตถุประสงค์ที่แตกต่างกันสองวัตถุประสงค์

หากคุณกำลังเติมข้อมูลเว็บเพจให้ใช้ JSON หากคุณกำลังสร้างหน้าเว็บจากส่วนของหน้าเว็บให้ใช้ HTML

พวกเขาอาจจะฟังดูเหมือนพวกเขาจะเหมือนกัน แต่ก็ไม่ได้เลย สิ่งหนึ่งเมื่อคุณสร้างส่วนหนึ่งของหน้าเว็บโดยใช้ HTML ที่เซิร์ฟเวอร์ส่งคืนคุณกำลังทำงานกับฝั่งเซิร์ฟเวอร์ เมื่อคุณผูกข้อมูลกับเว็บเพจคุณกำลังทำงานกับฝั่งไคลเอ็นต์

นอกจากนี้คุณต้องระวังด้วย HTML เพื่อไม่ให้ผูกกับหน้าเว็บใดหน้าหนึ่งโดยเฉพาะ จุดทั้งหมดของการเรนเดอร์เพจบางส่วนด้วยวิธีนี้คือเพื่อให้ partials นั้นสามารถนำมาใช้ซ้ำได้และถ้าคุณสร้างบางส่วนที่เจาะจงเกินไปมันจะไม่เขียนไปยังเพจอื่น JSON ไม่มีปัญหานี้เพราะมันเป็นเพียงข้อมูลไม่ใช่โครงสร้างของหน้าเว็บ


1
"สิ่งหนึ่งเมื่อคุณสร้างส่วนหนึ่งของหน้าเว็บด้วย HTML คุณกำลังทำงานกับฝั่งเซิร์ฟเวอร์" ทำไม? ฉันไม่เห็นเหตุผลว่าทำไมถึงเป็นเช่นนี้ เห็นได้ชัดว่าเป็นเรื่องจริงสำหรับการโหลดหน้าเริ่มต้นและยังไม่นับตั้งแต่ที่ลูกค้าสามารถร้องขอข้อมูลที่ต้องการได้
DeadMG

3
@DeadMG มันควรจะพูดว่า "เมื่อคุณสร้างส่วนหนึ่งของหน้าเว็บโดยใช้ HTML ที่ส่งคืนโดยเซิร์ฟเวอร์" (ตรงข้ามกับการใช้ JSON ที่ส่งคืนโดยเซิร์ฟเวอร์)
user253751

จริง ๆ แล้ว แต่เนื่องจากมีแรงจูงใจเพียงเล็กน้อยสำหรับกรณีนี้ฉันไม่เห็นประเด็น
DeadMG

6
@DeadMG แรงบันดาลใจเล็ก ๆ น้อย ๆ สำหรับสิ่งที่เคยเป็นมา? ให้เซิร์ฟเวอร์คืน HTML หรือไม่ นั่นคือสิ่งที่คำถาม SE นี้ทั้งหมดเกี่ยวกับ
user253751

คำถามเกี่ยวกับว่าคุณควรส่งคืน HTML หรือไม่ เป็นที่ชัดเจนว่าการตอบสนองเริ่มต้นจะต้องเป็น HTML แต่ไม่มีเหตุผลที่ชัดเจนว่าทำไม API อื่น ๆ ควรส่งคืน HTML
DeadMG

22

ปัญหาหลักคือมันแน่นหนาคู่เซิร์ฟเวอร์กับลูกค้าที่ต้องรู้โครงสร้าง HTML นอกจากนี้ยังทำให้จุดสิ้นสุดยากต่อการใช้ซ้ำในรูปแบบใหม่หรือแอปพลิเคชันใหม่

การส่งคืนข้อมูลธรรมดาและให้ไคลเอนต์ทำให้การมีเพศสัมพันธ์ลดลงและเพิ่มความยืดหยุ่นและความสามารถในการทดสอบ - คุณสามารถเรียกใช้การทดสอบหน่วยบนไคลเอนต์สำหรับข้อมูลจำลองและเรียกใช้การทดสอบหน่วยบนเซิร์ฟเวอร์เพื่อทดสอบข้อมูลที่ต้องการ


11
HTML สามารถสร้างให้เป็นแบบทั่วไปอย่างสมเหตุสมผล คุณสามารถส่งคืนรายการสัญลักษณ์แสดงหัวข้อย่อยตัวอย่างและสิ่งต่าง ๆ ลงใน div ซึ่งจะมีการกำหนดสไตล์โดย CSS ที่มีอยู่ทั่วไป
Robert Harvey

10
นั่นไม่ใช่ทั้งหมดที่มีประโยชน์หากฉันต้องการยัดเยียดช่วงเวลานี้ หรือแสดงในแอปพลิเคชันอื่นซึ่งไม่ได้แสดงผลเป็น HTML
DeadMG

2
ฉันจะใช้ถ้อยคำที่เป็นมักจะเขียน HTML และรูปแบบของ HTML ที่มักจะต้องสมบูรณ์ที่สอดคล้องกันในการใช้งานทั้งหมดซึ่งไม่ได้รับประกันที่เป็นประโยชน์มาก ยกตัวอย่างเช่นใน app ของเราเรามีรายชื่อ แต่เราจริงไม่ได้ใช้ulและliแต่การเปลี่ยนแปลงที่จะทำให้แต่ละคนdiv(จำไม่ได้ว่าทำไม) คงจะเป็นเรื่องยุ่งยากหากเซิร์ฟเวอร์คืน HTML เป็นจำนวนมากพร้อมuls และlis ในนั้น
DeadMG

2
ดูเหมือนไม่มีจุดหมายที่จะได้รับการรับประกันในสถานที่แรกเมื่อคุณก็สามารถส่งข้อมูลและแจ้งให้ลูกค้าแสดงผลที่เป็น HTML ตามที่เห็นสมควร (ถ้ามันได้ไปทำให้มันเลย)
DeadMG

1
สถานการณ์เดียวที่ฉันเห็นว่า HTML ที่ส่งคืนจะเป็นที่ต้องการมากกว่านั้นคือถ้าไคลเอนต์มีทรัพยากรไม่เพียงพอที่จะทำการเรนเดอร์เอง
DeadMG

14

ฉันคิดว่าคุณมีมันข้างหลังเล็กน้อย คุณพูด:

เราไม่มีการทดสอบใด ๆ ดังนั้นเราจึงไม่มีเหตุผลใดที่จะสร้าง JSON endpoint นี้

เหตุผลในการใช้จุดปลายที่เหมาะสมคือเพื่อให้คุณสามารถทดสอบได้ ฉันจะบอกว่าไม่มีการทดสอบเป็นเหตุผลที่ดีมากที่จะเริ่มเขียนบางอย่าง นั่นคือถ้ามีตรรกะใด ๆ ที่จะเหมาะที่จะทดสอบ

บรรทัดโค้ดขนาด 200k นั้นมีจำนวนมากในการปรับโครงสร้างและอาจยากต่อการบำรุงรักษา การหาจุดสิ้นสุดและทดสอบพวกมันอาจเป็นจุดเริ่มต้นที่ดี

อีกสาเหตุหนึ่งก็คือการแยกเซิร์ฟเวอร์ออกจากไคลเอนต์ หากในอนาคตอันไกลการออกแบบแอพพลิเคชั่นหรือการเปลี่ยนแปลงเลย์เอาต์จะง่ายกว่าที่จะทำงานกับรูปแบบข้อมูลที่เหมาะสมกว่าเอาท์พุท HTML ในโลกอุดมคติคุณจะต้องเปลี่ยนไคลเอนต์และไม่ต้องแตะเซิร์ฟเวอร์เลย


จุดเกี่ยวกับการเปลี่ยนแปลงเค้าโครงดูเหมือนจะต้องการแยกแม่แบบออกจากข้อมูลพื้นฐาน แต่ไม่มีเหตุผลใดที่แม่แบบเหล่านั้นจะต้องอยู่บนไคลเอนต์ แน่นอนมีเหตุผลมากมายที่พวกเขาจะไม่เป็นเช่นคุณไม่สามารถตัดสินใจที่จะซ่อนข้อมูลจากลูกค้าหากการแสดงผลของคุณอยู่ในลูกค้า สามารถคัดลอกชิ้นส่วน HTML ซ้ำได้หากผลลัพธ์ออกมาจากระบบ templating เช่นเดียวกับหน้า HTML เต็ม
IMSoP

6

มี 3 วิธี (อย่างน้อย?) ในการสร้างหน้าเว็บ:

  • สร้างฝั่งเซิร์ฟเวอร์ทั้งหน้า
  • ส่งคืนหน้าเปล่าจากเซิร์ฟเวอร์พร้อมรหัส (JavaScript) และให้หน้าดึงข้อมูลและแสดงผลในฝั่งไคลเอ็นต์ HTML
  • ส่งคืนบางส่วนของหน้าพร้อมรหัสและดึงรหัสบล็อกที่แสดงผลล่วงหน้าของ HTML ที่สามารถวางลงในหน้า

อันแรกก็โอเค ส่วนที่สองก็ใช้ได้เช่นกัน เป็นคนสุดท้ายที่เป็นปัญหา

เหตุผลง่าย: ตอนนี้คุณได้แบ่งการสร้างหน้า HTML ออกเป็นส่วนที่ไม่ได้เชื่อมต่ออย่างสมบูรณ์ ปัญหาคือหนึ่งในการบำรุงรักษา ตอนนี้คุณมีสองเอนทิตีแยกต่างหากที่รับผิดชอบการจัดการรายละเอียดของ UI ดังนั้นคุณต้องเก็บ CSS และรายละเอียดอื่น ๆ ที่คล้ายคลึงกันให้ตรงกันระหว่างสองส่วนแยกกัน คุณเปลี่ยนความกว้างของแถบด้านข้างหรือไม่ ยิ่งใหญ่ ตอนนี้การแยกส่วน HTML ที่กลับมาทำให้เกิดการเลื่อนในแนวนอนเนื่องจากสมมติฐานเกี่ยวกับความกว้างของแถบด้านข้างไม่ได้ถูกเก็บไว้อีกต่อไป คุณเปลี่ยนสีพื้นหลังสำหรับบล็อกนั้นหรือไม่ เยี่ยมมากตอนนี้สีแบบอักษรของส่วน HTML ของคุณขัดแย้งกันเพราะถือว่ามีสีพื้นหลังที่แตกต่างกันและมีคนลืมทดสอบจุดปลายทางนั้น

ประเด็นก็คือตอนนี้คุณได้แยกความรู้ที่ควรจะรวมศูนย์ไว้ในที่เดียว (เช่นตรรกะการนำเสนอ) และทำให้ยากขึ้นเพื่อให้แน่ใจว่าชิ้นส่วนทั้งหมดเข้าด้วยกันอย่างถูกต้อง ด้วยการใช้ JSON API คุณสามารถเก็บตรรกะทั้งหมดนั้นไว้ในส่วนหน้าหรือคุณสามารถเก็บไว้ในแม่แบบฝั่งเซิร์ฟเวอร์ของคุณถ้าคุณแสดงข้อมูลของคุณเป็น HTML เพื่อเริ่มต้นด้วย มันเกี่ยวกับการนำเสนอความรู้ / ตรรกะในที่เดียวดังนั้นมันจึงสามารถจัดการได้อย่างสม่ำเสมอและเป็นส่วนหนึ่งของกระบวนการเดียว HTML / CSS / JS นั้นยากพอที่จะทำให้ตรงโดยไม่ทำให้มันกลายเป็นชิ้นเล็ก ๆ

JSON APIs ยังมีประโยชน์เพิ่มเติมในการทำให้ข้อมูลพร้อมใช้งานอย่างสมบูรณ์โดยอิสระจากตรรกะการนำเสนอ สิ่งนี้อนุญาตให้ผู้นำเสนอหลายคนที่แตกต่างกันเช่นทั้งแอพมือถือและเว็บเพจใช้ข้อมูลเดียวกัน โดยเฉพาะอย่างยิ่งมันช่วยให้การบริโภคข้อมูลโดยไม่ต้องเบราว์เซอร์ (เช่นแอพมือถือหรืองาน cron ทุกคืน); ผู้บริโภคเหล่านี้อาจไม่สามารถแยกวิเคราะห์ HTML ได้ (หลักสูตรนี้จำเป็นต้องอาศัยสถานการณ์ที่ข้อมูลเหมือนกันระหว่างผู้บริโภคที่แตกต่างกันหรือผู้ใช้สามารถใช้ชุดย่อยอื่น ๆ ได้) ไม่ว่าคุณต้องการความสามารถนี้หรือไม่ขึ้นอยู่กับข้อกำหนดของแอปพลิเคชันเฉพาะของคุณ ตรรกะเป็นสิ่งที่จำเป็นโดยไม่คำนึงถึง ฉันจะบอกว่าถ้าคุณใช้มันล่วงหน้าคุณจะพร้อมสำหรับการเติบโตในอนาคต


2
ฉันคิดว่าการหลีกเลี่ยงตรรกะการแสดงผลที่ซ้ำกันอาจเป็นเหตุผลที่ดีในการแสดงผลส่วนของหน้า HTML: หากคุณแสดงส่วนของหน้าบนเซิร์ฟเวอร์ (เช่นส่วนหัวและเค้าโครงพื้นฐาน) จากนั้นสร้างส่วนอื่น ๆ ตามข้อมูล JSON ของลูกค้า มีเทมเพลตสองชุดที่แตกต่างกัน การแสดงผล partials บนเซิร์ฟเวอร์จะย้ายตรรกะนี้กลับไปที่เลเยอร์การนำเสนอกลางของคุณซึ่งสามารถใช้เทมเพลตเดียวกันเพื่อสร้างการแสดงผลของแต่ละองค์ประกอบเช่นเดียวกับถ้ามันประกอบหน้าทั้งหมดแบบคงที่
IMSoP

1
คุณเป็นคนเดียวที่กล่าวถึงโทรศัพท์มือถือที่ฉันต้องการให้คุณพัน upvotes ที่
Lovis

1
@IMSoP หากคุณต้องการหน้าแบบไดนามิกคุณต้องมีตรรกะส่วนหน้า หากคุณยังคงแสดงแฟรกเมนต์ฝั่งเซิร์ฟเวอร์ตอนนี้คุณต้องแน่ใจว่าสมมติฐานของส่วนหน้าตรงกับเงื่อนไขล่วงหน้าของเซิร์ฟเวอร์ที่สร้างแฟรกเมนต์ คุณไม่สามารถทำลายการพึ่งพานั้นได้ การรักษาความรู้นั้นให้ตรงกันนั้นจะยากขึ้นหากความรู้นั้นแบ่งออกเป็นระบบที่ถูกแบ่งแยกอย่างสมบูรณ์ หากคุณเพิ่งแสดงผลที่ปลายด้านหน้าสมมติฐานเหล่านั้นจะรวมศูนย์ ฉันคิดว่าฉันยังหลีกเลี่ยงการผสมส่วนหน้าแบบไดนามิกกับสถานะเริ่มต้นในแม่แบบฝั่งเซิร์ฟเวอร์; "bootstrap" เพื่อเริ่มต้นส่วนหน้านั้นง่ายกว่า
jpmc26

4

ฉันจะบอกว่าไม่มีอะไรผิดปกติกับเซิร์ฟเวอร์ที่ส่งคืนชิ้นส่วน HTML และ UI กำหนดให้. ภายใน HTML ขององค์ประกอบบางอย่าง นี่คือความคิดของฉันวิธีที่ง่ายที่สุดในการพัฒนาโค้ด JavaScript แบบอะซิงโครนัส ประโยชน์คือการใช้ JavaScript ให้น้อยที่สุดเท่าที่จะทำได้ในสภาพแวดล้อมแบ็คเอนด์ที่มีการควบคุม โปรดจำไว้ว่าการรองรับ JavaScript ในเบราว์เซอร์แตกต่างกันไป แต่ส่วนท้ายของคุณมักจะมีส่วนประกอบของส่วนหลังเหมือนกันซึ่งหมายความว่าการทำมากที่สุดในส่วนหลังจะหมายถึงความเข้ากันไม่ได้ของรุ่นที่เล็กที่สุด

ตอนนี้บางครั้งคุณต้องการมากกว่าแค่ส่วนย่อย HTML ตัวอย่างเช่นรหัสสถานะและแฟรกเมนต์ HTML จากนั้นคุณสามารถใช้อ็อบเจ็กต์ JSON ที่มีสองสมาชิก statusCode และ HTML ซึ่งสามารถกำหนดที่สองให้กับ. innerHTML ขององค์ประกอบบางส่วนหลังจากตรวจสอบ statusCode ดังนั้นการใช้ JSON และการใช้ innerHTML จึงไม่ใช่ทางเลือกพิเศษ พวกเขาสามารถใช้ร่วมกัน

โดยใช้ JSON คุณสามารถมีหลายส่วน HTML ในการตอบสนองเดียวกันซึ่งได้รับมอบหมายให้. innerHTML ขององค์ประกอบหลาย ๆ

โดยสรุป: ใช้. innerHTML มันทำให้รหัสของคุณเข้ากันได้กับเบราว์เซอร์เวอร์ชันมากที่สุด หากต้องการมากกว่านี้ให้ใช้ JSON และ .innerHTML ร่วมกัน หลีกเลี่ยง XML


4

มีอะไรผิดปกติคือในหลักการ คำถามคือคุณต้องการบรรลุอะไร

JSON นั้นสมบูรณ์แบบสำหรับการส่งข้อมูล หากคุณส่ง HTML แทนและคาดว่าลูกค้าจะดึงข้อมูลจาก HTML นั่นเป็นขยะ

ในทางตรงกันข้ามถ้าคุณต้องการส่ง HMTL ที่จะแสดงเป็น HTML จากนั้นส่งเป็น HTML - แทนที่จะบรรจุ HTML เป็นสตริงเปลี่ยนสตริงเป็น JSON ส่ง JSON ถอดรหัสอีกด้านหนึ่ง รับสตริงและแยก HTML ออกจากสตริง

และเมื่อวานนี้ฉันพบโค้ดที่ใส่สองรายการลงในอาร์เรย์เปลี่ยนอาร์เรย์เป็น JSON ใส่ JSON ลงในสตริงใส่สตริงภายในอาร์เรย์เปลี่ยนทั้งอาร์เรย์เป็น JSON ส่งไปยังไคลเอ็นต์ซึ่งถอดรหัส JSON ได้รับอาร์เรย์ที่มีสตริงเอาสตริงดึง JSON จากสตริงถอดรหัส JSON และได้อาร์เรย์ที่มีสองรายการ อย่าทำอย่างนั้น


+1 แน่นอน คำถามแรกคือคุณต้องรับอะไร อาจมีความผิดพลาดเล็กน้อยกับโฆษณาปลายทางที่แสดงแถบด้านข้างเป็นบิตของ HTML หรืออาจเป็นส่วนท้ายหรือองค์ประกอบที่คล้ายกัน
SQB

3

ทั้งหมดนี้ขึ้นอยู่กับวัตถุประสงค์ของ API แต่โดยทั่วไปสิ่งที่คุณอธิบายมีการละเมิดข้อกังวลอย่างมาก :

ในแอปพลิเคชันที่ทันสมัยรหัส API ควรรับผิดชอบข้อมูลและรหัสลูกค้าควรรับผิดชอบการนำเสนอ

เมื่อ API ของคุณส่งคืน HTML คุณจะเชื่อมโยงข้อมูลและงานนำเสนอของคุณอย่างแน่นหนา เมื่อ API ส่งคืน HTML สิ่งเดียวที่คุณสามารถทำได้ (อย่างง่ายดาย) เมื่อใช้ HTML นั้นแสดงเป็นส่วนหนึ่งของหน้าขนาดใหญ่ จากมุมที่แตกต่างสิ่งเดียวที่ดีสำหรับ API คือการส่งหน้าเว็บของคุณด้วย HTML นอกจากนี้คุณได้เผยแพร่ HTML ของคุณทั้งในไคลเอนต์และเซิร์ฟเวอร์ ซึ่งสามารถทำให้การบำรุงรักษาปวดหัว

หาก API ของคุณส่งคืน JSON หรือข้อมูลบริสุทธิ์บางรูปแบบมันจะมีประโยชน์มากขึ้น แอพที่มีอยู่ยังคงสามารถใช้ข้อมูลนั้นและนำเสนอได้อย่างเหมาะสม แม้ว่าตอนนี้สิ่งอื่น ๆ สามารถใช้ API เพื่อเข้าถึงข้อมูลเดียวกันได้ การบำรุงรักษาก็ง่ายขึ้นเช่นกัน HTML ทั้งหมดอยู่ในที่เดียวดังนั้นหากคุณต้องการจัดรูปแบบทั้งไซต์ใหม่คุณไม่จำเป็นต้องเปลี่ยน API ของคุณ


5
"ในแอปพลิเคชันที่ทันสมัยรหัส API ควรรับผิดชอบข้อมูลและรหัสลูกค้าควรรับผิดชอบการนำเสนอ" เหตุใดจึงเป็นเช่นนี้เสมอ ฉันยอมรับว่านี่เป็นรูปแบบทั่วไปและทำให้บางสิ่งง่ายขึ้น แต่ฉันไม่เห็นเหตุผลที่จะยกระดับไปสู่ระดับ "ควร" ... มันเป็นการตัดสินใจที่ต้องดำเนินการเป็นกรณี ๆ ไป และมีเหตุผลอย่างแน่นอนว่าทำไมในบางสถานการณ์คุณอาจต้องการตัดสินใจที่แตกต่าง
จูลส์มี. ค.

@Jules เพราะถ้าคุณมี API และลูกค้าการมีทั้งหน้าที่รับผิดชอบในการแสดงผลเป็นการละเมิดการแยกข้อกังวล (ตอนนี้คุณไม่จำเป็นต้องมี API และไคลเอนต์คุณสามารถมีเพียงองค์ประกอบเดียวและให้มันทำการนำเสนอทั้งหมด แต่แล้วคุณไม่มี API)
njzk2

@ njzk2 เพียงเพราะ API ส่งข้อมูล HTML ไม่ได้หมายความว่ามันแสดงผลแล้ว มันอาจจะถือว่า HTML เป็นหยดและเก็บไว้ในฐานข้อมูลตัวอย่างเช่น นอกจากนี้การแสดงผลบางอย่างอาจจำเป็นต้องใช้บนเซิร์ฟเวอร์มากกว่าไคลเอนต์ (เช่นจัดเตรียมหน้าคงที่สำหรับเครื่องมือค้นหา) ดังนั้นการนำความสามารถนั้นมาใช้ซ้ำอาจถูกมองว่าเป็นการกำจัดความซ้ำซ้อน
Jules

1
นอกจากนี้ยังเป็นไปได้ทั้งหมดในการสร้างไคลเอนต์และ api pair ที่การเรนเดอร์ทั้งหมดเกิดขึ้นที่เซิร์ฟเวอร์และลูกค้าเพียงแค่ทำการส่ง HTML ในช่องที่กำหนดไว้ล่วงหน้าใน DOM Jquery มีโมดูลทั้งหมดที่อุทิศให้กับลูกค้าประเภทนี้ซึ่งแนะนำให้ฉันว่าพวกเขาจะต้องเป็นเรื่องธรรมดา
Jules

1
@Jules หลาย ๆ สิ่งเป็นเรื่องธรรมดาพอสมควรนั่นไม่ใช่เหตุผลว่าทำไมพวกเขาถึงมีเหตุผล
njzk2

2

HTML นั้นเชื่อมโยงกับการออกแบบและการใช้งานเฉพาะ

ด้วย HTML หากคุณต้องการเปลี่ยนเค้าโครงเพจคุณต้องเปลี่ยนวิธีการสร้าง HTML โดยการเรียกเซิร์ฟเวอร์ โดยปกติแล้วต้องใช้โปรแกรมเมอร์ส่วนท้าย ตอนนี้คุณมีโปรแกรมเมอร์แบ็คเอนด์ซึ่งตามนิยามแล้วไม่ใช่นักเขียน html ที่ดีที่สุดของคุณจัดการการอัพเดตเหล่านี้

ด้วย JSON หากเลย์เอาต์ของเพจเปลี่ยนแปลงการโทรเซิร์ฟเวอร์ JSON ที่มีอยู่ไม่จำเป็นต้องเปลี่ยนเลย ผู้พัฒนาส่วนหน้าของคุณหรือแม้กระทั่งนักออกแบบจะอัปเดตเทมเพลตเพื่อสร้าง HTML ที่แตกต่างที่คุณต้องการจากข้อมูลพื้นฐานเดียวกัน

นอกจากนี้ JSON สามารถเป็นพื้นฐานสำหรับบริการอื่น ๆ คุณอาจมีบทบาทที่แตกต่างกันซึ่งจำเป็นต้องดูข้อมูลพื้นฐานเดียวกันในวิธีที่ต่างกัน ตัวอย่างเช่นคุณอาจมีเว็บไซต์ลูกค้าที่แสดงข้อมูลเกี่ยวกับผลิตภัณฑ์ในหน้าคำสั่งซื้อและหน้าขายภายในสำหรับพนักงานที่แสดงข้อมูลเดียวกันในรูปแบบที่แตกต่างกันมากบางทีอาจอยู่ข้างข้อมูลอื่น ๆ ที่ไม่สามารถใช้ได้กับลูกค้าทั่วไป ด้วย JSON การเรียกเซิร์ฟเวอร์เดียวกันสามารถใช้ในทั้งสองมุมมอง

ในที่สุด JSON สามารถปรับขนาดได้ดีขึ้น ในช่วงไม่กี่ปีที่ผ่านมาเราได้ไปตกอยู่ในกรอบจาวาสคริปต์ทางฝั่งไคลเอ็นต์ ฉันคิดว่าถึงเวลาแล้วที่จะต้องถอยห่างออกไปและเริ่มคิดถึงจาวาสคริปต์ที่เราใช้อยู่และมันส่งผลต่อประสิทธิภาพของเบราว์เซอร์อย่างไร ... โดยเฉพาะบนอุปกรณ์มือถือ ที่กล่าวว่าหากคุณใช้งานเว็บไซต์ที่ใหญ่พอที่จะต้องใช้เซิร์ฟเวอร์ฟาร์มหรือคลัสเตอร์แทนที่จะเป็นเซิร์ฟเวอร์เดียว JSON สามารถปรับขนาดได้ดีขึ้น ผู้ใช้จะให้เวลาในการประมวลผลในเบราว์เซอร์ฟรีและถ้าคุณใช้ประโยชน์จากสิ่งที่คุณสามารถลดภาระของเซิร์ฟเวอร์ในการปรับใช้ขนาดใหญ่ JSON ยังใช้แบนด์วิดท์น้อยลงดังนั้นถ้าคุณใหญ่พอและใช้อย่างเหมาะสม JSON นั้นถูกกว่า แน่นอนว่ามันสามารถลดขนาดลงได้ถ้าคุณจบการป้อน 40KB ไลบรารี่เพื่อแยก 2KB ของข้อมูลเป็น 7KB ของ html ดังนั้นอีกครั้ง: จ่ายเพื่อให้ตระหนักถึงสิ่งที่คุณทำ แต่มีศักยภาพสำหรับ JSON เพื่อปรับปรุงประสิทธิภาพและค่าใช้จ่าย


1

ไม่มีอะไรผิดปกติกับจุดสิ้นสุดดังกล่าวหากตอบสนองความต้องการของมัน หากจำเป็นต้องแยก html ที่ผู้ใช้ที่รู้จักสามารถแยกวิเคราะห์ได้อย่างมีประสิทธิภาพแน่นอนว่าทำไมไม่

ปัญหาคือสำหรับกรณีทั่วไปคุณต้องการให้จุดปลายของคุณคาย payload ที่มีรูปแบบที่ดีและแยกวิเคราะห์ได้อย่างมีประสิทธิภาพโดย parser มาตรฐาน และโดยการแยกวิเคราะห์ได้อย่างมีประสิทธิภาพฉันหมายถึงแยกวิเคราะห์ได้อย่างชัดเจน

หากไคลเอ็นต์ของคุณถูกบังคับให้อ่านบิตข้อมูล payload และ pry open จากมันด้วยลูปและ if-statements ดังนั้นจึงไม่สามารถแยกวิเคราะห์ได้อย่างมีประสิทธิภาพ และ HTML นั้นเป็นวิธีการที่ได้รับการอภัยอย่างมากโดยไม่ต้องการให้ตัวเองมีรูปแบบที่เหมาะสม

ตอนนี้ถ้าคุณแน่ใจว่า html ของคุณเป็นไปตามมาตรฐาน xml แสดงว่าคุณเป็นทองคำ

จากที่กล่าวมาฉันมีปัญหาสำคัญกับสิ่งนี้:

ฉันจะบอกคุณนี้: ปลายทางที่ส่งคืน HTML จะลดการพึ่งพาไลบรารี JavaScript และลดภาระในเบราว์เซอร์ผู้ใช้เนื่องจากไม่จำเป็นต้องตีความ / เรียกใช้รหัส JS เพื่อสร้างวัตถุ DOM - HTML มีอยู่แล้ว มันเป็นเพียงเรื่องของการแยกวิเคราะห์องค์ประกอบและการแสดงผล แน่นอนนี่หมายความว่าเรากำลังพูดถึงปริมาณข้อมูลที่สมเหตุสมผล ข้อมูล HTML ขนาด 10 เมกะไบต์ไม่สมเหตุสมผล

นั่นเป็นความคิดที่ไม่ดีไม่ว่าคุณจะตัดมันอย่างไร ทศวรรษของประสบการณ์ในอุตสาหกรรมโดยรวมได้แสดงให้เราเห็นว่าโดยทั่วไปแล้วมันเป็นความคิดที่ดีที่จะแยกข้อมูล (หรือรุ่น) ออกจากจอแสดงผล (หรือมุมมอง)

ที่นี่คุณกำลังแช่งสองสิ่งเพื่อจุดประสงค์ในการเรียกใช้โค้ด JS อย่างรวดเร็ว และนั่นคือการเพิ่มประสิทธิภาพขนาดเล็ก

ฉันไม่เคยเห็นสิ่งนี้เป็นความคิดที่ดียกเว้นในระบบที่ไม่สำคัญมาก

คำแนะนำของฉัน? อย่าทำมัน HC SVNT DRACONES , YMMV เป็นต้น


0

JSON เป็นเพียงการนำเสนอที่เป็นข้อความของข้อมูลที่มีโครงสร้าง ลูกค้าต้องมีโปรแกรมแยกวิเคราะห์เพื่อประมวลผลข้อมูล แต่ทุกภาษามีฟังก์ชั่นวิเคราะห์คำ JSON การใช้ตัวแยกวิเคราะห์ JSON นั้นมีประสิทธิภาพมากกว่าการใช้ตัวแยกวิเคราะห์ HTML ใช้เวลาเพียงเล็กน้อย ไม่เช่นนั้นกับ parser HTML

ใน PHP คุณเพียงแค่ใช้json_encode($data)และมันก็ขึ้นอยู่กับลูกค้าในด้านอื่น ๆ เพื่อแยกมัน และเมื่อคุณดึงข้อมูล JSON จากบริการเว็บคุณเพียงแค่ใช้$data=json_decode($response)และคุณสามารถตัดสินใจได้ว่าจะใช้ข้อมูลอย่างไรเช่นเดียวกับตัวแปร

สมมติว่าคุณพัฒนาแอพสำหรับอุปกรณ์พกพาทำไมคุณถึงต้องการรูปแบบ HTML เมื่อแอพมือถือไม่ค่อยใช้เว็บเบราว์เซอร์ในการวิเคราะห์ข้อมูล แอพมือถือจำนวนมากใช้ JSON (รูปแบบที่พบบ่อยที่สุด) เพื่อแลกเปลี่ยนข้อมูล

เมื่อพิจารณาว่าโทรศัพท์มือถือมักมีแผนแบบมิเตอร์ทำไมคุณต้องการใช้ HTML ที่ใช้แบนด์วิดท์มากกว่า JSON มาก

ทำไมต้องใช้ HMTL เมื่อ HTML ถูก จำกัด ในคำศัพท์และ JSON สามารถกำหนดข้อมูลได้ {"person_name":"Jeff Doe"}มีข้อมูลมากกว่า HTML สามารถให้ข้อมูลเกี่ยวกับข้อมูลได้เนื่องจากจะกำหนดโครงสร้างสำหรับตัวแยกวิเคราะห์ HTML เท่านั้นไม่ใช่กำหนดข้อมูล

JSON ไม่มีส่วนเกี่ยวข้องกับ HTTP คุณสามารถใส่ JSON ในไฟล์ คุณสามารถใช้มันสำหรับการกำหนดค่า นักแต่งเพลงใช้ JSON คุณสามารถใช้มันเพื่อบันทึกตัวแปรอย่างง่ายไปยังไฟล์ได้เช่นกัน


0

เป็นการยากที่จะจัดหมวดหมู่ถูกหรือผิด IMO คำถามที่ฉันถามคือ: " ควร " หรือ " ทำได้น้อยกว่านี้หรือ "

จุดสิ้นสุดทุกจุดควรพยายามสื่อสารด้วยเนื้อหาที่น้อยที่สุดเท่าที่จะทำได้ อัตราส่วนสัญญาณต่อสัญญาณรบกวนมักจะเป็นรหัส HTTP <JSON <XHTML ในสถานการณ์ส่วนใหญ่คุณควรเลือกโปรโตคอลที่มีเสียงรบกวนน้อยที่สุด

ฉันแตกต่างกันตรงประเด็นเกี่ยวกับโหลดเบราว์เซอร์ไคลเอ็นต์โดย @machado เช่นเดียวกับเบราว์เซอร์ที่ทันสมัยนี่ไม่ใช่ปัญหา ส่วนใหญ่มีการจัดการกับรหัส HTTP และการตอบสนอง JSON ค่อนข้างดี และถึงแม้ว่าคุณจะไม่ได้ทำการทดสอบในตอนนี้ แต่การบำรุงรักษาโปรโตคอลที่มีเสียงดังน้อยกว่าในระยะยาวจะถูกกว่าที่กล่าวไว้ข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.