ผู้แต่ง: Dflying Chen ( http://dflying.cnblogs.com/ )
ในโพสต์ก่อนหน้า (การเรียกบริการเว็บใน ASP.NET Atlas - การสร้าง Mashup เพื่อเรียกบริการเว็บระยะไกล (อินสแตนซ์ Yahoo! Weather)) ฉันแนะนำการใช้ BridgeRestProxy เพื่อดำเนินการ Mashup บนบริการเว็บ อย่างไรก็ตาม ในการพัฒนาจริง วิธีการง่ายๆ นี้มักจะไม่เพียงพอ เราจำเป็นต้องเขียนโค้ดโปรแกรมเพื่อทำให้ตรรกะที่ซับซ้อนบางอย่างสมบูรณ์ นั่นคือ ใช้ Proxy Class ที่ซับซ้อนที่กำหนดเองแทนการใช้คลาสที่มีอยู่แล้วใน Atlas รวมถึงแท็ก XML บางส่วนในไฟล์ asbx วันนี้เราจะยกตัวอย่างที่ซับซ้อนกว่านี้: Mashup Google's Search Service เพื่อเรียนรู้การใช้คลาสที่กำหนดเองเพื่อเรียกพร็อกซีไปยังบริการเว็บระยะไกล
ขั้นแรก มาดูบริการต่างๆ ของ Google กันดีกว่า: Google ได้จัดเตรียมชุด API ให้กับนักพัฒนา ซึ่งคุณสามารถดูได้ ที่ http://api.google.com/ สำหรับ Search API ที่เราจะใช้ในวันนี้ คุณยังสามารถไปที่ http://api.google.com/Apply for a Google License Key และรวม Key นี้ไว้ในทุกคำขอที่ส่งถึง Google ฉันได้ดูเอกสารของ Google และบอกว่ารหัสใบอนุญาตแต่ละรหัสอนุญาตเพียง 1,000 คำขอต่อวัน หากคุณต้องการใช้การค้นหาของ Google บนเว็บไซต์ขนาดใหญ่ ฉันเกรงว่าคุณจะต้องเตรียมรหัสใบอนุญาตจำนวนมาก.. . Google ขี้เหนียวจริงๆ-_-b
หลังจากสมัครรหัสใบอนุญาตแล้ว เราก็สามารถเริ่มต้นได้ แน่นอนว่า หากนี่เป็นครั้งแรกที่คุณได้ติดต่อกับ Mashup คุณอาจต้องการอ้างอิงบทความของฉันนี้: การเรียกบริการเว็บใน ASP.NET Atlas - การสร้าง Mashup เพื่อเรียกใช้บริการเว็บระยะไกล (พื้นฐานและตัวอย่างง่ายๆ)
ขั้นแรก ให้ใช้เครื่องมือ wsdl.exe ที่มาพร้อมกับ Visual Studio เพื่อสร้างโค้ด C# ที่เรียกใช้ Google Web Service ตามที่อยู่ wsdl:
wsdl.exe http://api.google.com/GoogleSearch.wsdl
จะสร้าง GoogleSearchService.cs เพิ่มลงในไดเร็กทอรี App_Code ของเว็บไซต์ของเรา ณ จุดนี้ เราสามารถใช้คลาสในไฟล์นี้ได้โดยตรง ซึ่ง GoogleSearchService.doGoogleSearch() เป็นวิธีที่เราต้องการ แต่ลองดูที่คลาสยุ่งๆ ที่สร้างขึ้นโดยอัตโนมัตินี้ มีวิธีการอื่นๆ อีกมากมายในนั้น และเมธอด doGoogleSearch() ก็ต้องการพารามิเตอร์จำนวนมากเช่นกัน ดังนั้นเราควรรวมไฟล์ที่ยุ่งนี้ก่อน ห่อหุ้มและทำให้การโทรง่ายขึ้น
ในโปรแกรมตัวอย่างนี้ สำหรับผลการค้นหาแต่ละรายการ เราจำเป็นต้องได้รับฟิลด์ Title, URL และ Snippet เท่านั้น เพื่อลดการรับส่งข้อมูลเครือข่าย เราไม่ได้ใช้คลาสผลการค้นหาที่มาพร้อมกับ GoogleSearchService.cs แต่ปรับแต่งคลาส SearchResultLite ที่มีเฉพาะเนื้อหาที่เราต้องการเท่านั้น:
คลาสสาธารณะ SearchResultLite
-
สตริงส่วนตัว _title;
ชื่อสตริงสาธารณะ
-
รับ { กลับ _title;
ตั้งค่า { _title = ค่า; }
}
สตริงส่วนตัว _url;
URL สตริงสาธารณะ
-
รับ { กลับ _url;
ตั้งค่า { _url = ค่า; }
}
สตริงส่วนตัว _snippet;
ตัวอย่างสตริงสาธารณะ
-
รับ { กลับ _snippet;
ตั้งค่า { _snippet = ค่า }
}
สาธารณะ SearchResultLite()
-
}
SearchResultLite สาธารณะ (ชื่อสตริง, URL สตริง, ข้อมูลโค้ดสตริง)
-
_title = ชื่อเรื่อง;
_url = url;
_snippet = ตัวอย่าง;
-
}
โปรดทราบว่าคลาส SearchResultLite ข้างต้นต้องมีตัวสร้างแบบไม่มีพารามิเตอร์เริ่มต้น และแต่ละฟิลด์ต้องใช้แอตทริบิวต์แทนสมาชิกสาธารณะ มิฉะนั้น Atlas จะสร้างข้อผิดพลาดในระหว่างกระบวนการแปลงเป็นออบเจ็กต์ JavaScript
มาสรุป GoogleSearchService.doGoogleSearch():
GoogleSearchWarpper ระดับสาธารณะกันดีกว่า
-
SearchResultLite สาธารณะ [] ค้นหา (สตริง lisenceKey, แบบสอบถามสตริง)
-
GoogleSearchService s = GoogleSearchService ใหม่();
ผลลัพธ์ GoogleSearchResult = s.doGoogleSearch(
ใบอนุญาตคีย์,
แบบสอบถาม
0,
10,
เท็จ,
-
เท็จ,
-
-
-
-
รายการ
foreach (องค์ประกอบ ResultsElement ใน result.resultElements)
-
SearchResultLite resultLite = SearchResultLite ใหม่ (elem.title, elem.URL, elem.snippet);
resultLites.Add(resultLite);
-
กลับ resultLites.ToArray();
-
}
ด้วยวิธีนี้ เราต้องการเพียงสองพารามิเตอร์เมื่อเรียกใช้เมธอด Search และไม่มีส่วนที่ซ้ำซ้อนในข้อมูลที่ส่งคืน บันทึกเป็น GoogleSearchWarpper.cs
ต่อไป เราต้องเพิ่ม License Key ที่สมัครไว้ตอนต้นให้กับไฟล์ web.config ซึ่งจะใช้ในขั้นตอนต่อๆ ไป:
มาดูการประกาศของไฟล์ Bridge GoogleSearchBridge.asbx:
<ชื่อวิธีการ = "ค้นหา">
<อินพุต>
<ชื่อพารามิเตอร์ = "แบบสอบถาม" />
อินพุต>
วิธีการ>
โปรดสังเกตว่าค่าแอตทริบิวต์ประเภทของส่วน
ค่าแอตทริบิวต์ value ของ LicenseKey ถูกตั้งค่าเป็น % การตั้งค่าแอป: GoogleWebAPILisenceKey % นี่เป็นวิธีการเขียนแบบใหม่ที่นำมาใช้ในไฟล์ asbx ซึ่งหมายความว่าค่าจะถูกกำหนดให้กับส่วน appSettings บนเว็บ ไฟล์ config ตอนรันไทม์คือค่าของ GoogleWebAPILisenceKey
ข้อความค้นหาจะถูกส่งผ่านจากไคลเอนต์และแสดงถึงคำสำคัญของข้อความค้นหา
ณ จุดนี้ เราสามารถทดสอบได้ในหน้า Atlas แน่นอนว่าขั้นตอนแรกคือการเพิ่ม ScriptManager ให้กับเพจและการอ้างอิงถึง Bridge ด้านบน:
<บริการ>
บริการ>
เพิ่มส่วนของ HTML เพื่อให้ผู้ใช้สามารถป้อนคำสำคัญในการสืบค้น ทริกเกอร์การสืบค้น และแสดงผลลัพธ์:
สุดท้ายนี้ เขียน JavaScript แล้วคุณจะเห็นการใช้ Sys.StringBuilder:
function btnSearch_onclick() {
var tbQuery = Sys.UI.TextBox ใหม่($("tbQuery"));
Dflying.GoogleSearch.Search({'query': tbQuery.get_text()}, onSearchComplete);
}
ฟังก์ชั่น onSearchComplete (ผลลัพธ์) {
var sbResult = Sys.StringBuilder ใหม่ ();
สำหรับ (var i = 0; i < result.length; ++i) {
sbResult.append("<ชม />");
sbResult.append("" + result[i].Title + "
");
sbResult.append("" + result[i].Url + "
" );
sbResult.append(ผลลัพธ์[i].ตัวอย่าง);
-
$('ผลลัพธ์').innerHTML = sbResult.toString();
}
สามารถดาวน์โหลดโปรแกรมตัวอย่างได้ที่นี่: