เอกสารนี้จะอธิบายวิธีการรับและติดตั้ง NuSOAP จากนั้นให้ตัวอย่างบางส่วนที่แสดงให้เห็นถึงฟังก์ชันต่างๆ ของ NuSOAP นี่ไม่ใช่การแนะนำ NuSOAP ที่ครอบคลุม แต่หวังว่านักพัฒนา PHP บางคนจะมีคำแนะนำที่ดี
NuSOAP คือชุดของคลาส PHP ที่ช่วยให้นักพัฒนาสามารถสร้างและใช้บริการเว็บ SOAP ได้ ไม่จำเป็นต้องติดตั้งส่วนขยาย PHP ใด ๆ ได้รับการพัฒนาเมื่อวันที่ 3 ธันวาคม พ.ศ. 2547 และเวอร์ชันปัจจุบันคือ NuSOAP (0.6.7) ด้วยการรองรับข้อกำหนด SOAP 1.1 ทำให้สามารถสร้างและใช้ WSDL 1.1 และยังรองรับบริการ rpc/encoded และบริการเอกสาร/ตัวอักษรอีกด้วย อย่างไรก็ตาม สิ่งสำคัญที่ควรทราบคือ NuSOAP ไม่ได้จัดเตรียมการใช้งานที่สมบูรณ์ เช่น .NET และ Apache Axis
สวัสดีชาวโลก
ฉันจะเริ่มต้นด้วยตัวอย่าง "Hello, World" และเขียนโค้ดไคลเอนต์และเซิร์ฟเวอร์ NuSOAP พื้นฐาน
มาเริ่มกันที่ฝั่งเซิร์ฟเวอร์ก่อน เพราะหากไม่มีฝั่งเซิร์ฟเวอร์ ก็ไม่สมเหตุสมผลที่จะมีฝั่งไคลเอ็นต์ เราจะเขียนเมธอด SOAP ชื่อ Hello ซึ่งรับพารามิเตอร์ตัวเดียวและส่งกลับสตริง และหวังว่าความคิดเห็นในโค้ดจะให้คำแนะนำที่เป็นประโยชน์
<?php
// ดึงโค้ด NuSOAP เข้ามา
need_once('nusoap.php');
// สร้างอินสแตนซ์เซิร์ฟเวอร์
$server = ใหม่ Soap_server;
// ลงทะเบียนวิธีการที่จะเปิดเผย
$เซิร์ฟเวอร์->ลงทะเบียน('สวัสดี');
// กำหนดวิธีการเป็นฟังก์ชัน PHP
ฟังก์ชั่นสวัสดี($ชื่อ) {
กลับ 'สวัสดี' $name;
-
// ใช้คำขอเพื่อ (ลอง) เรียกใช้บริการ
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$เซิร์ฟเวอร์->บริการ($HTTP_RAW_POST_DATA);
?>
ต่อไปนี้คือโค้ดไคลเอ็นต์ มีสิ่งสำคัญบางประการที่ควรทราบ: ขั้นแรก เมื่อสร้างอินสแตนซ์ Soapclient คุณต้องระบุ URL ของบริการเป็นพารามิเตอร์ ในตัวอย่างนี้ helloworld.php เข้าถึงได้จาก http:// localhost/phphack ของ แน่นอนว่าบริการที่คุณต้องการใช้นั้นอยู่ใน URL ที่แตกต่างกัน ประการที่สอง เมื่อเรียกใช้บริการ พารามิเตอร์แรกคือชื่อของบริการ ซึ่งจะต้องตรงกับชื่อวิธีการที่ถูกต้อง (เซิร์ฟเวอร์บางตัวต้องตรงตามตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ในตัวอย่างนี้ ต้องตรงกับวิธีที่ลงทะเบียนไว้ใน helloworld.php แล้ว สุดท้าย พารามิเตอร์ตัวที่สองคืออาร์เรย์ที่จะถูกส่งไปยังวิธีการบริการ SOAP เป็นพารามิเตอร์ เนื่องจากเมธอด hello ใน helloworld.php มีเพียงพารามิเตอร์เดียว อาร์เรย์จึงมีองค์ประกอบเดียวเท่านั้น
<?php
// ดึงโค้ด NuSOAP เข้ามา
need_once('nusoap.php');
// สร้างอินสแตนซ์ไคลเอนต์
$client = ไคลเอนต์สบู่ใหม่('http://localhost/phphack/helloworld.php');
// เรียกใช้เมธอด SOAP
$result = $client->call('hello', array('name' => 'Scott'));
// แสดงผล
print_r($ผลลัพธ์);
?>
การดีบัก
เมื่อเขียนโปรแกรม คุณจะต้องแก้ไขข้อบกพร่องทุกครั้งที่มีสิ่งผิดปกติเกิดขึ้น NuSOAP มีชุดเครื่องมือเพื่อช่วยคุณในการดำเนินการนี้ ข้อมูลที่คุณต้องตรวจสอบเมื่อทำการดีบัก NuSOAP คือข้อมูลคำขอที่ส่งและข้อมูลที่เกี่ยวข้องที่ส่งคืน คลาสไคลเอ็นต์ของ NuSOAP ช่วยให้คุณสามารถดูข้อมูลนี้ผ่านสมาชิกสองคนได้ ตัวอย่างเช่น นี่เป็นเวอร์ชันแก้ไขของ helloworldclient.php ที่แสดงคำขอและการตอบกลับ ในส่วนถัดไป ฉันจะตรวจสอบข้อมูลคำขอและคำตอบที่แสดงในรหัสลูกค้า
<?php
// ดึงโค้ด NuSOAP เข้ามา
need_once('nusoap.php');
// สร้างอินสแตนซ์ไคลเอนต์
$client = ไคลเอนต์สบู่ใหม่('http://localhost/phphack/helloworld.php');
// เรียกใช้เมธอด SOAP
$result = $client->call('hello', array('name' => 'Scott'));
// แสดงผล
print_r($ผลลัพธ์);
// แสดงคำขอและการตอบกลับ
echo '<h2>คำขอ</h2>';
echo '<pre>' . htmlspecialchars($client->คำขอ, ENT_QUOTES) '</pre>';
echo '<h2>การตอบสนอง</h2>';
echo '<pre>' . htmlspecialchars($client->ตอบกลับ, ENT_QUOTES) '</pre>';
?>
NuSOAP ยังมีวิธีการดูข้อมูลการดีบักผ่านบันทึกโดยใช้คลาสของมัน การเพิ่มโค้ดต่อไปนี้จะแสดงข้อมูลการดีบักที่มีความยาว ขออภัย จะต้องปล่อยให้คำอธิบายของผลลัพธ์เป็นหน้าที่ของผู้อ่าน
// แสดงข้อความแก้ไขข้อบกพร่อง
echo '<h2>ดีบัก</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) .
เซิร์ฟเวอร์สามารถให้ข้อมูลการดีบักที่คล้ายกันได้ ที่น่าสนใจคือข้อมูลการดีบักเหล่านี้อยู่ในรูปแบบ xml ปรากฏขึ้นเพื่อให้สามารถดูได้ในไคลเอนต์ การดีบักฝั่งเซิร์ฟเวอร์มีลักษณะดังนี้:
<?php
// ดึงโค้ด NuSOAP เข้ามา
need_once('nusoap.php');
// เปิดใช้งานการดีบัก *ก่อน* สร้างอินสแตนซ์เซิร์ฟเวอร์
$ดีบั๊ก = 1;
// สร้างอินสแตนซ์เซิร์ฟเวอร์
$server = ใหม่ Soap_server;
// ลงทะเบียนวิธีการที่จะเปิดเผย
$เซิร์ฟเวอร์->ลงทะเบียน('สวัสดี');
// กำหนดวิธีการเป็นฟังก์ชัน PHP
ฟังก์ชั่นสวัสดี($ชื่อ) {
กลับ 'สวัสดี' $name;
-
// ใช้คำขอเพื่อ (ลอง) เรียกใช้บริการ
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$เซิร์ฟเวอร์->บริการ($HTTP_RAW_POST_DATA);
?>
วิธีที่สามของการดีบักไม่ใช่การดีบักจริงๆ แต่เป็นการฝึกเขียนโปรแกรมที่ดี ตัวอย่างข้างต้นไม่ได้ทำการตรวจสอบข้อผิดพลาดเมื่อเรียก SOAP ไคลเอนต์ที่แข็งแกร่งกว่าจะมีลักษณะดังนี้:
<?php
// ดึงโค้ด NuSOAP เข้ามา
need_once('nusoap.php');
// สร้างอินสแตนซ์ไคลเอนต์
$client = ไคลเอนต์สบู่ใหม่('http://localhost/phphack/helloworld.php');
// ตรวจสอบข้อผิดพลาด
$err = $client->getError();
ถ้า ($ ผิดพลาด) {
// แสดงข้อผิดพลาด
echo '<p><b>ข้อผิดพลาดของตัวสร้าง: ' . $err '</b></p>';
// ณ จุดนี้ คุณรู้ว่าการโทรที่ตามมาจะล้มเหลว
-
// เรียกใช้เมธอด SOAP
$result = $client->call('hello', array('name' => 'Scott'));
//ตรวจสอบความผิดปกติ
ถ้า ($ ลูกค้า -> ความผิด) {
echo '<p><b>ข้อผิดพลาด: ';
print_r($ผลลัพธ์);
เสียงสะท้อน '</b></p>';
} อื่น {
// ตรวจสอบข้อผิดพลาด
$err = $client->getError();
ถ้า ($ ผิดพลาด) {
// แสดงข้อผิดพลาด
echo '<p><b>ข้อผิดพลาด: ' . $err '</b></p>';
} อื่น {
// แสดงผล
print_r($ผลลัพธ์);
-
-
?>
ในการทดสอบโค้ดนั้น คุณต้องทำให้เกิดข้อผิดพลาด เช่น เปลี่ยนชื่อเมธอดที่เรียกว่า สวัสดี เป็น ลาก่อน
คำขอและการตอบสนอง
ฉันได้แสดงให้เห็นแล้วในตัวอย่างข้างต้นว่าการแสดงข้อมูลคำขอ SOAP และข้อมูลการตอบกลับนั้นง่ายเพียงใด นี่คือข้อมูลคำขอสำหรับ hello2client.php:
POST /phphack/helloworld2.php HTTP/1.0
โฮสต์: localhost
ตัวแทนผู้ใช้: NuSOAP/0.6.8 (1.81)
ประเภทเนื้อหา: text/xml; charset=ISO-8859-1
สบู่การกระทำ: ""
ความยาวเนื้อหา: 538
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:ซองจดหมาย
สบู่-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<สบู่-ENV:ร่างกาย>
<ns1:hello xmlns:ns1=" http://testuri.org ">
<name xsi:type="xsd:string">สก็อตต์</name>
</ns1:สวัสดี>
</สบู่-ENV:ร่างกาย>
</SOAP-ENV:ซองจดหมาย>
ในส่วนหัว HTTP คุณจะเห็นว่า SOAPAction เป็นสตริงว่างซึ่งเป็นค่าเริ่มต้น วิธีการบริการของคุณสามารถตั้งค่าของ SOAPAction ได้ และรหัสไคลเอ็นต์ของคุณสามารถเรียกวิธีการที่ระบุ SOAPAction เป็นพารามิเตอร์ได้
ในเพย์โหลด XML คุณจะเห็นว่า NuSOAP ใช้การเข้ารหัส ISO-8859-1 ที่รู้จักกันดีในรูปแบบ Latin-1 เพื่อระบุการเข้ารหัสอื่น คุณสามารถตั้งค่าแอตทริบิวต์ Soap_defencoding บนอินสแตนซ์ Soapclient ของไคลเอ็นต์ได้ แน่นอนว่าเป็นความรับผิดชอบของโปรแกรมเมอร์ในการเข้ารหัสข้อมูลพารามิเตอร์โดยใช้การเข้ารหัสที่ระบุ โชคดีที่ PHP มีฟังก์ชันมากมายในการเข้ารหัสและถอดรหัสข้อมูลการเข้ารหัสที่พบบ่อยที่สุดใน SOAP เช่น UTF-8
สิ่งที่ควรทราบอีกประการหนึ่งคือองค์ประกอบระบุวิธีการเรียก องค์ประกอบที่ชื่อ hello จะอยู่ใต้ชื่อโดเมน http://tempuri.org การระบุชื่อโดเมนจริงเป็นแนวทางปฏิบัติที่ดีที่สุดและยังเป็นเรื่องปกติสำหรับบริการต่างๆ มากมาย . มันเป็นสิ่งจำเป็น. เอกสารในอนาคตจะแสดงที่นี่:
บริการ SOAP ตอบสนองดังนี้:
HTTP/1.1 200 ตกลง
เซิร์ฟเวอร์: Microsoft-IIS/5.0
วันที่: วันพุธที่ 03 พ.ย. 2547 เวลา 21:32:34 น. GMT
X-ขับเคลื่อนโดย: ASP.NET
X-ขับเคลื่อนโดย: PHP/4.3.4
เซิร์ฟเวอร์: เซิร์ฟเวอร์ NuSOAP v0.6.8
เซิร์ฟเวอร์ X-SOAP: NuSOAP/0.6.8 (1.81)
ประเภทเนื้อหา: text/xml; charset=ISO-8859-1
ความยาวเนื้อหา: 556
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:ซองจดหมาย
สบู่-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/ "
xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xmlns:SOAP-ENC=" http://schemas.xmlsoap.org/soap/encoding/ "
xmlns:si=" http://soapinterop.org/xsd ">
<สบู่-ENV:ร่างกาย>
<ns1:helloResponse xmlns:ns1=" http://tempuri.org ">
<return xsi:type="xsd:string">สวัสดี สกอตต์</return>
</สวัสดีการตอบสนอง>
</สบู่-ENV:ร่างกาย>
</SOAP-ENV:ซองจดหมาย>