ฉันมี webapp แบบหน้าเดียวแบบ jquery มันสื่อสารกับบริการเว็บสงบผ่านสาย AJAX
ฉันพยายามทำสิ่งต่อไปนี้ให้สำเร็จ:
- ส่ง POST ที่มีข้อมูล JSON ไปยัง URL REST
- หากคำขอระบุการตอบสนอง JSON ดังนั้น JSON จะถูกส่งกลับ
- หากคำขอระบุการตอบสนอง PDF / XLS / etc จะส่งกลับไบนารีที่ดาวน์โหลดได้
ฉันทำงานได้ 1 & 2 ในขณะนี้และแอป jquery ของลูกค้าจะแสดงข้อมูลที่ส่งคืนในหน้าเว็บด้วยการสร้างองค์ประกอบ DOM ตามข้อมูล JSON ฉันยังมี # 3 ทำงานจากมุมมองของเว็บเซอร์วิสซึ่งหมายความว่ามันจะสร้างและส่งคืนไฟล์ไบนารีหากกำหนดพารามิเตอร์ JSON ที่ถูกต้อง แต่ฉันไม่แน่ใจวิธีที่ดีที่สุดในการจัดการกับ # 3 ในรหัสจาวาสคริปต์ของลูกค้า
เป็นไปได้ไหมที่จะรับไฟล์ที่ดาวน์โหลดได้จากการโทร ajax เช่นนี้? ฉันจะรับเบราว์เซอร์เพื่อดาวน์โหลดและบันทึกไฟล์ได้อย่างไร
$.ajax({
type: "POST",
url: "/services/test",
contentType: "application/json",
data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),
dataType: "json",
success: function(json, status){
if (status != "success") {
log("Error loading data");
return;
}
log("Data loaded!");
},
error: function(result, status, err) {
log("Error loading data");
return;
}
});
เซิร์ฟเวอร์ตอบสนองด้วยส่วนหัวต่อไปนี้:
Content-Disposition:attachment; filename=export-1282022272283.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)
อีกแนวคิดหนึ่งคือการสร้าง PDF และเก็บไว้ในเซิร์ฟเวอร์และส่งคืน JSON ที่มี URL ไปยังไฟล์ จากนั้นออกการโทรอื่นในตัวจัดการความสำเร็จ ajax เพื่อทำสิ่งต่อไปนี้:
success: function(json,status) {
window.location.href = json.url;
}
แต่การทำเช่นนั้นหมายความว่าฉันจะต้องโทรมากกว่าหนึ่งครั้งไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์ของฉันจะต้องสร้างไฟล์ที่ดาวน์โหลดได้จัดเก็บไว้ที่ใดที่หนึ่งจากนั้นจึงล้างพื้นที่เก็บข้อมูลเป็นระยะ
ต้องมีวิธีที่ง่ายกว่าในการทำสิ่งนี้ให้สำเร็จ ไอเดีย?
แก้ไข: หลังจากตรวจสอบเอกสารสำหรับ $ .ajax ฉันเห็นว่า dataType สามารถตอบสนองได้เพียงหนึ่งxml, html, script, json, jsonp, text
ดังนั้นฉันเดาว่าจะไม่มีวิธีดาวน์โหลดไฟล์โดยตรงโดยใช้คำขอ ajax เว้นแต่ฉันจะฝังไฟล์ไบนารีในการใช้ โครงการ Data URI ตามที่แนะนำในคำตอบ @VinayC (ซึ่งไม่ใช่สิ่งที่ฉันต้องการจะทำ)
ดังนั้นฉันเดาตัวเลือกของฉันคือ:
ไม่ใช้ Ajax และส่งการโพสต์แบบฟอร์มและฝังข้อมูล JSON ของฉันลงในค่าฟอร์ม อาจจะต้องยุ่งกับ iframes ที่ซ่อนอยู่และเช่นนั้น
อย่าใช้ Ajax และแปลงข้อมูล JSON ของฉันเป็นสตริงข้อความค้นหาเพื่อสร้างคำขอ GET มาตรฐานและตั้ง window.location.href เป็น URL นี้ อาจต้องใช้ event.preventDefault () ในตัวจัดการคลิกของฉันเพื่อไม่ให้เบราว์เซอร์เปลี่ยนจาก URL แอปพลิเคชัน
ใช้แนวคิดอื่นของฉันด้านบน แต่ปรับปรุงด้วยคำแนะนำจากคำตอบ @naikus ส่งคำขอ AJAX ด้วยพารามิเตอร์บางอย่างที่ช่วยให้เว็บเซอร์วิสทราบว่ากำลังถูกเรียกผ่าน ajax call หากบริการเว็บถูกเรียกจากการโทร ajax เพียงส่งคืน JSON ด้วย URL ไปยังทรัพยากรที่สร้างขึ้น หากเรียกใช้ทรัพยากรโดยตรงให้ส่งคืนไฟล์ไบนารีจริง
ยิ่งฉันคิดถึงมันมากเท่าไหร่ฉันก็ยิ่งชอบตัวเลือกสุดท้ายเท่านั้น วิธีนี้ฉันสามารถรับข้อมูลกลับเกี่ยวกับคำขอ (เวลาในการสร้างขนาดไฟล์ข้อความผิดพลาด ฯลฯ ) และฉันสามารถดำเนินการกับข้อมูลนั้นก่อนที่จะเริ่มดาวน์โหลด ข้อเสียคือการจัดการไฟล์พิเศษบนเซิร์ฟเวอร์
มีวิธีอื่นอีกไหมในการทำสิ่งนี้ให้สำเร็จ ข้อดี / ข้อเสียของวิธีการเหล่านี้ฉันควรทราบหรือไม่?
url = 'http://localhost/file.php?file='+ $('input').val(); window.open(url);
วิธีง่ายๆในการรับผลลัพธ์เดียวกัน ใส่ส่วนหัวในไฟล์ php ไม่จำเป็นต้องส่ง ajax หรือรับคำขอ