САВАН гэж юу вэ? Жишээлбэл, belavia хэмээх нээлттэй вэб үйлчилгээ байдаг.

Энд, LeaseWeb-д бид SOAP вэб үйлчилгээнүүдтэй хамтран дотоод хэрэглээний програмуудаа бие биетэйгээ нэгтгэдэг. Ялангуяа манай программуудыг хөгжүүлэх, турших явцад SOAP API-тай дадлага хийх чадвар хэрэгтэй байдаг.

$ curl -sS http://leaseweb.github.io/php-soap-client/installer | php

Энэ нь phar файлыг одоогийн ажиллаж байгаа лавлах руу татаж, гүйцэтгэх боломжтой болгох бөгөөд ингэснээр та дараахыг дуудаж шууд ашиглаж эхлэх боломжтой болно:

$ ./саван_үйлчлүүлэгч

Хамгийн сүүлийн үеийн мастер хувилбарыг суулгахын тулд та эх кодыг GitHub-аас шууд авч, өөрийн .phar файлыг багцлаад GNU Make ашиглан суулгаж болно.
.phar файл үүсгэхийн тулд та хөгжмийн зохиолчийг суулгасан байх шаардлагатай. Хөгжмийн зохиолчийн талаар илүү ихийг уншихыг хүсвэл тэдний маш сайн баримт бичгийг үзнэ үү.

# Php саван клиентийг суулгана $ git clone https://github.com/LeaseWeb/php-soap-client.git $ cd php-soap-client $ composer.phar суулгана $ хийх $ sudo make install

Хэрэв та ажиллаж байх үед Failed to compile phar exception авч байгаа бол php.ini дээрээ phar.readonly = Off тохиргоог хийх хэрэгтэй. Хөгжүүлэгч машин дээр үүнийг хийхэд тохиромжтой, гэхдээ phar.readonly-г Унтраах гэж тохируулахдаа аюулгүй байдлын эрсдэлийг анхаарна уу.

Дээрх make install команд нь soap_client програмыг /usr/local/bin-д суулгаж, гүйцэтгэх боломжтой болгох бөгөөд ингэснээр та үүнийг дараах байдлаар хялбархан дуудаж болно:

$ soap_client php-soap-client хувилбар 2.1.3 Хэрэглээ: команд Сонголтууд: ... Боломжтой командууд: Заасан `арга'-аар алсын үйлчилгээ рүү залгаж, stdout-д хариу гаргана. тусламж Тушаалын жагсаалтын тусламжийг харуулна. Командын жагсаалт-аргагуудыг жагсаана. Алсын удирдлагаас залгах боломжтой аргуудын жагсаалтыг авна уу. хүсэлт Өгөгдсөн аргын хувьд xml форматтай SOAP хүсэлтийг үүсгэж, stdout руу гаргана. wsdl Савангийн үйлчилгээний WSDL-г аваарай.

Энэ мөчөөс эхлэн бид таныг /usr/local/bin/soap_client-д өөрийн системд soap_client.phar суулгасан бөгөөд /urs/local/bin лавлах таны $PATH дотор байгаа гэж бид үзэж байна.

http://www.webservicex.net/ConvertTemperature.asmx алсын зайн үйлчилгээнд ямар аргууд байгааг хармаар байна гэж бодъё. Бид дараах тушаалыг өгч болно:

$ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" жагсаалтын аргууд

Дараахыг гаргана:

ConvertTemp

Хэрэв та дээрх командыг -vvv сонголтоор ажиллуулбал илүү дэлгэрэнгүй гаралт авах болно.
Энэ тохиолдолд цорын ганц боломжтой арга бол ConvertTemp юм. Энэ аргын хувьд SOAP XML хүсэлт хэрхэн харагдахыг харцгаая.

$ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" ConvertTemp хүсэлт 0

Хэрэв та алсын үйлчилгээ дээрх ConvertTemp арга руу SOAP хүсэлт гаргахыг хүсвэл дуудлагын дэд командыг ашиглана уу:

$ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" дуудлага --editor ConvertTemp

Дуудлагын дэд командын дараа --editor сонголтыг анхаарна уу. Хэрэв та --editor тугийг ашиглавал soap_client таны $EDITOR орчны хувьсагчид заасан засварлагчийг нээх бөгөөд ингэснээр XML хүсэлтийг илгээхээсээ өмнө өөрчлөх боломжтой болно.

Хэрэв та ижил хүсэлтийг олон удаа гаргавал савангийн хүсэлтийг локал XML файл болгон хадгалж, soap_client дуудлагын командын /dev/stdin руу дамжуулж болно:

# xml хүсэлтийг аваад дотооддоо хадгалаарай $ soap_client --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" хүсэлт ConvertTemp > my_sample_request.xml # Одоо my_sample_request.xml-г засварлана уу # Одоо та дуудаж болно Урьдчилан бэлтгэсэн $ soap_client хүсэлттэй ConvertTemp арга --endpoint="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" ConvertTemp-г дуудах< my_sample_request.xml

Та алсын вэб үйлчилгээг судлах явцдаа soap_client командуудыг богино хугацаанд ойр ойрхон давтах тул WSDL-ийн URL-г агуулсан SOAPCLIENT_ENDPOINT орчны хувьсагчийг тохируулснаар өөртөө цаг хэмнэх боломжтой. Энэ орчны хувьсагчийг тохируулсан үед та --endpoint командын мөрийн сонголтыг орхиж болно. Үүнийг одоо хийгээд ConvertTemp аргыг дуудъя:

$ экспорт SOAPCLIENT_ENDPOINT="http://www.webservicex.net/ConvertTemperature.asmx?WSDL" $ soap_client дуудлага ConvertTemp< my_sample_request.xml

Би Фаренгейтийн 107.6 хэм Цельсийн хэмд хэр их байгааг мэдэхийг хүссэн тул миний my_sample_request.xml-д дараах зүйлс орсон байна:

$ cat my_sample_request.xml 107.6 Фаренгейтийн зэрэг Цельсийн градус

$ soap_client дуудлага ConvertTemp< my_sample_request.xml stdClass Object ( => 42)

Хариулт нь 42.

Хэрэв та хариултуудыг XML форматаар харахыг илүүд үзвэл --xml командын мөрийн сонголтыг ашиглаж болно:

$ soap_client дуудлага --xml ConvertTemp< my_sample_request.xml 42

Энэхүү заавар нь SOAP API-г судлах, турших болон/эсвэл хөгжүүлж эхлэхэд хангалттай мэдээлэл өгөх болно.
Ирээдүйн блог нийтлэлдээ би php саван клиентийн сэдвийг үргэлжлүүлэх болно. Бид одоогоор вэбд зориулсан .phar архивыг багцлахаар ажиллаж байна.

  • Заавар

Сайн уу!
Саяхан би вэб үйлчилгээг хөгжүүлж эхэлсэн. Гэхдээ өнөөдрийн сэдэв бол миний тухай биш харин SOAP 1.2 протокол дээр үндэслэн бид өөрсдийн XML вэб үйлчилгээг хэрхэн бичих тухай юм.

Сэдвийг уншсаны дараа та дараахь зүйлийг хийх боломжтой болно гэж найдаж байна.

  • вэб програмын өөрийн серверийн хэрэгжилтийг бичих;
  • вэб програмын өөрийн үйлчлүүлэгчийн хэрэгжилтийг бичих;
  • өөрийн вэб үйлчилгээний тайлбарыг (WSDL) бичих;
  • ижил төрлийн өгөгдлийн клиент массивуудыг сервер рүү илгээх.
Таны таамаглаж байсанчлан бүх ид шидийг PHP болон суурилуулсан SoapClient болон SoapServer ангиудыг ашиглан хийх болно. Манай туулай бол SMS мессеж илгээх үйлчилгээ байх болно.

1 Асуудлын мэдэгдэл

1.1 Хил хязгаар

Эхэндээ би сэдвийн төгсгөлд хүрэх үр дүнд хүрэхийг санал болгож байна. Дээр дурдсанчлан бид SMS мессеж илгээх үйлчилгээг бичих бөгөөд илүү нарийвчлалтайгаар SOAP протоколоор дамжуулан янз бүрийн эх сурвалжаас мессеж хүлээн авах болно. Үүний дараа бид серверт ямар хэлбэрээр орж ирэхийг авч үзэх болно. Харамсалтай нь, мессежийг үйлчилгээ үзүүлэгч рүү илгээхийн тулд дараалалд оруулах үйл явц нь олон шалтгааны улмаас энэ нийтлэлийн хамрах хүрээнээс гадуур байна.

1.2 Бид ямар өгөгдлийг өөрчлөх вэ?

Гайхалтай, бид хил хязгаараа шийдсэн! Дараагийн хийх ёстой алхам бол сервер болон үйлчлүүлэгчийн хооронд ямар өгөгдөл солилцохыг шийдэх явдал юм. Энэ сэдвээр би үсээ удаан хугацаанд хуваахгүй байхыг зөвлөж байна, тэр даруй өөртөө гол асуултуудад хариулна уу.
  • Захиалагч руу SMS мессеж илгээхийн тулд сервер рүү хамгийн багадаа ямар өгөгдөл илгээх ёстой вэ?
  • Үйлчлүүлэгчийн хэрэгцээг хангахын тулд серверээс хамгийн багадаа ямар өгөгдөл илгээх ёстой вэ?
Үүний тулд та дараах зүйлийг илгээх хэрэгтэй гэж надад ямар нэг зүйл хэлж байна:
  • гар утасны дугаар болон
  • SMS мессежийн текст.
Зарчмын хувьд эдгээр хоёр шинж чанар нь илгээхэд хангалттай, гэхдээ би танд төрсөн өдрийн мэндчилгээ бүхий SMS мессежийг өглөөний 3 цагт эсвэл 4 цагт ирэхийг шууд төсөөлж байна! Энэ мөчид би бүх хүмүүст намайг мартаагүйд маш их талархах болно! Тиймээс бид бас сервер рүү илгээх болно
  • SMS мессеж илгээсэн огноо.
Миний сервер рүү илгээхийг хүсэж буй дараагийн зүйл бол:
  • Мессежийн төрөл.
Энэ параметр нь заавал байх албагүй, гэхдээ бид хэдэн үйлчлүүлэгчдээ манай мэдээнд "баярласан" талаар даргадаа яаралтай хэлэх, мөн энэ талаар үзэсгэлэнтэй статистикийг зурах шаардлагатай бол энэ нь бидэнд маш их тустай байх болно.

Гэсэн хэдий ч би нэг зүйлийг мартсан! Хэрэв бид бага зэрэг бодох юм бол үйлчлүүлэгч нэг SMS мессеж эсвэл хэд хэдэн мессежийг сервер рүү нэг дор илгээх боломжтой гэдгийг тэмдэглэх нь зүйтэй. Өөрөөр хэлбэл, нэг өгөгдлийн пакет нь нэгээс хязгааргүй хүртэлх мессежийг агуулж болно.

Үүний үр дүнд бид SMS мессеж илгээхийн тулд дараах өгөгдөл хэрэгтэй болно.

  • Гар утасны дугаар,
  • SMS мессежийн текст,
  • захиалагч руу SMS мессеж илгээх хугацаа,
  • мессежийн төрөл.

Бид эхний асуултанд хариулсан, одоо бид хоёр дахь асуултанд хариулах хэрэгтэй. Магадгүй би өөрийгөө бага зэрэг хутгахыг зөвшөөрөх байх. Тиймээс бид серверээс зөвхөн Boolean өгөгдлийг илгээх бөгөөд утга нь дараахь утгатай.

  • ҮНЭН – пакет серверт амжилттай хүрч, баталгаажуулалтыг давж, SMS үйлчилгээ үзүүлэгч рүү илгээх дараалалд орсон.
  • ХУДАЛ - бусад бүх тохиолдолд

Энэ нь асуудлын мэдэгдлийн тайлбарыг дуусгаж байна! Эцэст нь, хөгжилтэй хэсэг рүүгээ орцгооё - энэ САВАН ямар хачин араатан болохыг олж мэдье!

2 САВАН гэж юу вэ?

Ерөнхийдөө би эхлээд SOAP гэж юу болох талаар юу ч бичихээр төлөвлөөгүй бөгөөд шаардлагатай үзүүлэлт бүхий w3.org вэб сайт, Википедиа руу нэвтрэх холбоосоор өөрийгөө хязгаарлахыг хүссэн. Гэхдээ хамгийн сүүлд би энэ протоколын талаар богино тэмдэглэл бичихээр шийдсэн.

Энэ өгөгдөл солилцох протокол нь RPC (Remote Procedure Call) хэмээх парадигм дээр суурилсан протоколуудын дэд бүлэгт хамаарах бөгөөд үүний эсрэг тал нь REST (Төлөөлөгчийн төрийн шилжүүлэг) гэдгээс би түүхээ эхлүүлэх болно. Та энэ талаар Википедиа дээрээс уншиж болно; нийтлэлийн холбоос нь сэдвийн төгсгөлд байна. Эдгээр нийтлэлээс бид дараах зүйлийг ойлгох хэрэгтэй: “RPC арга нь олон тооны арга, нарийн төвөгтэй протокол бүхий цөөн тооны сүлжээний нөөцийг ашиглах боломжийг олгодог. REST аргын хувьд аргын тоо, протоколын нарийн төвөгтэй байдал нь хатуу хязгаарлагдмал бөгөөд энэ нь хувь хүний ​​нөөцийн тоо их байж болно гэсэн үг юм." Өөрөөр хэлбэл, бидэнтэй холбоотойгоор энэ нь сайт дээр RPC хандалтын тохиолдолд үйлчилгээнд үргэлж нэг оролт (холбоос) байх бөгөөд өгөгдөлтэй хамт дамжуулж ирж буй өгөгдлийг боловсруулахын тулд ямар процедурыг дуудах ёстой гэсэн үг юм. Манай REST аргачлалын тусламжтайгаар сайт нь олон оролттой (холбоос) бөгөөд тус бүр нь зөвхөн тодорхой өгөгдлийг хүлээн авч боловсруулдаг. Хэрэв уншиж буй хэн нэгэн эдгээр аргын ялгааг хэрхэн илүү энгийнээр тайлбарлахыг мэддэг бол сэтгэгдэл дээр бичихээ мартуузай!

SOAP-ийн талаар бидний мэдэх ёстой дараагийн зүйл бол энэ протокол нь тээвэрлэлттэй ижил XML ашигладаг бөгөөд энэ нь нэг талаараа маш сайн, учир нь Манай зэвсэглэлд энэ тэмдэглэгээний хэл дээр суурилсан технологийн стекийн бүрэн хүчийг нэн даруй багтаасан болно, тухайлбал XML-Schema - XML ​​баримт бичгийн бүтцийг тайлбарлах хэл (Википедиад баярлалаа!), энэ нь серверээс хүлээн авсан өгөгдлийг автоматаар баталгаажуулах боломжийг олгодог. үйлчлүүлэгчдээс.

Тиймээс одоо бид SOAP бол алсын зайнаас процедурын дуудлагыг хэрэгжүүлэхэд ашигладаг протокол бөгөөд XML-ийг тээвэрлэлт болгон ашигладаг гэдгийг бид мэднэ! Хэрэв та Wikipedia дээрх нийтлэлийг уншвал, үүнийг зөвхөн HTTP-тэй хослуулан хэрэглэхээс гадна ямар ч програмын түвшний протоколд ашиглах боломжтой гэдгийг эндээс мэдэж болно (харамсалтай нь энэ сэдвээр бид зөвхөн HTTP дээрх SOAP-ыг авч үзэх болно). Энэ бүхний надад юу хамгийн их таалагдаж байгааг чи мэдэх үү? Хэрэв таамаглал байхгүй бол би танд сануулга өгөх болно - САВАН! Тиймээс би шууд хариулах болно: "SOAP (Англи хэл дээрх Simple Object Access Protocol - энгийн) протоколобъект руу нэвтрэх; техникийн үзүүлэлт 1.2 хүртэл)". Энэ мөрний хамгийн гайхалтай зүйл бол налуу үсэг юм! Энэ бүхнээс та ямар дүгнэлт хийснийг би мэдэхгүй байна, гэхдээ би дараах зүйлийг харж байна - энэ протоколыг ямар ч байдлаар "энгийн" гэж нэрлэх боломжгүй (мөн w3 ч гэсэн үүнтэй санал нийлж байгаа бололтой) 1.2 хувилбараас хойш ямар нэгэн байдлаар шифрлэгдэхээ больсон. ! Тэгээд энэ нь САВАН, зүгээр л САВАН, үе гэж нэрлэгддэг болсон.

За, уучлаарай, би жаахан хазайчихлаа. Өмнө нь бичсэнчлэн XML-г тээвэрлэлт болгон ашигладаг бөгөөд үйлчлүүлэгч болон серверийн хооронд дамждаг пакетуудыг SOAP дугтуй гэж нэрлэдэг. Хэрэв та дугтуйны ерөнхий бүтцийг авч үзвэл энэ нь танд маш танил санагдах болно, учир нь ... HTML хуудасны бүтэцтэй төстэй. Энэ нь үндсэн хэсэгтэй - Дугтуйхэсгүүдийг багтаасан Толгой хэсэгТэгээд Бие, эсвэл Алдаа. IN Биеөгөгдөл дамжуулах бөгөөд энэ нь дугтуйны заавал хэсэг юм, харин Толгой хэсэгсонголттой. IN Толгой хэсэгзөвшөөрөл эсвэл вэб үйлчилгээний горимын оролтын өгөгдөлтэй шууд хамааралгүй бусад өгөгдлийг дамжуулж болно. тухай АлдааЯмар нэгэн алдаа гарсан тохиолдолд серверээс үйлчлүүлэгч рүү ирэхээс өөр хэлэх онцгой зүйл байхгүй.

SOAP протоколын талаарх миний тойм түүх энд дуусч (бид үйлчлүүлэгч болон сервер нь бие биендээ ажиллуулж сурах үед бид дугтуйнууд болон тэдгээрийн бүтцийг илүү нарийвчлан авч үзэх болно) мөн шинэ зүйл эхэлж байна - SOAP хамтрагчийн тухай. WSDL(Вэб үйлчилгээний тайлбар хэл). Тийм ээ, тийм ээ, энэ нь бидний ихэнхийг энэ протокол дээр API-ээ хэрэгжүүлэхийг оролдохоос айдаг зүйл юм. Үүний үр дүнд бид ихэвчлэн дугуйгаа JSON ашиглан тээврийн хэрэгсэл болгон дахин зохион бүтээдэг. Тэгэхээр WSDL гэж юу вэ? WSDL нь XML хэл (c) Википедиа дээр суурилсан вэб үйлчилгээг тайлбарлах, тэдгээрт хандах хэл юм. Хэрэв энэ тодорхойлолт нь танд энэ технологийн ариун утгыг бүхэлд нь тайлбарлаж чадахгүй бол би үүнийг өөрийн үгээр тайлбарлахыг хичээх болно!

WSDL нь манай үйлчлүүлэгчдэд сервертэй хэвийн харилцах боломжийг олгох зорилготой юм. Үүнийг хийхийн тулд "*.wsdl" өргөтгөлтэй файл нь дараах мэдээллийг тайлбарлана.

  • Ямар нэрсийн орон зай ашигласан бэ?
  • Ямар өгөгдлийн схем ашигласан бэ?
  • Вэб үйлчилгээ нь үйлчлүүлэгчдээс ямар төрлийн мессеж хүлээж байна вэ?
  • Ямар өгөгдөл вэб үйлчилгээний процедурт хамаарах,
  • Вэб үйлчилгээ ямар процедурыг агуулдаг вэ?
  • Үйлчлүүлэгч вэб үйлчилгээний процедурыг хэрхэн дуудах ёстой вэ?
  • Хэрэглэгчийн дуудлагыг аль хаяг руу илгээх вэ?
Таны харж байгаагаар энэ файл нь бүхэл бүтэн вэб үйлчилгээ юм. Үйлчлүүлэгчид WSDL файлын хаягийг зааж өгснөөр бид ямар ч вэб үйлчилгээний талаар бүгдийг мэдэх болно! Үүний үр дүнд бид вэб үйлчилгээ хаана байрладаг талаар юу ч мэдэх шаардлагагүй болно. Та WSDL файлын байршлыг мэдэх хэрэгтэй! Удахгүй бид САВАН нь Оросын зүйр цэцэн үгсээр ярьдаг шиг аймшигтай биш гэдгийг олж мэдэх болно.

3 XML-схемийн танилцуулга

Одоо бид САВАН гэж юу болох, түүний дотор юу байдгийн талаар маш их зүйлийг мэдэж, түүнийг хүрээлж буй технологийн стекийн тоймтой болсон. Юуны өмнө, SOAP нь үйлчлүүлэгч болон серверийн харилцан үйлчлэлийн арга бөгөөд XML тэмдэглэгээний хэлийг тээвэрлэх хэрэгсэл болгон ашигладаг тул энэ хэсэгт бид XML схемийг ашиглан өгөгдлийг автоматаар баталгаажуулах талаар бага зэрэг ойлгох болно.

Диаграммын гол ажил бол бидний боловсруулах гэж буй өгөгдлийн бүтцийг дүрслэх явдал юм. XML схемийн бүх өгөгдөл хуваагдана энгийн(скаляр) ба цогцолбор(бүтэц) төрөл. Энгийн төрөлд дараахь төрлүүд орно.

  • шугам,
  • тоо,
  • логик утга,
  • огноо.
Дотор ямар ч өргөтгөл байхгүй маш энгийн зүйл. Тэдний антипод нь нарийн төвөгтэй төрөл юм. Хүн бүрийн санаанд орж ирдэг цогц хэлбэрийн хамгийн энгийн жишээ бол объект юм. Жишээлбэл, ном. Ном нь дараахь шинж чанаруудаас бүрдэнэ. зохиолч, Нэр, Үнэ, ISBN дугааргэх мэт. Эдгээр шинж чанарууд нь эргээд энгийн төрөл эсвэл нарийн төвөгтэй байж болно. XML схемийн даалгавар бол үүнийг тайлбарлах явдал юм.

Би хол явахгүй байж, бидний SMS мессежийн XML схем бичихийг санал болгож байна! SMS мессежийн xml тайлбарыг доор харуулав.

71239876543 Туршилтын мессеж 2013-07-20 12:00:00 12
Манай нарийн төвөгтэй хэлбэрийн диаграмм иймэрхүү харагдах болно.


Энэ оруулгыг дараах байдлаар уншина: Бидэнд хувьсагч байна " Захиа"төрөл" Захиа"болон" гэж нэрлэгддэг нарийн төвөгтэй төрөл байдаг. Захиа", дараалсан багц элементүүдээс бүрддэг" утас"төрөл мөр, « текст"төрөл мөр, « огноо"төрөл он сар өдөр цаг, « төрөл"төрөл аравтын. Эдгээр төрлүүд нь энгийн бөгөөд схемийн тайлбарт аль хэдийн тодорхойлогдсон байдаг. Баяр хүргэе! Бид дөнгөж сая анхны XML схемээ бичсэн!

Би элементүүдийн утга учир гэж бодож байна " бүрэлдэхүүн"Ба" нарийн төвөгтэй төрөл"Бүх зүйл танд бага багаар тодорхой болсон тул бид цаашид тэдэнд анхаарлаа хандуулахгүй бөгөөд шууд хөгжмийн зохиолчийн элемент рүү шилжье" дараалал" Бид хөгжмийн зохиолчийн элементийг ашиглах үед " дараалал"Үүнд орсон элементүүд нь диаграммд заасан дарааллаар үргэлж байх ёстой бөгөөд бүгд заавал байх ёстой гэдгийг бид танд мэдэгдэж байна. Гэхдээ цөхрөл бүү зов! XML схемд өөр хоёр хөгжмийн зохиолчийн элемент байна: " сонголт"Ба" бүгд" хөгжмийн зохиолч" сонголт"Түүнд жагсаасан элементүүдийн аль нэг нь байх ёстойг зарлаж, хөгжмийн зохиолч" бүгд» - жагсаасан элементүүдийн дурын хослол.

Таны санаж байгаагаар, сэдвийн эхний хэсэгт бид нэгээс хязгааргүй SMS мессежийг багц хэлбэрээр дамжуулах боломжтой гэж тохиролцсон. Тиймээс би ийм өгөгдлийг XML схемд хэрхэн зарлаж байгааг ойлгохыг санал болгож байна. Ерөнхий багцын бүтэц дараах байдалтай байж болно.

71239876543 Туршилтын мессеж 1 2013-07-20 12:00:00 12 71239876543 Туршилтын мессеж Н 2013-07-20 12:00:00 12
Ийм нарийн төвөгтэй хэлбэрийн диаграмм нь иймэрхүү харагдах болно.


Эхний блок нь нийлмэл хэлбэрийн танил мэдэгдлийг агуулдаг " Захиа" Хэрэв та анзаарсан бол энгийн төрөл бүрт "" багтсан болно. Захиа", шинэ тодруулах шинж чанарууд нэмэгдсэн " мин"Ба" maxOccurs" Нэрнээс нь таамаглаж байгаачлан эхнийх нь ( мин) нь энэ дараалал дор хаяж нэг " төрлийн элемент агуулсан байх ёстойг харуулж байна. утас», « текст», « огноо"Ба" төрөл", харин дараагийнх нь ( maxOccurs) шинж чанар нь бидний дараалалд хамгийн ихдээ нэг ийм элемент байгааг бидэнд мэдэгддэг. Үүний үр дүнд бид аливаа өгөгдөлд зориулж өөрсдийн схемийг бичихдээ тэдгээрийг хэрхэн тохируулах талаар хамгийн өргөн сонголттой болно!

Диаграмын хоёр дахь блок нь элементийг зарлаж байна " мессежийн жагсаалт"төрөл" Мессежийн жагсаалт" Энэ нь ойлгомжтой" Мессежийн жагсаалт" дор хаяж нэг элемент агуулсан цогц төрөл " Захиа", гэхдээ ийм элементүүдийн хамгийн их тоо хязгаарлагдахгүй!

4 WSDL-ээ бичнэ үү

WSDL бол манай вэб үйлчилгээ гэдгийг санаж байна уу? Та санаж байна гэж найдаж байна! Үүнийг бичиж байх үед манай бяцхан вэб үйлчилгээ үүн дээр ажиллах болно. Тиймээс, би заваарахгүй байхыг зөвлөж байна.

Ерөнхийдөө бүх зүйл бидний хувьд зөв ажиллахын тулд бид зөв MIME төрлийн WSDL файлыг үйлчлүүлэгч рүү шилжүүлэх хэрэгтэй. Үүнийг хийхийн тулд та өөрийн вэб серверийн тохиргоог хийх хэрэгтэй, тухайлбал, "*.wsdl" өргөтгөлтэй файлуудын MIME төрлийг дараах мөрөнд тохируулах хэрэгтэй.

Програм/wsdl+xml
Гэхдээ практик дээр би ихэвчлэн PHP-ээр HTTP толгойг илгээдэг байсан " текст/xml»:

Толгой("Агуулгын төрөл: текст/xml; charset=utf-8");
мөн бүх зүйл маш сайн ажилласан!

Манай энгийн вэб үйлчилгээ нэлээд гайхалтай тайлбартай байх болно гэдгийг би танд шууд анхааруулмаар байна, тиймээс бүү ай, учир нь... Текстийн ихэнх нь заавал байх ёстой ус бөгөөд үүнийг нэг удаа бичсэнээр та үүнийг нэг вэб үйлчилгээнээс нөгөө рүү байнга хуулж болно!

WSDL нь XML учраас та энэ тухай шууд эхний мөрөнд бичих хэрэгтэй. Файлын үндсэн элементийг үргэлж " гэж нэрлэх ёстой. тодорхойлолтууд»:


Ерөнхийдөө WSDL нь 4-5 үндсэн блокоос бүрддэг. Хамгийн эхний блок бол вэб үйлчилгээний тодорхойлолт эсвэл өөрөөр хэлбэл нэвтрэх цэг юм.


Энд манайд үйлчилгээ байдаг гэж бичсэн байна - " SMSService" Зарчмын хувьд, WSDL файл дахь бүх нэрийг та хүссэн болгон өөрчилж болно, учир нь тэд ямар ч үүрэг гүйцэтгэдэггүй.

Үүний дараа бид вэб үйлчилгээндээ " SMSService" гэж нэрлэгддэг нэвтрэх цэг ("порт") байдаг. SMSServicePort" Үйлчлүүлэгчээс сервер рүү илгээсэн бүх хүсэлтийг энэ нэвтрэх цэг рүү илгээх болно. Мөн "элементэд заана уу" хаяг» хүсэлтийг хүлээн авах зохицуулагч файлын холбоос.

Бид вэб үйлчилгээг тодорхойлж, түүнд нэвтрэх цэгийг зааж өгсний дараа бид түүнд дэмжигдсэн процедурыг холбох хэрэгтэй:


Үүнийг хийхийн тулд ямар үйлдлүүд, ямар хэлбэрээр дуудагдахыг жагсаав. Тэдгээр. портын хувьд" SMSServicePort"хэрэглэх нь нэрээр тодорхойлогддог" SMSServiceBinding", дуудлагын төрөлтэй" rpc"болон HTTP-г дамжуулах протокол болгон ашигладаг. Тиймээс бид HTTP-ээр RPC дуудлага хийх болно гэдгийг энд заасан. Үүний дараа бид ямар процедурыг тайлбарлах болно ( үйл ажиллагаа) вэб үйлчилгээнд дэмжигддэг. Бид зөвхөн нэг процедурыг дэмжих болно - " SMS илгээх" Энэхүү процедурын тусламжтайгаар бидний гайхалтай мессежүүд сервер рүү илгээгдэх болно! Процедурыг зарласны дараа өгөгдлийг ямар хэлбэрээр дамжуулахыг зааж өгөх шаардлагатай. Энэ тохиолдолд стандарт савангийн дугтуйг ашиглахыг зааж өгсөн болно.

Үүний дараа бид процедурыг мессежүүдэд холбох хэрэгтэй:


Үүнийг хийхийн тулд бид "хэрэглэх" төрлийн холболтыг зааж өгдөг. SMSServicePortType"болон элементэд" portType"Ижил төрлийн нэрээр бид процедурыг мессежүүдэд холбохыг зааж өгдөг. Тиймээс, ирж буй мессежийг (үйлчлүүлэгчээс сервер рүү) " гэж нэрлэх болно. sendSmsRequest", болон гарч байгаа (серверээс үйлчлүүлэгч рүү)" sendSmsResponse" WSDL дээрх бүх нэрсийн нэгэн адил ирж буй болон гарч буй мессежийн нэр дур зоргоороо байдаг.

Одоо бид мессежүүдийг өөрсдөө тайлбарлах хэрэгтэй, өөрөөр хэлбэл. ирж буй болон гарах:


Үүнийг хийхийн тулд бид элементүүдийг нэмнэ " Захиа"нэртэй" sendSmsRequest"Ба" sendSmsResponse" тус тус. Тэдгээрийн дотор оролт нь бүтэц нь өгөгдлийн төрөлд тохирсон дугтуй байх ёстой гэдгийг бид харуулж байна " Хүсэлт" Үүний дараа өгөгдлийн төрлийг агуулсан дугтуйг серверээс буцаана - " Хариулт».

Одоо бид бага зэрэг хийх хэрэгтэй - эдгээр төрлийн тайлбарыг манай WSDL файлд нэмнэ үү! WSDL нь ирж буй болон гарч буй өгөгдлийг хэрхэн тодорхойлдог гэж та бодож байна вэ? Та аль хэдийн бүх зүйлийг аль хэдийн ойлгосон байх гэж бодож байна, XML схемийг ашиглах гэж өөртөө хэлсэн! Мөн та туйлын зөв байх болно!


Та бидэнд баяр хүргэж болно! Бидний анхны WSDL бичигдсэн! Мөн бид зорилгодоо хүрэхэд нэг алхам ойртож байна.
Дараа нь бид өөрсдийн түгээсэн програмуудыг хөгжүүлэхэд PHP бидэнд юу өгч байгааг харах болно.

5 Манай анхны SOAP сервер

Өмнө нь би PHP дээр SOAP сервер үүсгэхийн тулд суулгасан SoapServer классыг ашиглах болно гэж бичсэн. Цаашдын бүх үйлдлүүд минийхтэй адил явагдахын тулд та PHP-ээ бага зэрэг өөрчлөх хэрэгтэй болно. Илүү нарийвчлалтай болгохын тулд та "php-саван" өргөтгөл суулгасан эсэхээ шалгах хэрэгтэй. Үүнийг өөрийн вэб сервер дээрээ хэрхэн суулгах талаар PHP-ийн албан ёсны вэбсайтаас уншсан нь дээр.

Бүх зүйлийг суулгаж, тохируулсны дараа бид таны хостингын үндсэн хавтсанд файл үүсгэх шаардлагатай болно " smsservice.php» дараах агуулгатай:

setClass("SoapSmsGateWay"); //Серверийг эхлүүлэх $server->handle();
"ini_set" функцээр шугамаас дээш юу байгааг тайлбарлах шаардлагагүй гэж найдаж байна. Учир нь Тэнд бид серверээс клиент рүү ямар HTTP толгойг илгээхийг тодорхойлж, орчинг тохируулсан. "ini_set" гэсэн мөрөнд бид WSDL файлын кэшийг идэвхгүй болгож, оруулсан өөрчлөлтүүд нь үйлчлүүлэгчид шууд хүчинтэй болно.

Одоо бид серверт ирлээ! Таны харж байгаагаар SOAP сервер бүхэлдээ гурван мөр л авдаг! Эхний мөрөнд бид SoapServer объектын шинэ жишээг үүсгэж, вэб үйлчилгээний WSDL тайлбарын хаягийг түүний байгуулагч руу дамжуулдаг. Одоо бид үүнийг өөрөө тайлбарлах нэртэй файлын хостингын үндэст байрлуулах болно гэдгийг мэдэж байна " smsservice.wsdl.php" Хоёрдахь мөрөнд бид SOAP серверт үйлчлүүлэгчээс хүлээн авсан дугтуйг боловсруулж, хариуг нь буцааж өгөхийн тулд аль ангиллыг татах шаардлагатайг хэлж өгнө. Таны таамаглаж байсанчлан энэ ангид бидний цорын ганц аргыг тайлбарлах болно SMS илгээх. Гурав дахь мөрөнд бид серверийг эхлүүлнэ! Ингээд л манай сервер бэлэн боллоо! Ингэснээр би бүгдэд нь баяр хүргэе!

Одоо бид WSDL файлыг үүсгэх хэрэгтэй. Үүнийг хийхийн тулд та өмнөх хэсгээс түүний агуулгыг хуулж авах эсвэл эрх чөлөөгөө аваад бага зэрэг "загвар" хийж болно.

"; ?> /" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http:// schemas.xmlsoap.org/wsdl/http/" name="SmsWsdl" xmlns="http://schemas.xmlsoap.org/wsdl/"> /"> /smsservice.php" />
Энэ үе шатанд бид үүссэн серверт бүрэн сэтгэл хангалуун байх ёстой, учир нь Бид түүн рүү ирж буй дугтуйг бүртгэж, дараа нь ирж буй өгөгдөлд тайван дүн шинжилгээ хийх боломжтой. Бид сервер дээр ямар нэгэн зүйлийг хүлээн авахын тулд үйлчлүүлэгч хэрэгтэй. Ингээд үүнд орцгооё!

6 SOAP үйлчлүүлэгч замдаа

Юуны өмнө бид үйлчлүүлэгчээ бичих файл үүсгэх хэрэгтэй. Ердийнх шигээ бид үүнийг хостын үндэс дээр үүсгээд "гэж нэрлэх болно" client.php", мөн дотор нь бид дараахь зүйлийг бичих болно.

messageList = new MessageList(); $req->messageList->message = new Message(); $req->messageList->message->phone = "79871234567"; $req->messageList->message->text = "Туршилтын мессеж 1"; $req->messageList->message->огноо = "2013-07-21T15:00:00.26"; $req->messageList->мессеж->төрөл = 15; $client = new SoapClient("http://($_SERVER["HTTP_HOST"])/smsservice.wsdl.php", массив("саван_хувилбар" => SOAP_1_2)); var_dump($клиент->sendSms($req));
Объектуудаа дүрсэлцгээе. Бид WSDL-г бичихдээ серверт ирж буй дугтуйны гурван объектыг тодорхойлсон: Хүсэлт, Мессежийн жагсаалтТэгээд Захиа. Үүний дагуу ангиуд Хүсэлт, Мессежийн жагсаалтТэгээд ЗахиаЭдгээр аж ахуйн нэгжүүдийн манай PHP скрипт дэх тусгал юм.

Объектуудыг тодорхойлсны дараа бид объект үүсгэх хэрэгтэй ( $req), бид сервер рүү илгээх болно. Үүний дараа бидний хувьд хамгийн нандин хоёр мөр гарч ирнэ! Манай SOAP үйлчлүүлэгч! Итгэнэ үү, үгүй ​​юу, энэ нь манай сервер үйлчлүүлэгчээс мессеж хүлээн авч эхлэхэд хангалттай бөгөөд манай сервер тэдгээрийг амжилттай хүлээн авч, боловсруулахад хангалттай! Тэдгээрийн эхнийх нь бид SoapClient ангийн жишээг үүсгэж, WSDL файлын байршлын хаягийг түүний байгуулагч руу дамжуулдаг бөгөөд параметрүүдэд бид SOAP протоколын 1.2 хувилбарыг ашиглан ажиллах болно гэдгийг тодорхой зааж өгсөн болно. Дараагийн мөрөнд бид аргыг дууддаг SMS илгээхобьект $ үйлчлүүлэгчнэн даруй үр дүнг хөтөч дээр харуулна.
Үүнийг ажиллуулаад эцэст нь юу авснаа харцгаая!

Дараах объектыг серверээс надад буцааж өгсөн:

Object(stdClass) public "status" => логикийн үнэн
Энэ бол гайхалтай, учир нь ... Одоо манай сервер ажиллаж байгаа бөгөөд зөвхөн ажиллаад зогсохгүй зарим утгыг үйлчлүүлэгчид буцааж өгөх боломжтой гэдгийг бид баттай мэдэж байна!

Одоо серверийн тал дээр болгоомжтой хадгалдаг бүртгэлээ харцгаая! Эхний хэсэгт бид сервер дээр ирсэн түүхий өгөгдлийг харж байна:

79871234567 Туршилтын мессеж 1 2013-07-21T15:00:00.26 15
Энэ бол дугтуй. Одоо та ямар харагдахыг мэдэж байна! Гэхдээ бид үүнийг байнга үзэх сонирхолтой байх магадлал багатай тул лог файлаас объектыг цувралаас гаргаж, бүх зүйл хэвийн байгаа эсэхийг харцгаая:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "phone" => string "79871234567" (length=11) public "text" => string "Туршилтын мессеж 1" " (урт=37) нийтийн "огноо" => мөр "2013-07-21T15:00:00.26" (урт=22) нийтийн "төрөл" => "15" мөр (урт=2)
Таны харж байгаагаар объектын цуваа зөв хийгдсэн тул би бүгдэд нь баяр хүргэхийг хүсч байна! Дараа нь биднийг илүү сонирхолтой зүйл хүлээж байна! Тухайлбал, бид үйлчлүүлэгчийг сервер рүү зөвхөн нэг SMS мессеж биш, харин бүхэл бүтэн багц (илүү нарийвчлалтай, гурван) илгээх болно!

7 Нарийн төвөгтэй объектуудыг илгээх

Бүхэл бүтэн багц мессежийг нэг пакетаар сервер рүү хэрхэн шилжүүлэх талаар бодоцгооё? Магадгүй хамгийн хялбар арга бол messageList элемент дотор массив зохион байгуулах явдал юм! Үүнийг хийцгээе:

// сервер рүү илгээх объект үүсгэх $req = new Request(); $req->messageList = new MessageList(); $msg1 = шинэ мессеж(); $msg1->утас = "79871234567"; $msg1->text = "Туршилтын мессеж 1"; $msg1->огноо = "2013-07-21T15:00:00.26"; $msg1->төрөл = 15; $msg2 = шинэ мессеж(); $msg2->утас = "79871234567"; $msg2->text = "Туршилтын мессеж 2"; $msg2->огноо = "2014-08-22T16:01:10"; $msg2->төрөл = 16; $msg3 = шинэ мессеж(); $msg3->утас = "79871234567"; $msg3->text = "Туршилтын мессеж 3"; $msg3->огноо = "2014-08-22T16:01:10"; $msg3->төрөл = 17; $req->messageList->мессеж = $msg1; $req->messageList->мессеж = $msg2; $req->messageList->мессеж = $msg3;
Үйлчлүүлэгчээс дараах багцыг хүлээн авсан болохыг манай бүртгэл харуулж байна:

79871234567 Туршилтын мессеж 1 2013-07-21T15:00:00.26 15 79871234567 Туршилтын мессеж 2 2014-08-22T16:01:10 16 79871234567 Туршилтын мессеж 3 2014-08-22T16:01:10 17
Ямар утгагүй юм бэ? Мөн та нэг талаараа зөв байх болно, учир нь ... Үйлчлүүлэгчийг орхисон объектыг бид мэдсэн даруйдаа манай серверт яг ижил хэлбэрээр дугтуй хэлбэрээр ирсэн. Үнэн бол SMS мессежүүд нь бидний хэрэгцээтэй XML форматаар цуваагүй байсан - тэдгээрийг элементүүдээр ороосон байх ёстой. Захиа, байхгүй байна Бүтэц. Одоо ийм объект аргад ямар хэлбэрээр ирж байгааг харцгаая SMS илгээх:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "Struct" => массив (size=3) 0 => object(stdClass) public "phone" => string "79871234567" (урт=11) нийтийн "текст" => "Туршилтын мессеж 1" (урт=37) нийтийн "огноо" => мөр "2013-07-21T15:00:00.26" (урт=22) нийтийн " төрөл" => "15" мөр (урт=2) 1 => объект(stdClass) нийтийн "утас" => мөр "79871234567" (урт=11) нийтийн "текст" => "Туршилтын мессеж 2" мөр (урт= 37) нийтийн "огноо" => "2014-08-22T16:01:10" мөр (урт=19) нийтийн "төрөл" => "16" мөр (урт=2) 2 => объект(stdClass) нийтийн "утас " => "79871234567" мөр (урт=11) нийтийн "текст" => "Туршилтын мессеж 3" мөр (урт=37) нийтийн "огноо" => мөр "2014-08-22T16:01:10" (урт=) 19) нийтийн "төрөл" => "17" мөр (урт = 2)
Энэ мэдлэг бидэнд юу өгдөг вэ? Зөвхөн бидний сонгосон зам буруу байгаа бөгөөд "Бид сервер дээр өгөгдлийн зөв бүтцийг хэрхэн олж авах вэ?" Гэсэн асуултад хариулт аваагүй байна. Гэхдээ би цөхрөлгүй, массиваа төрөл болгон хувиргахыг зөвлөж байна объект:

$req->messageList->мессеж = (объект)$req->messageList->мессеж;
Энэ тохиолдолд бид өөр дугтуйг хүлээн авах болно:

79871234567 Туршилтын мессеж 1 2013-07-21T15:00:00.26 15 79871234567 Туршилтын мессеж 2 2014-08-22T16:01:10 16 79871234567 Туршилтын мессеж 3 2014-08-22T16:01:10 17
Арга руу орлоо SMS илгээхобъект нь дараах бүтэцтэй байна:

Object(stdClass) public "messageList" => object(stdClass) public "message" => object(stdClass) public "BOGUS" => массив (size=3) 0 => object(stdClass) public "phone" => string "79871234567" (урт=11) нийтийн "текст" => "Туршилтын мессеж 1" (урт=37) нийтийн "огноо" => мөр "2013-07-21T15:00:00.26" (урт=22) нийтийн " төрөл" => "15" мөр (урт=2) 1 => объект(stdClass) нийтийн "утас" => мөр "79871234567" (урт=11) нийтийн "текст" => "Туршилтын мессеж 2" мөр (урт= 37) нийтийн "огноо" => "2014-08-22T16:01:10" мөр (урт=19) нийтийн "төрөл" => "16" мөр (урт=2) 2 => объект(stdClass) нийтийн "утас " => "79871234567" мөр (урт=11) нийтийн "текст" => "Туршилтын мессеж 3" мөр (урт=37) нийтийн "огноо" => мөр "2014-08-22T16:01:10" (урт=) 19) нийтийн "төрөл" => "17" мөр (урт = 2)
Миний хувьд “нөхцөлийн байрыг солихоос нийлбэр өөрчлөгдөхгүй” (в). Юу ХУУРАМЧ, Юу Бүтэц- Бид зорилгодоо хараахан хүрээгүй байна! Үүнд хүрэхийн тулд бид эдгээр үл ойлгогдох нэрсийн оронд бидний төрөлх нэрийг харуулах ёстой. Захиа. Гэхдээ зохиолч үүнд хэрхэн хүрэхээ хараахан мэдэхгүй байна. Тиймээс бидний хийж чадах цорын ганц зүйл бол нэмэлт савнаас салах явдал юм. Өөрөөр хэлбэл, оронд нь бид одоо итгэлтэй байх болно Захиаболсон ХУУРАМЧ! Үүнийг хийхийн тулд объектыг дараах байдлаар өөрчлөх хэрэгтэй.

// сервер рүү илгээх объект үүсгэх $req = new Request(); $msg1 = шинэ мессеж(); $msg1->утас = "79871234567"; $msg1->text = "Туршилтын мессеж 1"; $msg1->огноо = "2013-07-21T15:00:00.26"; $msg1->төрөл = 15; $msg2 = шинэ мессеж(); $msg2->утас = "79871234567"; $msg2->text = "Туршилтын мессеж 2"; $msg2->огноо = "2014-08-22T16:01:10"; $msg2->төрөл = 16; $msg3 = шинэ мессеж(); $msg3->утас = "79871234567"; $msg3->text = "Туршилтын мессеж 3"; $msg3->огноо = "2014-08-22T16:01:10"; $msg3->төрөл = 17; $req->messageList = $msg1; $req->messageList = $msg2; $req->messageList = $msg3; $req->messageList = (объект)$req->messageList;
Хэрэв бид аз таарч, диаграмаас зөв нэр гарч ирвэл яах вэ? Үүнийг хийхийн тулд ирсэн дугтуйг харцгаая.

79871234567 Туршилтын мессеж 1 2013-07-21T15:00:00.26 15 79871234567 Туршилтын мессеж 2 2014-08-22T16:01:10 16 79871234567 Туршилтын мессеж 3 2014-08-22T16:01:10 17
Тийм ээ, гайхамшиг тохиолдсонгүй! ХУУРАМЧ- Бид ялахгүй! Ирсэн SMS илгээхЭнэ тохиолдолд объект дараах байдлаар харагдах болно.

Object(stdClass) public "messageList" => object(stdClass) public "BOGUS" => массив (size=3) 0 => object(stdClass) public "phone" => string "79871234567" (урт=11) нийтийн " text" => "Туршилтын мессеж 1" мөр (урт=37) нийтийн "огноо" => "2013-07-21T15:00:00.26" мөр (урт=22) нийтийн "төрөл" => "15" мөр (урт =2) 1 => объект(stdClass) нийтийн "утас" => стринг "79871234567" (урт=11) нийтийн "текст" => "Туршилтын мессеж 2" (урт=37) олон нийтийн "огноо" => мөр " 2014-08-22T16:01:10" (урт=19) нийтийн "төрөл" => "16" мөр (урт=2) 2 => объект(stdClass) нийтийн "утас" => "79871234567" мөр (урт= 11) нийтийн "текст" => "Туршилтын мессеж 3" мөр (урт=37) нийтийн "огноо" => мөр "2014-08-22T16:01:10" (урт=19) нийтийн "төрөл" => мөр " 17" (урт = 2)
Тэдний хэлснээр "бараг"! Энэ (бага зэрэг гунигтай) тэмдэглэл дээр би бүх зүйлийг аажмаар дүгнэж, өөртөө дүгнэлт хийхийг санал болгож байна.

8 Дүгнэлт

Эцэст нь бид энд ирлээ! Та одоо юу хийж чадахаа олж мэдье:
  • та вэб үйлчилгээнд шаардлагатай WSDL файлыг бичиж болно;
  • та SOAP-ээр сервертэй холбогдох боломжтой өөрийн үйлчлүүлэгчээ хялбархан бичиж болно;
  • та SOAP-ээр дамжуулан гадаад ертөнцтэй харилцдаг өөрийн серверээ бичиж болно;
  • Та өөрийн үйлчлүүлэгчээс ижил төрлийн объектын массивуудыг сервер рүү илгээж болно (зарим хязгаарлалттай).
Мөн бид бяцхан судалгааныхаа явцад зарим нээлтүүдийг хийсэн:
  • уугуул SoapClient анги нь XML-д ижил төрлийн өгөгдлийн бүтцийг зөв цуваа болгож чадахгүй байна;
  • массивыг XML рүү цуваа болгоход энэ нь нэмэлт элементийг үүсгэдэг Бүтэц;
  • Объектыг XML рүү цуваа болгоход энэ нь нэмэлт элементийг үүсгэдэг ХУУРАМЧ;
  • ХУУРАМЧ-аас бага муу Бүтэцдугтуй нь илүү нягтралтай тул (дугтуйны XML толгой хэсэгт нэмэлт нэрийн зай нэмээгүй);
  • Харамсалтай нь SoapServer анги нь дугтуйны өгөгдлийг манай XML схемээр автоматаар баталгаажуулдаггүй (бусад серверүүд ч үүнийг хийхгүй байж магадгүй).

Бретт Маклафлин Илья Чекменевийн орчуулга

SOAP бол объектын хандалтын энгийн протокол юм. Хэрэв та өмнө нь энэ тухай сонсож байгаагүй бол та соёл иргэншлээс хол газар амьдрах ёстой. Энэ нь вэб програмчлалын хамгийн сүүлийн үеийн загвар, вэб үйлчилгээний салшгүй хэсэг болсон бөгөөд энэ нь сүүлийн үеийн вэб хөгжүүлэлтэд ийм фанатизмаар ашиглагддаг. Хэрэв та Microsoft-ын .NET буюу үе тэнгийнхний хоорондох "хувьсгал"-ын талаар сонссон бол SOAP дээр тулгуурласан технологиуд (энэ нь юу болохыг мэдэхгүй байсан ч) сонссон байх. Нэг ч байхгүй, гэхдээ хоёр MSDN-ийн дэмжлэгийн сайт (http://msdn.microsoft.com/) дээр өөрт зориулагдсан мянга мянган хуудастай Apache болон Microsoft-ын SOAP программууд.

Энэ нийтлэлд би SOAP гэж юу болох, яагаад вэб програмчлалын парадигмыг хөгжүүлэхэд чухал үүрэг гүйцэтгэдэг болохыг танд хэлэх болно. Энэ нь танд үндсэн ойлголтуудыг алгасаж, SOAP хэрэгсэлтэй шууд ажиллахад тусална. Дараа нь би одоо байгаа SOAP төслүүдийн талаар товч тоймлон өгч, Apache-ийн хэрэгжилтийг судлах болно. Энэ нийтлэл нь САВАН-ийн тухай бүрэн дүр зургийг гаргах зорилгогүй; миний Java & XML, 2-р хэвлэл ном нь олон цоорхойг нөхөж өгдөг. Та энэ нийтлэлийг уншсаны дараа гарч ирсэн олон асуултын хариултыг номноос олох болно.

Оршил

Эхлээд та САВАН гэж юу болохыг ойлгох хэрэгтэй. Та http://www.w3.org/TR/SOAP сайтаас бүрэн (мөн нэлээд урт) W3C-ийн дүгнэлтийг уншиж болно. Дараа нь үүнийг ойлгож, бүх хальсыг нь хаяснаар САВАН бол зүгээр л протокол гэдгийг ойлгох болно. Энэ нь тархсан архитектурын зарим үед мэдээлэл солилцох хэрэгцээ гардаг гэсэн санаан дээр үндэслэсэн энгийн протокол юм (үүнийг ашиглахын тулд шинээр бичих шаардлагагүй). Нэмж дурдахад, боловсруулах явцад хэт ачаалал, хүндрэл гарах магадлалтай системүүдийн хувьд энэ протокол нь хөнгөн жинтэй бөгөөд хамгийн бага нөөц шаарддаг тул маш давуу талтай юм. Эцэст нь, энэ нь бүх үйлдлүүдийг HTTP-ээр гүйцэтгэх боломжийг олгодог бөгөөд энэ нь галт хана гэх мэт төвөгтэй зүйлсийг тойрч гарах, гайхалтай олон тооны портууд дээрх залгууруудыг сонсохоос өөрийгөө хамгаалах боломжийг олгодог. Хамгийн гол нь та үүнийг ухамсарлаж, бусад бүх зүйл бол нарийн ширийн зүйл юм.

Мэдээжийн хэрэг, та эдгээр нарийн ширийн зүйлийг мэдэхийг хүсч байна, би тэднийг үл тоомсорлохгүй. SOAP-ын тодорхойлолтод гурван үндсэн бүрэлдэхүүн хэсэг байдаг: САВАН-ын дугтуй, шифрлэлтийн багц дүрэм, хүсэлт ба хариулт хоорондын харилцан үйлчлэлийн хэрэгсэл. SOAP мессежийг энгийн захидал гэж үзье. Шуудангийн марк, нүүрэн дээр нь хаяг бичсэн дугтуйнд хийсэн эртний эд зүйлсийг та одоо ч санаж байна уу? Энэхүү зүйрлэл нь САВАН гэдэг ойлголтыг "дугтуй" гэж илүү тодорхой ойлгоход тусална. Зураг 12-1-д SOAP-ийн үйл явцыг энэ аналогийн хэлбэрээр дүрсэлсэн байна.

Зураг 12-1. SOAP мессежийн үйл явц

Энэ зургийг санаж, SOAP-ийн тодорхойлолтын гурван бүрэлдэхүүн хэсгийг харцгаая. Би тус бүрийн талаар товчхон ярьж, үзэл баримтлалыг хамгийн сайн илэрхийлэх жишээнүүдийг хэлье. Эдгээр гурван үндсэн бүрэлдэхүүн хэсэг нь САВАН-г маш чухал бөгөөд утга учиртай болгодог. Алдаа боловсруулах, янз бүрийн шифрлэлтийн дэмжлэг, параметрийн цуваа, SOAP нь HTTP дээр ажилладаг нь ихэнх тохиолдолд түгээсэн протоколуудын бусад шийдлүүдээс илүү сонирхолтой болгодог. SOAP нь бусад програмуудтай өндөр зэрэглэлийн харилцан ажиллах боломжийг олгодог бөгөөд энэ талаар би номондоо илүү дэлгэрэнгүй авч үзсэн. Одоохондоо би SOAP-ийн үндсэн элементүүдэд анхаарлаа хандуулахыг хүсч байна.

Дугтуй

САВАННЫ дугтуй нь ердийн захидлын дугтуйтай төстэй. Энэ нь үндсэн SOAP хэсэгт шифрлэгдсэн мессежийн тухай мэдээлэл, үүнд хүлээн авагч болон илгээгчийн талаарх мэдээлэл, мөн мессежийн тухай мэдээлэл багтсан болно. Жишээлбэл, SOAP дугтуйны толгой нь мессежийг хэрхэн боловсруулахыг зааж өгч болно. Аппликейшн нь мессежийг боловсруулж эхлэхээс өмнө мессежийн талаарх мэдээллийг, тэр дундаа мессежийг боловсруулж чадах эсэхийг шалгадаг. Стандарт XML-RPC дуудлагын нөхцөл байдлаас ялгаатай нь (санаж байна уу? XML-RPC мессежүүд, шифрлэлт гэх мэт. Бүх зүйл нэг XML фрагментэд нэгтгэгддэг) SOAP-ийн тусламжтайгаар мессежийн талаар ямар нэг зүйлийг сурахын тулд тасралтгүй боловсруулалт хийдэг. Ердийн SOAP мессеж нь хүлээн авагчид мессежийг боловсруулахад туслах шифрлэлтийн хэв маягийг агуулж болно. Жишээ 12-1 нь кодчилолын тодорхойлолтоор төгссөн SOAP дугтуйг харуулж байна.

Жишээ 12-1: САВАН дугтуй

Савангийн хайрцаг http://www-106.ibm.com/developerworks/library/x-soapbx1.html

Таны харж байгаагаар шифрлэлтийг дугтуй дотор суулгасан бөгөөд энэ нь програмыг тодорхойлох боломжийг олгодог (атрибутын утгыг ашиглан). encodingStyle), элементэд байрлах ирж буй мессежийг уншиж чадах эсэх Бие. SOAP дугтуйны нэрийн орон зай зөв эсэхийг шалгаарай, эс тэгвээс таны мессежийг хүлээн авсан SOAP серверүүд хувилбарын таарахгүй алдааг мэдээлэх бөгөөд та тэдэнтэй холбогдох боломжгүй болно.

Шифрлэлт

SOAP-ийн хоёр дахь чухал элемент бол захиалгат өгөгдлийн төрлийг шифрлэх чадвар юм. RPC (болон XML-RPC)-ийн тусламжтайгаар шифрлэлтийг зөвхөн таны татаж авсан XML-RPC хэрэглүүрт дэмжигдсэн урьдчилан тодорхойлсон өгөгдлийн төрлүүд дээр хийх боломжтой. Бусад төрлийн өгөгдлийг шифрлэхийн тулд RPC сервер болон үйлчлүүлэгчийг өөрөө өөрчлөх шаардлагатай. SOAP-ийн тусламжтайгаар XML схемийг шинэ өгөгдлийн төрлийг тодорхойлоход хялбар ашиглаж болно (бүтцийг ашиглан нарийн төвөгтэй төрөл, миний номын 2-р бүлэгт авч үзсэн) бөгөөд эдгээр шинэ төрлүүдийг SOAP-ын үндсэн хэсгийн нэг хэсэг болгон XML дээр төлөөлж болно. XML схемийн интеграцчлалын ачаар та SOAP мессеж дэх ямар ч төрлийн өгөгдлийг XML схемд логикоор тайлбарлаж шифрлэх боломжтой.

Дуудлага хийх

SOAP дуудлага хэрхэн ажилладагийг ойлгох хамгийн сайн арга бол үүнийг XML-RPC гэх мэт сайн мэддэг зүйлтэй харьцуулах явдал юм. Хэрэв та санаж байгаа бол XML-RPC дуудлага нь 12-2-р жишээнд үзүүлсэн кодын хэсэгтэй төстэй харагдаж байна.

Жишээ 12-2. XML-RPC руу залгана уу

// XmlRpc.setDriver("org.apache.xerces.parsers.SAXParser"); // Холболт хийгдсэн серверийг зааж өгч байна XmlRpcClient client = new XmlRpcClient("http://rpc.middleearth.com"); // Параметр үүсгэх Вектор параметрүүд = new Vector(); params.addElement(нислэгийн дугаар); params.addElement(numSeats); params.addElement(creditCardType); params.addElement(creditCardNum); // Boolean boughtTickets хүсэлт гаргах = (Боолийн)client.execute("ticketCounter.buyTickets", параметрүүд); // Хариултыг боловсруулах

Би онгоцны тийз захиалах энгийн програмыг бүтээсэн. Одоо SOAP дуудлагыг харуулсан 12-3-р жишээг харна уу.

Жишээ 12-3. SOAP руу залгана уу

// Параметр үүсгэх Вектор параметрүүд = new Vector(); params.addElement(шинэ Параметр("flightNumber", Integer.class, нислэгийн дугаар, null)); params.addElement(шинэ Параметр("numSeats", Integer.class, numSeats, null)); params.addElement(шинэ Параметр("creditCardType", String.class, creditCardType, null)); params.addElement(шинэ Параметр("creditCardNumber", Long.class, creditCardNum, null)); // Дуудлагын объект үүсгэх Дуудлага дуудлага = new Call(); call.setTargetObjectURI("urn:xmltoday-airline-tickets"); call.setMethodName("Tickets худалдаж авах"); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); call.setParams(params); // Дуудлагын хариу res = call.invoke(шинэ URL("http://rpc.middleearth.com"), ""); // Хариултыг боловсруулах

Таны харж байгаагаар объектоор илэрхийлэгдсэн бодит дуудлага Дуудлага хийх, санах ойн оршин суугч. Энэ нь дуудлагын зорилт, дуудлагын арга, шифрлэлтийн хэв маяг, параметрүүд болон энэ жишээнд үзүүлээгүй бусад олон параметрүүдийг тодорхойлох боломжийг танд олгоно. Энэ нь XML-RPC аргаас илүү уян хатан механизм бөгөөд XML-RPC-д далд хэлбэрээр тодорхойлогдсон өөр өөр параметрүүдийн багцыг тодорхой зааж өгөх боломжийг олгодог. Энэ нийтлэлийн дараа та SOAP нь хүчингүй хүсэлтийг хэрхэн зохицуулдаг, алдааны шатлал, мэдээжийн хэрэг буцаж ирсэн дуудлагын үр дүн зэрэг дуудлагын процессын талаар илүү ихийг мэдэх болно.

Ийм товч танилцуулгын дараа та энэ инээдтэй зүйлийг сонирхох хангалттай мэдлэгтэй болсон. Одоо би та бүхэнд өөрийн ашиглах гэж буй SOAP-ийн хэрэгжилтийг танилцуулъя. Би яагаад үүнийг сонгосон шалтгаанаа тайлбарлаж, зарим кодын жишээг үзэх болно.

Тохиргоо

Одоо та үзэл баримтлалын үндсийг сурсан тул хөгжилтэй хэсэг болох програмчлалын цаг ирлээ. Үүнийг хийхийн тулд танд анх харахад харагдахаас хялбар олоход хялбар төсөл эсвэл бүтээгдэхүүн хэрэгтэй болно. Хэрэв танд SOAP-ийн чадавхийг хангасан Java төсөл хэрэгтэй бол түүнийг олохын тулд удаан хайх шаардлагагүй. Арилжааны болон үнэ төлбөргүй гэсэн хоёр бүлэг бүтээгдэхүүн байдаг. Би номондоо бичсэн шиг арилжааны бүтээгдэхүүнийг дурдахаас зайлсхийх болно. Энэ нь тэдгээр нь муу (эсрэгээр, зарим нь маш сайн) учраас биш, харин ямар ч уншигч өгөгдсөн жишээнүүдийг туршиж үзэхийг хүсч байна. Энэ нь олон арилжааны бүтээгдэхүүнд байдаггүй хүртээмжтэй холбоотой юм. Та тэдгээрийг ашиглахын тулд төлбөр төлөх ёстой, эсвэл татаж авсны дараа тодорхой хугацаанд түр ашиглах ёстой.

Тиймээс бид нээлттэй эхийн төслүүдэд саадгүй хандсан. Энэ хэсгээс би зөвхөн нэг бүтээгдэхүүнийг нэрлэж болно: Apache SOAP. Энэ нь http://xml.apache.org/soap хаяг дээр байрладаг бөгөөд Java-д зориулсан SOAP хэрэглүүрээр хангадаг. Үүнийг бичиж байх үед 2.2 хувилбар гарсан бөгөөд та үүнийг Apache вэбсайтаас татаж авах боломжтой. Энэ нийтлэлийн жишээн дээр би энэ хувилбарыг ашиглах болно.

Бусад хувилбарууд

Apache SOAP-г суулгах, тохируулахын өмнө би таны толгойд орж ирсэн хэдэн асуултанд хариулах болно. Би яагаад арилжааны бүтээгдэхүүн хэрэглэхгүй байгаагаа маш тодорхой тайлбарласан гэж бодож байна. Гэсэн хэдий ч, та ашиглахыг хүсч болох бусад нээлттэй эх сурвалж эсвэл холбогдох төслүүдийн талаар бодож байж магадгүй бөгөөд намайг тэдний талаар тайлбар хийгээгүйд та гайхаж байна.

IBM SOAP4J-ийн талаар юу хэлэх вэ?

Хувилбаруудын жагсаалтын эхнийх нь IBM: SOAP4J-ийн хэрэгжүүлэлт юм. IBM-ийн XML4J нь одоо Apache Xerces XML задлагч төсөл гэж нэрлэгддэг төсөл болж хөгжихийн зэрэгцээ IBM-ийн ажил Apache SOAP төслийн үндэс суурь болсон. IBM-ийн хэрэгжилтийг Apache SOAP-тай нэгтгэн дахин төлөвлөнө гэж таамаглаж байна. IBM-ийн XML4J-тэй ижил зүйл тохиолдсон: одоо энэ нь зөвхөн Xerces дээр савлагаа өгдөг. Энэ нь зөвхөн чиг хандлагыг онцолж өгдөг - томоохон үйлдвэрлэгчид ихэвчлэн OpenSource төслүүдийг дэмжиж ашигладаг, энэ тохиолдолд хоёр төсөл (Apache болон IBM) ижил кодын суурийг ашигладаг.

Майкрософт тоглоомоос гарсан уу?

Мэдээж үгүй. Майкрософт болон түүний SOAP хэрэгжилт, мөн .NET-ийн бүх хөдөлгөөн (миний номонд илүү дэлгэрэнгүй авч үзсэн) нэлээд ач холбогдолтой юм. Би ихэнх цагаа Microsoft-ын SOAP-ийн хэрэгжилтийг нарийвчлан үзэхийг үнэхээр хүсч байсан ч энэ нь зөвхөн COM объектуудыг дэмждэг бөгөөд Java-г дэмждэггүй. Эдгээр шалтгааны улмаас ийм тайлбарыг Java болон XML-ийн тухай нийтлэлд оруулах боломжгүй байсан. Гэсэн хэдий ч Майкрософт (хөгжүүлэгчдийн хувьд бид энэ компаний талаар гомдол гаргаж байсан ч) вэб үйлчилгээний салбарт чухал ажил хийсэн бөгөөд та зөвхөн түүхий сэтгэл хөдлөлөөр удирдан чиглүүлж, бодолгүйгээр үүнийг орхивол алдаа гаргах болно. Хэрэв танд COM эсвэл Visual Basic бүрэлдэхүүн хэсгүүдтэй ажиллах шаардлагатай байгаа бол http://msdn.microsoft.com/library/default.asp?url=/nhp/Default хаягаас авах боломжтой Microsoft SOAP хэрэгслийг ашиглахыг зөвлөж байна. .asp ?contentid=28000523 бусад олон SOAP нөөцийн хамт.

Axis гэж юу вэ?

Апачигийн үйл ажиллагааг дагадаг хүмүүс Apache Axis-ийн талаар сонссон байх. Axis нь Apache XML дээвэр дор бүтээгдсэн дараагийн үеийн SOAP хэрэгслийн хэрэгсэл юм. Сүүлийн үед хурдацтай, эрс хөгжиж буй SOAP (тодорхой хэрэгжилт биш, тодорхойлолт) -ийг дагаж мөрдөхөд маш хэцүү байдаг. Орчин үеийн шаардлагад бүрэн нийцсэн SOAP-ийн хувилбарыг бий болгохыг оролдох нь бас нэлээд хэцүү байдаг. Үүний үр дүнд Apache SOAP-ийн одоогийн хувилбар нь дизайнаараа хязгаарлагдмал шийдлийг санал болгож байна. Одоо байгаа хэрэгслийг бүрэн дахин төлөвлөх нь зохисгүй гэж шийдсэний дараа Apache хөгжүүлэгчид шинэ код дээр суурилсан төсөл боловсруулж эхлэв. Ийнхүү тэнхлэг мэндэлжээ. SOAP-ын нэр нь мөн өөрчлөгдсөн бөгөөд эхлээд SOAP-аас XP болж, дараа нь XMLP болсон. Дараа нь шинэ SOAP-ийн нэрнээс техникийн тодорхойлолтыг хасч, "Тэнхлэг" гэсэн нэр гарч ирэв. Гэхдээ одоо W3C нь SOAP-ын тодорхойлолт (хувилбар 1.2 эсвэл 2.0) нэр рүүгээ буцаж байгаа юм шиг санагдаж байна, тиймээс бүх зүйл өөрчлөгдөж магадгүй бөгөөд бүр илүү будлиантай байх болно!

IBM SOAP4J-ийг SOAP хэрэгслийн нэг архитектур гэж төсөөлөөд үз дээ. Архитектурын хувьд Apache SOAP (энэ нийтлэлд авч үзэх болно) яах вэ?2. Мөн Axis нь шинэ үеийн архитектур болох ?3 архитектурыг төлөөлдөг. Энэ төсөл нь SAX ашигладаг бол Apache SOAP нь DOM дээр суурилсан. Нэмж дурдахад Axis нь Apache SOAP-аас ялгаатай нь хэрэглэгчийн харилцан үйлчлэлд илүү ээлтэй хандлагыг бий болгодог. Эдгээр давуу талуудыг жагсаасаны дараа та яагаад тэнхлэгийг өөрийн хичээлээр сонгоогүй юм бол гэж гайхаж магадгүй юм. Энэ нь арай л эрт байх болно. Одоогоор Axis-ийн зөвхөн 0.51 хувилбарыг гаргахаар бэлтгэж байна. Энэ бол бета хувилбар, тэр ч байтугай альфа хувилбар ч биш юм. Би Axis-ийн шинэ функцүүдийн талаар ярихыг хүсч байна, гэхдээ та өөрийн системийн чухал хэрэгцээнд зориулж дэд альфа нээлттэй эхийн програм хангамжийг ашиглаж болно гэдэгт удирдлагадаа итгүүлэх ямар ч боломж байхгүй. Тиймээс би таныг бодитой зүйлд анхаарлаа хандуулахаар шийдсэн та ашиглаж болноаль хэдийн Өнөөдөр- Apache САВАН. Apache Axis-ийн эцсийн хувилбар гарах үед би номынхоо дараагийн хэвлэлд энэ материалыг шинэчлэх болно гэж бодож байна. Тэр болтол аль хэдийн бэлэн болсон шийдэлд анхаарлаа хандуулцгаая.

Суурилуулалт

САВАН суулгах хоёр боломжит хэлбэр байдаг. Эхнийх нь SOAP мессежийг хүлээн авах сервертэй холбогдохын тулд SOAP API ашиглан SOAP клиентийг эхлүүлэх явдал юм. Хоёрдахь арга бол SOAP клиентээс мессеж хүлээн авах боломжтой SOAP сервер ажиллуулах явдал юм. Энэ хэсэгт би хоёр процедурыг тайлбарласан.

Үйлчлүүлэгч

SOAP клиентийг ашиглахын тулд та эхлээд http://xml.apache.org/dist/soap хаягаас авах боломжтой Apache SOAP-г татаж авах хэрэгтэй. Би 2.2 хувилбарыг хоёртын форматаар татаж авсан (дэд лавлахаас хувилбар-2.2). Дараа нь та архивын агуулгыг компьютер дээрх лавлах руу задлах ёстой. Миний хувьд энэ нь лавлах байсан javaxml2 (c:\javaxml2миний Windows компьютер дээр /javaxml2миний Mac OS X компьютер дээр). Үүний үр дүнд файлуудыг задалсан /javaxml2/саван-2_2. Та мөн Sun http://java.sun.com/products/javamail/ сайтаас авах боломжтой JavaMail багцыг татаж авах шаардлагатай. Энэ нь Apache SOAP-д ашигладаг SMTP дамжуулах протоколыг дэмжих шаардлагатай болно. Дараа нь Sun http://java.sun.com/products/beans/glasgow/jaf.html сайтаас авах боломжтой Java Beans Activation Framework (JAF)-г татаж аваарай. Та Xerces эсвэл өөр XML задлагч суулгасан бөгөөд ашиглахад бэлэн байна гэсэн таамаглал дээр үндэслэнэ.

Жич:Таны XML задлагч JAXP-тэй нийцэж байгаа бөгөөд нэрийн зайг зөв ашиглаж байгаа эсэхийг шалгаарай. Таны задлагч эдгээр шаардлагыг хангасан байх магадлалтай. Хэрэв танд асуудал байгаа бол Xerces-г ашиглахад буцах нь дээр.

Жич: Xerces-ийн хамгийн сүүлийн үеийн хувилбаруудыг ашигла. 1.4 ба түүнээс дээш хувилбарууд ажиллах болно. SOAP болон Xerces 1.3(.1)-д хэд хэдэн алдаа байгаа тул би энэ хослолыг ашиглахгүй байхыг зөвлөж байна.

JavaMail болон JAF багцуудыг задлаад тэдгээрийн jar файлуудыг ангийн зам болон номын санд оруулна уу. саван. Эдгээр jar файл бүр нь тохирох програмын үндсэн директор эсвэл дэд директорт байрлах ёстой. /lib. Таны хувьсагч дууссаны дараа ангийн замиймэрхүү харагдах ёстой:

$ echo $CLASSPATH /javaxml2/soap-2_2/lib/soap.jar:/javaxml2/lib/xerces.jar: /javaxml2/javamail-1.2/mail.jar:/javaxml2/jaf-1.0.1/activation.jar

Windows-ийн хувьд энэ нь дараах байдлаар харагдах болно.

c:\>echo %CLASSPATH% c:\javaxml2\soap-2_2\lib\soap.jar;c:\javaxml2\lib\xerces.jar; c:\javaxml2\javamail-1.2\mail.jar;c:\javaxml2\jaf-1.0.1\activation.jar

Эцэст нь лавлахыг нэмнэ үү javaxml2/саван-2_2/чиний дотор ангийн зам SOAP жишээг ажиллуулах. Би энэ бүлэгт хэд хэдэн жишээн дээр тохиргоог тайлбарласан.

Сервер

SOAP-тай нийцтэй серверийн бүрэлдэхүүн хэсгүүдийг үүсгэхийн тулд эхлээд сервлет хөдөлгүүр хэрэгтэй. Өмнөх бүлгүүдийн нэгэн адил би энэ бүлгийн жишээ болгон Apache Tomcat (http://jakarta.apache.org/ хаягаас авах боломжтой) ашигласан. Та үйлчлүүлэгчид хэрэгтэй бүх зүйлийг оруулах хэрэгтэй болно ангийн замсервер. Үүнийг хийх хамгийн хялбар арга бол дахин тохируулах явдал юм саван, идэвхжүүлэх.jarТэгээд mail.jar, мөн таны задлагчийг өөрийн сервлет хөдөлгүүрийн номын сангийн лавлах руу оруулна уу. Tomcat-ийн хувьд энэ нь автоматаар ачаалах сангуудыг агуулсан /lib сан юм. Хэрэв та скриптүүдэд дэмжлэг үзүүлэхийг хүсч байвал (энэ бүлэгт авч үзэхгүй, гэхдээ Apache SOAP жишээнүүдэд байгаа) та үүнийг оруулах хэрэгтэй. bsf.jar(http://oss.software.ibm.com/developerworks/projects/bsf дээрээс авах боломжтой) болон js.jar(http://www.mozilla.org/rhino/ сайтаас авах боломжтой) ижил лавлах руу оруулна уу.

Жич:Хэрэв та Xerces-ийг Tomcat-тай хамт хэрэглэж байгаа бол 10-р бүлэгт дурдсан арга барилыг давтах хэрэгтэй болно. Нэрээ өөрчил. parser.jarВ z_parser.jar, А jaxp.jarВ z_jaxp.jarгэдэгт итгэлтэй байхын тулд xerces.jarмөн JAXP-ийн оруулсан хувилбар нь бусад задлан шинжлэгч эсвэл JAXP хэрэгжилтээс өмнө ачаалагддаг.

Дараа нь сервлет хөдөлгүүрээ дахин эхлүүлж, үүний дараа та SOAP серверийн бүрэлдэхүүн хэсгүүдийг бичихэд бэлэн болно.

Router Servlet болон Admin Client

Үндсэн үйлдлүүдээс гадна Apache SOAP нь чиглүүлэгч сервлет болон админ клиентийг агуулдаг. Хэдийгээр та тэдгээрийг ашиглах бодолгүй байсан ч SOAP-ыг зөв суулгасан эсэхийг шалгахын тулд тэдгээрийг суулгахыг зөвлөж байна. Энэ процесс нь таны аль сервлет хөдөлгүүрийг ашиглаж байгаагаас шалтгаална, тиймээс би суулгах процессыг Tomcat-д хязгаарлах болно. Бусад зарим сервлет хөдөлгүүрүүдийг суулгах зааврыг http://xml.apache.org/soap/docs/index.html дээрээс олж болно.

Tomcat доор суулгах нь маш энгийн: зүгээр л файлаа аваарай саван.дайнлавлахаас саван-2_2/webappsмөн лавлах руу оруулна уу $TOMCAT_HOME/webapps- тэгээд л болоо! Суулгацыг шалгахын тулд хөтөч дээрээ хаягаа оруулна уу http://localhost:8080/soap/servlet/rpcrouter. Та Зураг 12-2-т үзүүлсэнтэй төстэй хариулт авах ёстой.

Зураг 12-2. Router RPC Servlet

Хэдийгээр энэ мессеж нь алдааны мессеж мэт харагдаж байгаа ч бүх зүйл зөв ажиллаж байгааг харуулж байна. Хэрэв та хөтчөө администраторын үйлчлүүлэгчийн хаяг руу чиглүүлбэл ижил хариулт авах ёстой: http://localhost:8080/soap/servlet/messagerouter.

Сервер болон үйлчлүүлэгчийн туршилтыг дуусгахын тулд та бүх зааврыг бүрэн дагаж мөрдсөн эсэхээ шалгаарай. Дараа нь RPC чиглүүлэгч сервлетийн серверийн URL-г дэмжихийн тулд доорх Java ангиллыг ажиллуулна уу:

C:\>java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter жагсаалт Оруулсан үйлчилгээ:

Та дээр үзүүлсэн шиг үйлчилгээний хоосон жагсаалтыг авах ёстой. Хэрэв танд ямар нэгэн мессеж ирсэн бол http://xml.apache.org/soap/docs/trouble/index.html хаягаар орж болох алдааны урт жагсаалтыг харна уу. Энэ бол танд тулгарч болох асуудлын хамгийн дэлгэрэнгүй жагсаалт юм. Хэрэв та хоосон жагсаалт хүлээн авбал энэ нь тохиргоо дууссан гэсэн үг бөгөөд та энэ бүлэгт өгөгдсөн жишээнүүдийг үзэж эхлэхэд бэлэн байна.

Эхэлцгээе

САВАН-д суурилсан аливаа системийг бичихэд гурван үндсэн үе шат байдаг. Тэднийг жагсаасны дараа би тус бүрийг товчхон ярих болно.

  • SOAP-RPC болон SOAP мессежүүдийн хооронд сонголт хийх;
  • SOAP үйлчилгээ бичих эсвэл хандах эрх авах;
  • SOAP клиент бичих эсвэл хандах.

Эхний алхам бол RPC дуудлагад (сервер дээр алсын зайнаас процедурыг гүйцэтгэдэг) эсвэл мессеж (үйлчлүүлэгч зүгээр л сервер рүү мэдээлэл илгээдэг) ашиглахдаа SOAP ашиглах эсэхээ сонгох явдал юм. Би эдгээр үйл явцыг доор дэлгэрэнгүй авч үзэх болно. Энэ шийдвэрийг гаргасны дараа та өөрийн үйлчилгээнд хандах эсвэл үүсгэх шаардлагатай болно. Мэдээжийн хэрэг, бид бүгд Java-гийн мэргэжлийн хүмүүс учраас энэ бүлэгт өөрийн гараар хэрхэн бүтээх талаар өгүүлнэ. Эцэст нь та энэ үйлчилгээнд үйлчлүүлэгч бичих хэрэгтэй, тэгээд л тэр!

RPC эсвэл Messaging?

Таны эхний даалгавар бол програмчлалтай ямар ч холбоогүй бөгөөд дизайны шинж чанартай байдаг. Та RPC эсвэл мессежийн үйлчилгээг ашиглах эсэхээ сонгох хэрэгтэй. Бид таныг RPC-ийг мэддэг гэж таамаглах болно (жишээлбэл, миний номын нэг бүлгийг унших замаар). Үйлчлүүлэгч сервер дээр алсын процедурыг гүйцэтгэдэг бөгөөд дараа нь хариу хүлээн авдаг. Энэ тохиолдолд SOAP нь сайжруулсан XML-RPC системийн үүрэг гүйцэтгэдэг бөгөөд энэ нь алдаатай ажиллах, сүлжээгээр нарийн төвөгтэй өгөгдлийн төрлүүдийг дамжуулах боломжийг олгодог. Та энэ ойлголтыг аль хэдийн мэддэг болсон бөгөөд RPC системүүд нь SOAP дээр бичихэд хялбар байдаг тул би тэднээс эхэлье. Энэ нийтлэлд RPC үйлчилгээ, RPC клиентийг хэрхэн үүсгэх, системийг хэрхэн ажиллуулах талаар тайлбарлана.

SOAP-ийн өөр нэг арга нь мессеж солилцоход суурилдаг. Алсын горимыг гүйцэтгэхийн оронд зөвхөн мэдээлэл солилцоход ашигладаг. Таны таамаглаж байгаагаар энэ нь үйлчлүүлэгчээс аливаа серверийн бие даасан аргыг мэдэхийг шаарддаггүй хүчирхэг хэрэгсэл юм. Энэ нь өгөгдлийн пакетуудыг (сүлжээний утгаараа биш харин дүрслэлийн утгаараа пакетууд) бусад системд илгээх боломжийг олгосноор алсын системүүдийн загварчлалыг илүү тусгаарлагдсан болгодог. Үүний зэрэгцээ бусад системүүд энэ өгөгдөлтэй хийсэн үйлдлийн талаар мэдэх шаардлагагүй болно. Энэ хэв маяг нь RPC програмчлалаас илүү төвөгтэй тул би энд тайлбарлахгүй. Та үүнийг миний номноос бизнес хоорондын харилцааны бусад нарийн ширийн зүйлийн хамт олох болно. Эхлээд SOAP-RPC програмчлалтай танилц.

Ихэнх дизайны асуудлуудын нэгэн адил энэ шийдвэрийг гаргах нь танд хамаарна. Өргөдөлдөө дүн шинжилгээ хийж, яагаад САВАН ашиглах хэрэгтэйг тодорхойлохыг хичээ. Хэрэв танд бизнес эрхэлдэг сервер болон үйлчлүүлэгчдийн багц байгаа бол RPC танд илүү тохиромжтой. Мэдээлэл солилцох нь зөвхөн эрэлт хэрэгцээний дагуу бизнесийн тодорхой функцуудыг гүйцэтгэхээс илүү байдаг нарийн төвөгтэй системүүдэд SOAP мессежийг ашиглах нь илүү дээр юм.

RPC үйлчилгээ

Нэгэнт албан ёсны ажил дуусч, ажиллах цаг болжээ. Таны мэдэж байгаагаар RPC-д аргуудыг алсаас гүйцэтгэх ангиуд хэрэгтэй болно.

Кодын хэсгүүд

Би серверт зориулсан кодын зарим хэсгийг үзэж эхэлье. Эдгээр фрагментууд нь RPC үйлчлүүлэгчдэд зориулагдсан аргуудтай ангиуд юм. Би номынхоо кодыг жишээ болгон ашигласан. Би энгийн хичээлүүдийг ашиглахын оронд SOAP-ийн чадварыг аль болох тодорхой харуулахын тулд илүү төвөгтэй жишээг сонгосон. Тиймээс би CD ангийг жишээ болгон ашигласан. Эхлээд бид элементийг тодорхойлно газрын зурагстандарт бус параметрийн төрөл бүрийн хувьд. Атрибутын хувьд encodingStyle, наад зах нь Apache SOAP 2.2. та http://schemas.xmlsoap.org/soap/encoding/ утгыг оруулах ёстой. Энэ нь одоогоор дэмжигдсэн цорын ганц кодчилол юм. Та хэрэглэгчийн тодорхойлсон төрлийн нэрийн орон зайг зааж өгөх хэрэгтэй бөгөөд дараа нь тухайн төрлийн нэрийн орон зайн угтвартай ангийн нэрийг зааж өгөх хэрэгтэй. Манай тохиолдолд эдгээр зорилгоор би зохиомол нэрийн орон зай, энгийн угтвар ашигласан " x". Дараа нь шинж чанарыг ашиглана javaType, Java ангийн жинхэнэ нэрийг тохируулна уу (энэ тохиолдолд - javaxml2.CD). Эцэст нь, шинж чанаруудтай kuralesil java2XMLClassNameТэгээд xml2JavaClassName. Тэдгээрийн тусламжтайгаар Java-ээс XML болон эсрэгээр хөрвүүлэх анги тодорхойлогддог. Би Apache SOAP-д багтсан гайхалтай хялбар BeanSerializer ангиллыг ашигласан. Хэрэв таны захиалгат параметр JavaBean форматтай бол энэхүү цуваажуулагч болон цуваа арилгагч таныг өөрөө бичихээс аврах болно. Танд өгөгдмөл үүсгэгчтэй анги хэрэгтэй (CD ангид би энгийн, параметргүй байгуулагчийг тодорхойлсон гэдгийг санаарай) аргуудыг ашиглан энэ ангийн бүх өгөгдлийг нийтлэх хэрэгтэй. setXXXТэгээд XXX авах. Учир нь анги CDЭдгээр бүх шаардлагыг бүрэн хангаж, BeanSerializerтөгс ажилладаг.

Жич:Ямар анги CDшаардлагыг хангаж байна BeanSerializer. нэг их хамаагүй. Ихэнх ангиудыг энэ формат руу хялбархан хөрвүүлдэг. Тиймээс би өөрийн сериалчлагч болон сериализаторыг бичихээс зайлсхийхийг зөвлөж байна. Энэ бол нэмэлт толгойн өвчин (ямар ч төвөгтэй зүйл биш, гэхдээ хэтэрхий шаргуу) бөгөөд би та эрчим хүчээ хэмнэж, өөрчлөн тохируулсан параметрүүддээ буурцагны хувиргалтыг ашиглахыг зөвлөж байна. Ихэнх тохиолдолд буурцагны хөрвүүлэлт нь зөвхөн танай ангид анхдагч үүсгэгчийг (параметргүй) шаарддаг.

Одоо дахин бүтээцгээе савфайл хийгээд манай үйлчилгээг дахин суулгана уу:

(gandalf)/javaxml2/Ch12$ java org.apache.soap.server.ServiceManagerClient http://localhost:8080/soap/servlet/rpcrouter xml/CDCatalogDD.xml

Анхаар:Хэрэв та сервлет хөдөлгүүрээ ажиллуулж, үйлчилгээгээ дахин байршуулах үед нэгэн зэрэг SOAP үйлчилгээний шинэ ангиудыг идэвхжүүлж, үйлчилгээг дахин байршуулахын тулд сервлет хөдөлгүүрийг дахин эхлүүлэх шаардлагатай болно.

Одоо шинэ анги, аргуудыг ашиглахын тулд үйлчлүүлэгчээ өөрчлөх л үлдлээ. Жишээ 12-10 нь үйлчлүүлэгчийн ангийн өөрчлөгдсөн хувилбарыг агуулна CDadder. Өмнөх хувилбарт хийсэн өөрчлөлтүүдийг онцлон тэмдэглэв.

Жишээ 12-10: CDAdder анги шинэчлэгдсэн

javaxml2 багц; java.net.URL импортлох; java.util.Vector импортлох; org.apache.soap.Constants импортлох; import org.apache.soap.Fault; import org.apache.soap.SOAPException; import org.apache.soap.encoding.SOAPMappingRegistry; org.apache.soap.encoding.soapenc.BeanSerializer импортлох; import org.apache.soap.rpc.Call; org.apache.soap.rpc.Parameter импортлох; import org.apache.soap.rpc.Response; org.apache.soap.util.xml.QName-г импортлох; нийтийн ангийн CDAdder( public void add(URL url, String title, String artist, String label) нь SOAPException ( System.out.println(""" + гарчиг + "" уран бүтээлч "" + уран бүтээлч + "" студи " + шошготой CD нэмэх); CD cd = шинэ CD(гарчиг, уран бүтээлч, шошго); // Дуудлагын объект үүсгэх Call Call дуудлага = new Call(); call.setSOAPMappingRegistry(бүртгэл); call.setTargetObjectURI("urn:cd-каталог"); call.setMethodName("addCD"); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); // Параметрүүдийг тохируулах Вектор параметрүүд = new Vector(); params.addElement(шинэ Параметр("cd", CD.class, cd, null)); call.setParams(params); // Invoke call Response хариуг боловсруулж байна; хариу = call.invoke(url, ""); хэрэв (!response.generatedFault()) ( System.out.println("CD-г амжилттай нэмсэн."); ) else (Алдаа = answer.getFault(); System.out.println(Алдаа: " + fault.getFaultString ())) ) ) public static void main(String args) ( if (args.length != 4) ( System.out.println("Загвар: java javaxml2.CDAdder " + "\"[CD гарчиг]\" \"[Уран бүтээлчийн нэр]\ " \"[Студио CD]\""); буцах; ) оролдох ( // холболт хийгдсэн SOAP серверийн URL URL url = шинэ URL(args); // Шинэ CD-ийн утгыг авах String title = args; String artist = args; String label = args; // CD CDAdder нэмэгч = new CDAdder(); adder.add(url, гарчиг, зураач, шошго); ) барих (Үл хамаарах e) ( e.printStackTrace(); ) ) )

Үнэхээр сонирхолтой цорын ганц өөрчлөлт бол ангийн зураглал юм CD:

// Энэ төрлийг SOAP SOAPMappingRegistry регистрт ашиглах боломжтой газрын зурагт оруулна уу = new SOAPMappingRegistry(); BeanSerializer serializer = шинэ BeanSerializer(); registry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName("urn:cd-catalog-demo", "cd"), CD.class, serializer, serializer);

Хэрэглэгчийн параметрийг ингэж кодлож, сүлжээгээр дамжуулж болно. Хичээл яаж байгааг би аль хэдийн хэлсэн BeanSerializerанги гэх мэт JavaBean форматаар параметрүүдийг боловсруулахад ашиглаж болно CD. Би серверт эдгээрийг зааж өгөхийн тулд байршуулах тодорхойлогч ашигласан, гэвч одоо би үйлчлүүлэгчид энэ цуваажуулагч болон цуваа арилгагчийг ашиглахыг хэлэх хэрэгтэй байна. Энэ функцийг анги гүйцэтгэдэг SOAPMappingRegistry. Арга mapTypes()шифрлэгдсэн мөрийг авдаг (дахин хэлэхэд тогтмолыг ашиглах нь дээр NS_URI_SOAP_ENC), тусгай цуваачлалыг ашиглах ёстой параметрийн төрлийн талаарх мэдээлэл. QName-ийг эхлээд зааж өгсөн болно. Тийм ч учраас хостинг тодорхойлогчд хачирхалтай нэрийн орон зайг ашигласан. Та энд ижил URN, мөн элементийн локал нэр (энэ жишээнд "CD"), дараа нь Java объект оруулах шаардлагатай. Ангицуврал болох анги ( CD.class) ба эцэст нь цуваа болгох, ангижруулах ангийн жишээ. Энэ жишээний хувьд хоёуланд нь тохиолдлууд орно BeanSerializer. Эдгээр бүх тохиргоог бүртгэлд оруулсны дараа объектод мэдэгдэнэ үү Дуудлага хийхаргыг ашиглан setSOAPMapping-Registry().

Та өмнө нь үзүүлсэн шиг энэ ангийг CD нэмж ажиллуулж болох бөгөөд бүх зүйл санаснаар ажиллах болно:

C:\javaxml2\build>java javaxml2.CDAdder http://localhost:8080/soap/servlet/rpcrouter "Тони Райс" "Манзанита" "Сугар Хилл" Sugar Hill-ийн "Manzanita" дууны "Тони Райс" нэртэй CD-г нэмж байна CD-г амжилттай нэмж орууллаа.

Би ангийн өөрчлөлтийг орхисон CDListerчамд. Бүгдийг ижил загварын дагуу үйлдвэрлэдэг. Өөрийгөө шалгахын тулд та эдгээр шинэчилсэн ангиудыг агуулсан миний номын жишээ файлуудыг үзэж болно.

Жич: Анги учраас та үүнийг шийдэж болно CDListerобъекттой шууд харьцдаггүй CD(аргаар буцаасан жагсаалт()төрөл чухал Hashtable), тэгвэл та ямар ч өөрчлөлт хийх шаардлагагүй. Гэсэн хэдий ч буцаж ирсэн анги Hashtableобъектын тохиолдлуудыг агуулдаг CD. Хэрэв SOAP нь тэдгээрийг хэрхэн цувралаас гаргахаа мэдэхгүй бол үйлчлүүлэгч алдаа гаргах болно. Энэ тохиолдолд асуудлыг шийдэхийн тулд та объектод зааж өгөх ёстой Дуудлага хийххуулбарлах SOAPMappingRegistry.

Алдааг үр дүнтэй шийдвэрлэх

Одоо та захиалгат объектуудыг харж, RPC дуудлага хийсэн гэх мэт сэтгэл хөдөлгөм сэдвийн талаар ярилцъя: алдаа засах. Сүлжээний аливаа гүйлгээний хувьд олон алдаа гарч болно. Үйлчилгээ эхлэхгүй байна, серверт алдаа гарлаа, объект олдохгүй байна, анги байхгүй, бусад олон асуудал байна. Одоогоор би зүгээр л аргыг хэрэглэсэн fault.getString()алдааны мессеж үүсгэх. Гэхдээ энэ арга нь үргэлж тустай байдаггүй. Үүнийг ажиллаж байгааг харахын тулд бүтээгчийн тайлбарыг арилгана уу CDCatalog:

нийтийн CDCatalog() ( //каталог = шинэ Hashtable(); // addCD лавлах үүсгэх(шинэ CD("Никель Крик", "Никель Крик", "Сугар Хилл")); addCD(шинэ CD("Let It Fall", "Шон Уоткинс", "Сугар Хилл")); addCD(шинэ CD("Агаарын хил хязгаар", "Майкл Хеджес", "Виндхэм Хилл")); addCD(шинэ CD("Taproot", "Michael Hedges", "Windham Hill")); )

Үүнийг дахин эмхэтгэж, сервлетийн хөдөлгүүрийг дахин эхлүүлж, дахин байршуулна уу. Энэ нь үл хамаарах зүйлд хүргэх болно NullPointerExceptionанги үүсгэгч CD-г эхлүүлээгүй дээр нэмэх гэж оролдох үед Hashtable. Үйлчлүүлэгчийг эхлүүлэх үед алдааны мэдэгдэл гарч ирэх боловч энэ нь тийм ч их мэдээлэл өгөхгүй:

(gandalf)/javaxml2/build$ java javaxml2.CDLister http://localhost:8080/soap/servlet/rpcrouter Одоогийн CD лавлахыг харна уу. Алдаа: Зорилтот объектыг шийдвэрлэх боломжгүй: null

Энэ нь алдааг олж илрүүлэх, засахад туслах мэдээлэл биш юм. Гэсэн хэдий ч тогтолцоо нь алдаатай зөв харьцдаг. Чи санаж байна уу DOMFaultListener, та үүнийг элементийн утга болгон зааж өгсөн алдаа сонсогч? Түүний тоглолтонд орох цаг нь болсон. Алдаа гарсан тохиолдолд объектыг буцаана Алдаа DOM (Баримт бичгийн объектын загвар) агуулсан org.w3c.dom.Elementалдааны талаарх дэлгэрэнгүй мэдээлэлтэй. Эхлээд эх коддоо импортын илэрхийлэл нэмнэ үү java.util.Iterator:

java.net.URL импортлох; java.util.Enumeration оруулах; java.util.Hashtable импортлох; java.util.Iterator импортлох; java.util.Vector импортлох; org.apache.soap.Constants импортлох; import org.apache.soap.Fault; import org.apache.soap.SOAPException; import org.apache.soap.encoding.SOAPMappingRegistry; org.apache.soap.encoding.soapenc.BeanSerializer импортлох; import org.apache.soap.rpc.Call; org.apache.soap.rpc.Parameter импортлох; import org.apache.soap.rpc.Response; org.apache.soap.util.xml.QName-г импортлох;

Одоо list() аргын алдааг зохицуулах өөрчлөлтүүдийг хийцгээе:

if (!response.generatedFault()) ( Параметр returnValue = response.getReturnValue(); Hashtable каталог = (Hashtable)returnValue.getValue(); Тооцоолол e = catalog.keys(); while (e.hasMoreElements()) ( String гарчиг = (Мөр)e.nextElement(); CD cd = (CD)catalog.get(гарчиг); System.out.println(" "" + cd.getTitle() + "" уран бүтээлч " + cd.getArtist() + " studios " + cd.getLabel()); ) ) else ( Алдаа = answer.getFault(); System.out.println("Алдаа: " + fault.getFaultString()); Вектор оруулгууд = fault.getDetailEntries(); for (Iterator i = enries.iterator(); i.hasNext();) ( org.w3c.dom.Element entry = (org.w3c.dom.Element)i.next(); System.out.println(entry) .getFirstChild().getNodeValue()); ) )

Арга ашиглах getDetailEntries()Та SOAP үйлчилгээ болон асуудлыг дэмжих түүхий мэдээллийн серверт хандах боломжтой. Код нь тэдгээрийг дахин боловсруулдаг (ихэвчлэн зөвхөн нэг элемент байдаг, гэхдээ энэ нь анхааралтай хандах шаардлагатай) бөгөөд DOM-ийг таслан зогсоодог. Бүрэлдэхүүн, оруулга бүрт агуулагдсан. Үндсэндээ энд таны ажиллаж байгаа XML байна:

SOAP-ENV:Server.BadTargetObjectURI Зорилтот зорилтыг шийдвэрлэх боломжгүй: null Энэ бол бидний хүсч буй зүйл юм!

Өөрөөр хэлбэл, Fault объект нь SOAP дугтуйны алдаа агуулсан хэсэгт хандах боломжийг танд олгоно. Нэмж дурдахад, Apache SOAP нь алдаа гарсан тохиолдолд Java стекийн ул мөрийг өгч, тэдгээрийг засахад шаардлагатай дэлгэрэнгүй мэдээллийг өгдөг. Элементийг саатуулж байна stackTraceболон зангилааны утгыг хэвлэх ТекстЭнэ элементээс таны үйлчлүүлэгч серверийн стекийн мөрийг хэвлэх боломжтой. Эдгээр өөрчлөлтүүдийг эмхэтгэж, үйлчлүүлэгчийг дахин эхлүүлснээр та дараах үр дүнг авах болно.

C:\javaxml2\build>java javaxml2.CDLister http://localhost:8080/soap/servlet/rpcr outer Одоогийн CD лавлахыг харна уу. Алдаа: Зорилтыг шийдэж чадахгүй байна: javaxml2.CDCatalog доторх javaxml2.CDCatalog.addCD(CDCatalog.java:24) доторх null java.lang.NullPointerException. (CDCatalog.java:14) java.lang.Class.newInstance0(Уугуул арга) дээр java.lang.Class.newInstance(Class.java:237)

Энэ нь тийм ч дээр биш, гэхдээ наад зах нь та онцгой тохиолдол гарсан гэсэн мэдээллийн зарим хэсгийг харж болно NullPointerExceptionтэр ч байтугай энэ асуудал гарсан серверийн ангиудын мөрийн дугаарыг олж мэдээрэй. Эдгээр сүүлийн үеийн өөрчлөлтүүдийн үр дүн нь алдаа засах асуудлын тодорхой дүр зургийг танд өгсөн. Та одоо серверийнхээ ангиудад алдаа байгаа эсэхийг шалгах хэрэгтэй. Тийм ээ, би бараг мартчихаж, үүнээс өмнө ангиа солихоо бүү мартаарай CDCatalogойлгомжтой болгох үүднээс санаатайгаар оруулсан алдаанаасаа салахын тулд!

  1. SMTP (эсвэл бүр Jabber) зэрэг бусад протоколууд дээр SOAP ажиллуулах талаар маш их ярьдаг. SOAP стандарт нь одоогоор үүнийг хангаагүй боловч ирээдүйд ижил төстэй боломжуудыг нэмж болно. Тиймээс, хэрэв та энэ сэдвээр идэвхтэй хэлэлцүүлэгтэй тулгарвал гайхах хэрэггүй.

Энэ нь юу вэ гэсэн асуултын талаар би ярихгүй вэб үйлчилгээмөн тэд яагаад хэрэгтэй вэ. Интернет дээр энэ сэдвээр маш олон нийтлэл байдаг. Би PHP дээр ямар ч вэб үйлчилгээнд үйлчлүүлэгч үүсгэх нь хичнээн энгийн болохыг товчхон харуулахыг хичээх болно.

Тохиргоо

Ашиглахад зориулагдсан САВАН php дээр та SOAP модулийг холбох хэрэгтэй (php5 түгээлтэд багтсан). Windows-д энэ нь энгийн байдлаар хийгддэг - та нэмэх хэрэгтэй (тухайлбал, энэ мөрийг зүгээр л тайлбарлаагүй тул энэ нь огт байхгүй байна) нэмэх хэрэгтэй. php.ini:
өргөтгөл = php_soap.dll

Хэрэв танд php модуль болгон суулгасан бол серверээ дахин эхлүүлэхээ бүү мартаарай.


WSDL баримтаас SOAP клиент үүсгэх

SOAP үйлчлүүлэгч үүсгэх нь ихэвчлэн дараах байдлаар тохиолддог WSDL баримт бичиг, энэ нь тодорхой вэб үйлчилгээг бүрэн дүрсэлсэн тодорхой форматтай XML баримт бичиг юм. WSDL-ийн талаарх дэлгэрэнгүй мэдээллийг би таныг W3C консорциумын вэб сайтаас лавлана уу - http://www.w3.org/TR/2005/WD-wsdl20-soap11-binding-20050510/.

Вэб үйлчилгээний үйлчлүүлэгчийг бий болгохын тулд таны мэдэх ёстой гол зүйл бол WSDL баримт бичгийн URL-ыг мэдэх явдал юм.
Жишээлбэл, xmethods.com сайтаас "Валютын ханш" вэб үйлчилгээг авч үзье. Валютын ханшийг онлайнаар авах боломжтой энэхүү вэб үйлчилгээний хаяг нь http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl юм.

Хоёрдахь чухал зүйл бол вэб үйлчилгээний тайлбараас энэ үйлчилгээ ямар аргуудыг өгдөг, ямар параметрүүдийг оролтын утга болгон дамжуулах ёстой талаар мэдээлэл авах шаардлагатай (ердийн PHP функц эсвэл ангиллыг дуудахтай маш төстэй). арга). Дүрмээр бол энэ мэдээлэл нь вэбсайт дээрх үйлчилгээний тайлбарт агуулагддаг. Валютын ханшийг олж авах манай вэб үйлчилгээ нь getRate() аргыг өгдөг бөгөөд үүнд валютын кодыг аргумент болгон дамжуулдаг.

Эцэст нь хэлэхэд, хариултын хувьд юу хүлээж байгааг мэдэх нь чухал: хэдэн утга, ямар төрөл гэх мэт. Үүнийг мөн тайлбараас авч болно.
Үүний үр дүнд код нь маш энгийн бөгөөд авсаархан, бараг энгийн зүйл болж хувирав.

// Вэб үйлчилгээг ашиглах
// xmethods.com сайтаас "Валютын ханш"

// WSDL баримтаас SOAP клиент үүсгэх
$client = new SoapClient("http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl");

// SOAP хүсэлт илгээж, үр дүнг хүлээн авна уу
$үр дүн = $client->getRate("бид", "орос");

Цуурай 'Одоогийн долларын ханш: ', $үр дүн, 'рубль';
?>

Кодоос харахад та WSDL баримтын URL-г SoapClient анги үүсгэгч рүү дамжуулж, хүссэн вэб үйлчилгээтэй ажиллах объектыг хүлээн авах хэрэгтэй. Дараа нь энэ объектын аргыг дууддаг бөгөөд түүний нэр нь вэб үйлчилгээний аргын нэртэй ижил байна. Энэ арга нь бидний хүссэн үр дүнг буцаана.

Тиймээс, энэ энгийн жишээ нь PHP дээр вэб үйлчилгээнд зориулсан SOAP клиентийг бий болгох зарчмыг харуулж байна. Гэсэн хэдий ч, бодит хэрэглүүр дээр анхаарах зүйл маш их байдаг, тухайлбал вэб үйлчилгээг дуудах үед энэ нь түр хугацаанд ажиллах боломжгүй эсвэл алдаа гаргаж болзошгүй. Энэ нь блок ашиглахыг тодорхой санал болгож байна оролдох/барих/шидэх :)

(PHP 5 >= 5.0.1)

SoapClient::SoapClient — SoapClient бүтээгч

Параметрүүд

wsdl

-ийн URI WSDLфайл эсвэл NULLажиллаж байгаа бол WSDL бусгорим.

Хөгжүүлэх явцад WSDL кэшийг ашиглах замаар идэвхгүй болгож болно soap.wsdl_cache_ttl php.ini тохиргоог хийхгүй бол WSDL файлд хийсэн өөрчлөлтүүд хүчингүй болно soap.wsdl_cache_ttlхугацаа нь дууссан.

сонголтууд

Сонголтуудын массив. Хэрэв WSDL горимд ажиллаж байгаа бол энэ параметр нь нэмэлт юм. WSDL бус горимд ажиллаж байгаа бол байршилболон uriсонголтуудыг тохируулах ёстой, хаана байршилнь хүсэлтийг илгээх SOAP серверийн URL юм uriнь SOAP үйлчилгээний зорилтот нэрийн орон зай юм.

The хэв маягболон ашиглахсонголтууд зөвхөн WSDL бус горимд ажилладаг. WSDL горимд тэдгээр нь WSDL файлаас ирдэг.

The савангийн_хувилбарсонголт нь SOAP 1.1 (анхдагч) эсвэл SOAP 1.2 үйлчлүүлэгчийг ашиглах эсэхийг заана.

HTTP баталгаажуулалтын хувьд нэвтрэхболон нууц үгсонголтуудыг итгэмжлэлээр хангахад ашиглаж болно. Прокси серверээр дамжуулан HTTP холболт хийхэд зориулсан сонголтууд прокси_хост, прокси_порт, proxy_loginболон прокси_нууц үгбас байдаг. HTTPS үйлчлүүлэгчийн гэрчилгээний баталгаажуулалтыг ашиглахын тулд орон нутгийн_сертболон нэвтрэх үгсонголтууд. Баталгаажуулалтыг дотор нь оруулж болно баталгаажуулалтсонголт. Баталгаажуулах арга нь аль аль нь байж болно САВАН_ГЭРЧИЛГЭЭНИЙ_ҮНДСЭН(анхдагч) эсвэл SOAP_AUTHENTICATION_DIGEST.

The шахалтЭнэ сонголт нь HTTP SOAP хүсэлт, хариултыг шахах боломжийг олгодог.

The кодчилолсонголт нь дотоод тэмдэгтийн кодчиллыг тодорхойлдог. Энэ сонголт нь SOAP хүсэлтийн кодчилолыг өөрчилдөггүй (энэ нь үргэлж utf-8 байдаг), харин мөрүүдийг түүнд хөрвүүлдэг.

The ул мөрСонголт нь хүсэлтийг хянах боломжийг олгодог бөгөөд ингэснээр алдааг буцааж хянах боломжтой. Энэ нь өгөгдмөл ХУДАЛ

The ангийн зурагтохируулгыг зарим WSDL төрлүүдийг PHP ангиудад буулгахад ашиглаж болно. Энэ сонголт нь WSDL төрлийн түлхүүр, PHP ангиудын нэрс бүхий массив байх ёстой.

Булианыг тохируулах ул мөрсонголт нь SoapClient->__getLastRequest, SoapClient->__getLastRequestHeaders, SoapClient->__getLastResponse болон SoapClient->__getLastResponseHeaders аргуудыг ашиглах боломжийг олгодог.

The үл хамаарах зүйлүүдсонголт нь савангийн алдаа нь SoapFault төрлийн үл хамаарах зүйлүүдийг хаях эсэхийг тодорхойлох логик утга юм.

The холболтын_хугацаасонголт нь SOAP үйлчилгээнд холбогдох хугацааг секундээр тодорхойлдог. Энэ сонголт нь удаан хариу үйлдэл үзүүлэх үйлчилгээний хугацааг тодорхойлдоггүй. Дуудлага дуустал хүлээх хугацааг хязгаарлахын тулд default_socket_timeout тохиргоог хийх боломжтой.

The бичгийн зурагсонголт нь төрлийн зураглалын массив юм. Төрөл зураглал нь товчлуур бүхий массив юм төрөл_нэр, type_ns(нэрийн зайны URI), from_xml(нэг мөр параметрийг хүлээн авах буцаан дуудлага) ба to_xml(нэг объектын параметрийг хүлээн авах буцаан дуудлага).

The cache_wsdlсонголт нь нэг юм WSDL_CACHE_NONE, WSDL_CACHE_DISK, WSDL_CACHE_MEMORYэсвэл WSDL_CACHE_BOTH.

The хэрэглэгчийн_агентсонголт нь ашиглах мөрийг зааж өгдөг Хэрэглэгч-агенттолгой.

The урсгалын_контекстсонголт нь контекстэд зориулагдсан .

The онцлогсонголт нь битийн маск юм САВАН_ГАНЦ_ЭЛЕМЕНТ_МАСИВ, САВАН_АШИГЛАХ_XSI_ARRAY_TYPE, САВАНГИЙГ_НЭГ_ЗАМ_ХҮЛЭЭ.

The амьд байхсонголт нь илгээх эсэхийг тодорхойлох логик утга юм Холболт: Амьд байлгахтолгой эсвэл Холболт: хаах .

Өөрчлөлтийн бүртгэл

Хувилбар Тодорхойлолт
5.4.0 Шинэ амьд байхсонголт.

Жишээ

Жишээ №1 SoapClient::SoapClient() жишээ

$client = new SoapClient("some.wsdl");

$client = new SoapClient ("some.wsdl" , array("soap_version" => SOAP_1_2 ));

$client = new SoapClient ("some.wsdl" , array("login" => "some_name" ,
"нууц үг" => "зарим_нууц үг" ));

$client = new SoapClient ("some.wsdl" , array("proxy_host" => "localhost",
"proxy_port" => 8080 ));

$client = new SoapClient ("some.wsdl" , array("proxy_host" => "localhost",
"прокси_порт" => 8080,
"proxy_login" => "зарим_нэр" ,
"proxy_password" => "зарим_нууц үг" ));

$client = new SoapClient ("some.wsdl" , array("local_cert" => "cert_key.pem" ));

$client = new SoapClient (null , array("байршил" =>
"uri" => "http://test-uri/" ));

$client = new SoapClient (null , array("location" => "http://localhost/soap.php" ,
"uri" => "http://test-uri/" ,
"хэв маяг" => SOAP_BOCUMENT ,
"хэрэглэх" => SOAP_LITERAL ));

$client = new SoapClient("some.wsdl",
массив("шахалт" => САВАН_ШААХ_ХҮЛЭЭН АВАХ | САВАН_ШААХ_GZIP ));

$server = new SoapClient ("some.wsdl" , массив("кодлох" => "ISO-8859-1" ));

анги MyBook(
нийтийн $ гарчиг;
нийтийн $ зохиогч ;
}

$server = new SoapClient ("books.wsdl" , array("classmap" => array("ном" => "MyBook" )));

?>

Крис Гунавардена

Unix серверээс гарч буй SOAP дуудлагыг хянахын тулд:

Sudo tcpdump -nn -vv -A -s 0 -i eth0 dst эсвэл src хост xxx.xxx.xxx.xxx болон порт 80

Мөн үргэлж "cache_wsdl" => WSDL_CACHE_NONE хэрэглээрэй

svenr at selfhtml dot org

"Classmap" сонголт нь үнэндээ SOAP-д хэрэглэгддэг "ComplexType"-ээс таны PHP Ангиудын зураглал юм.

Таны хүсэлтээр буцаасан XML шошгоны нэрийг эдгээр ComplexTypes-тэй андуурч болохгүй. SOAP нь тэднийг өөр өөр байхыг зөвшөөрдөг.

Надад ийм зүйл байсан:
...


FooBar

TagName нь таны ангийн зурагт оруулахыг хүссэн түлхүүр биш бөгөөд та энэ TagName-д хамаарах ComplexType-ийн нэрийг мэдэх ёстой. Энэ мэдээлэл нь WSDL нөөцөд агуулагддаг.

paulovitorbal at gmail dot com

Сертификат ашиглахдаа "local_cert" параметрт файлын нэрийг биш харин файлын агуулгыг ашиглана уу.

Шинэ soapclient("http://localhost/index.php?wsdl ", массив("local_cert"=>file_get_contents("./key.pem"),"passphrase"=>"нууц үг"));

PHP-д та өөрийн ангийн зурагт ашигладаг ангиудад тодорхойлогдсон хувийн шинж чанаруудтай байж болно. Тэгэхээр хэрэв та ангидаа $foo хувийн өмчийг үүсгэсэн бол SOAP элемент нь хүүхэд элементтэй байна , $foo-н агуулгыг агуулгад тохируулна . Ингэснээр та ангийнхаа өмчид хандах хандалтыг хянах боломжтой.

(Тэмдэглэл: Энэ нь Facebook-ийн HPHP дээр ажиллахгүй).

willem dot stuursma at hyves dot nl

Хэрэв та ангиудыг ангийн газрын зургийн өөр нэрийн орон зайд ашиглахыг хүсвэл зорилтот ангийн нэрэнд урвуу зураасыг ашиглана уу.

Жишээ:
$classmap = массив("үр дүн" => "Миний нэрийн орон зай\\Үр дүн");
?>

Та арын ташуу зураасыг хоёр удаа зааж өгөх хэрэгтэй, учир нь энэ нь мөр дэх зугтах тэмдэг юм.

simonlang at gmx dot ch

Прокси ашиглан HTTP баталгаажуулалттай саван клиентийн жишээ:

шинэ SoapClient(
"service.wsdl",
массив(
// Хөгжүүлэх зүйлс.
"trace" => 1 ,
"exceptions" => үнэн,
"cache_wsdl" => WSDL_CACHE_NONE,
"онцлогууд" => SOAP_SINGLE_ELEMENT_ARRAYS ,

// SOAP хүсэлтийн баталгаажуулалтын үнэмлэх.
"нэвтрэх" => "хэрэглэгчийн нэр" ,
"нууц үг" => "нууц үг" ,

// Прокси url.
"proxy_host" => "example.com" , // Энд схемийг нэмж болохгүй (http эсвэл https). Энэ ажиллахгүй.
"прокси_порт" => 44300,

// Проксины баталгаажуулах үнэмлэх.
"proxy_login" => NULL,
"proxy_password" => NULL,
);
?>
Алсын сервер дээрх WSDL файлд URL оруулах (энэ нь мөн HTTP баталгаажуулалтаар хамгаалагдсан) ажиллахгүй байна. Би WSDL-г татаж аваад дотоод сервер дээр хадгалсан.

Асаф Меллер

Бүрэн ажиллаж байгаа php .net савангийн тохиргоо:
тэмдэглэл
1. .net сервер дээрх web.config нь basichttp холболттой ажиллах ёстой.
2. савангийн функцүүдийн параметрүүдийг дараах байдлаар дамжуулах ёстой.
массив("parm1_name"=>"parm1_value",
"parm2_name"=>"parm2_value"...)

толгой("Агуулгын төрөл: текст/энгийн");

Оролдоод (
$сонголт = массив(
"soap_version" => SOAP_1_1 ,
"exceptions" => үнэн,
"trace" => 1 ,
"cache_wsdl" => WSDL_CACHE_NONE
);
$client = шинэ SoapClient ( "http://www.example.com/end_point.wsdl", $ сонголтууд);

) барих (Үл хамаарах $e) (
цуурай "

Онцгой алдаа!

" ;
echo $e -> getMessage();
}

Echo "HelloWorld ажиллуулж байна:" ;

Оролдоод (
$response = $client -> HelloWorld();

}
барих (Үл хамаарах $e)
{
echo "Баригдсан онцгой тохиолдол: " , $e -> getMessage (), "\n" ;
}

Хэвлэх_r($хариу);
?>
амжилт хүсье!
Асаф.

faebu at faebu dot ch

Үндсэн http нэвтрэлт танилтаар хамгаалагдсан WDSL файлыг ачаалах гэж оролдох үед би ижил асуудалтай тулгараад байна, учир нь нэвтрэх болон нууц үг нь зөвхөн хүсэлтэд зориулагдсан боловч wdsl файлыг унших үед биш юм. xml файлыг миний серверийн хамгаалалтгүй байршилд оруулах. Энэ нь ямар ч төрлийн кэшийг дэмждэггүйг анхаарна уу.

анги SoapAuthClient SoapClient-ийг өргөтгөх (
/**
* PHP SOAP багц нь үндсэн баталгаажуулалтыг дэмждэггүй
* энэ анги нь cURL багц болон ашиглан WDSL файлыг татаж авдаг
* таны сервер дээр wdsl-ийн локал хуулбарыг үүсгэдэг.
*Та дараах нэмэлт параметрийг оруулсан эсэхээ шалгаарай
* $optionsArray:
* wdsl_local_copy => үнэн
*/

Хувийн $cache_dir = "/home/example/htdocs/cache/" ;
хувийн $cache_url = "http://www.example.com/cache/";

SoapAuthClient функц ($wdsl, $options) (
хэрэв (isset($options [ "wdsl_local_copy" ]) &&
$сонголтууд [ "wdsl_local_copy" ] == үнэн &&
isset($ сонголт [ "нэвтрэх" ]) &&
isset($ сонголт [ "нууц үг" ])) (

$ файл = md5 (uniqid ()). ".xml";

Хэрэв (($fp = fopen ($this -> cache_dir . $file , "w" )) == худал ) (
шинэ онцгой тохиолдол гаргах ( "Орон нутгийн WDSL файлыг үүсгэж чадсангүй (". $this -> cache_dir. $файл. ")");
}

$ch = curl_init();
$credit = ($сонголтууд["нэвтрэх"]. ":" . $сонголтууд["нууц үг" ]);
curl_setopt($ch, CURLOPT_URL, $wdsl);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt ($ch, CURLOPT_USERPWD, $credit);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt ($ch, CURLOPT_FILE, $fp);
хэрэв (($xml = curl_exec ($ch )) === худал ) (
//curl_close($ch);
fclose($fp);
салгах ($ this -> cache_dir . $file );

Шинэ Exception шидэх(curl_error($ch));
}

Curl_close($ch);
fclose($fp);
$wdsl = $this -> cache_url. $файл;
}

Тохируулаагүй($сонголтууд [ "wdsl_local_copy" ]);
тохируулаагүй($ сонголт [ "wdsl_force_local_copy" ]);

Echo $wdsl;
эцэг эх :: __construct ($wdsl, $Options);

Салга ($this -> cache_dir . $file );
}
}
?>

gmail цэг com дахь tatupheba

Сайн уу хүмүүсээ!

Хөгжүүлэгчид зориулсан зөвлөмж:

Зарим савангийн серверийг програмчлахдаа php.ini файл дахь "soap.wsdl_cache_enabled" зааврыг 0 болгож тохируулна уу:

Soap.wsdl_cache_enabled=0

Үгүй бол таны wsdl буруу эсвэл байхгүй байна гэсэн хачирхалтай алдаанууд гарч ирнэ.

Ингэж чадвал хэрэггүй олон зовлонгоос аврах болно.

phpdevshell dot org дахь титан

Хэрэв та буцах алдаа хүлээн авбал "Объектийн лавлагаа объектын жишээнд тохируулагдаагүй байна" гэдгийг тэмдэглэх нь зүйтэй. Энэ нь буруу параметрүүдийг дамжуулах гэх мэт энгийн зүйлтэй холбоотой байж болох юм. Та энэ XML-г харахад:



мөр
он сар өдөр цаг
он сар өдөр цаг

Таны код иймэрхүү харагдах ёстой:

оролдох (
$сонголт = массив(
"soap_version" => SOAP_1_2 ,
"exceptions" => үнэн,
"trace" => 1 ,
"cache_wsdl" => WSDL_CACHE_NONE
);
$client = шинэ SoapClient ( "http://example.com/doc.asmx?WSDL", $ сонголтууд);
// XML-ийн "Get" болон "request" шошго хаана байгааг анхаарна уу
$results = $client -> Get (array("request" =>array("CustomerId" => "1234" )));
) барих (Үл хамаарах $e) (
цуурай "

Онцгой алдаа!

" ;
echo $e -> getMessage();
}

$results = $client -> Get (array("request" =>array("CustomerId" => "842115" )));
?>

Хэрэв таны WSDL файлд base64Binary төрлийн параметр байгаа бол савангийн хувилбаруудыг дамжуулахдаа base64_encode()-г ашиглах ёсгүй. Хүсэлтийг хийх үед SOAP номын сан base64 автоматаар таны өгөгдлийг кодчилдог тул өөрөөр хэлбэл та үүнийг хоёр удаа кодлох болно.

WSDL хэсэг:

$string = "Саван доторх_xml шиг_илгээхийг_хүссэн_өгөгдлөө";
$soap_data = массив(
"foo" => "бар",
//"content" => base64_encode($string) // үүнийг бүү хий
"content" => $string //үүнийг хий
);
$response = $client -> Илгээх ($саван_өгөгдөл);
?>

hotmail цэг ком дээр marcovtwout

SOAP-д шинэ хүн учраас миний мессеж яагаад soapUI-д хариу ирж байгааг мэдэхийн тулд хэсэг хугацаанд хайж байсан боловч миний php кодоор биш. Миний хандаж байсан тусгай үйлчилгээ HTTP 202-г амжилттайгаар хүлээн зөвшөөрсөн (хариу байхгүй) өгдөг боловч алдааны тухай SOAP мессежийг буцаадаг.

Нөхцөл байдал:
(Баталгаажсан) үйлчлүүлэгчийн холболт болон WDSL файлыг ашиглан "Нэг арга зам" төрлийн SOAP дуудлага нь хариу хүлээгдэж байгаа ч хариултын толгой хэсгийг өгдөггүй.

Шийдэл:
Үйлчлүүлэгчийг дуудахдаа $options["features"] хэсэгт SOAP_WAIT_ONE_WAY_CALLS-г тохируулна уу.

tim tdinternet dot com дээр

PHP 5.2.11 нь WSDL-ийн зөв байдлын талаар тийм ч сонгомол биш юм шиг санагддаг.

Бусад SOAP үйлчлүүлэгчид схем болон нэрийн орон зайн асуудлын талаар гомдоллож байсан бол PHP-ийн SoapClient нь бүрэн хэвийн ажиллаж байсан. Харин бусад үйлчлүүлэгчдэд эдгээр асуудлыг зассан нь PHP-ийн SoapClient-ийг эвдэж, SOAP арга руу дамжуулж буй объектууд дээр хоосон массив болж хувирсан. сервер тал.

Сургамж: зарим элементүүдийг xsd угтвартай байсан бол зарим нь тийм биш байсан -- таны WSDL зөв бөгөөд тууштай байгаа эсэхийг шалгаарай (би өөрчилсөн WSDL_Gen.php ашиглаж байна).

Жеймс дот эллис gmail цэг ком дээр

Би Coldfusion SOAP серверээс хариулт авахад асуудалтай байсан бөгөөд ашигласан SoapClient-д тодорхой асуудал байхгүй.

Эцэст нь би сервер SOAP 1.1 хүсэлтийг хүлээж авдаг болохоос 1.2 биш гэдгийг олж мэдсэн. Энэ нь системийн өргөн цар хүрээтэй Coldfusion тохиргоо мөн эсэхийг сайн мэдэхгүй байна, гэхдээ хэрэв та ижил хананд хүрсэн бол SoapClient сонголтыг "soap_version"-г тогтмол SOAP_1_1 (энэ нь өгөгдмөл боловч минийх 1.2 болгож, үйлчлүүлэгч өөр үйлчилгээнд дахин ашиглагдаж байсан) тохируулж үзнэ үү. )

ajcartmell болон fonant dot com

PHP-ийн сүүлийн хувилбаруудад (5.2.9-с хойшхи хувилбар, 5.2.11-тэй тэнцүү эсвэл түүнээс өмнөх хувилбар) proxy_host болон proxy_port сонголтуудын хоосон мөрүүдийг зааж өгөхөд асуудал гарсан бололтой.

Proxy_host болон proxy_port-ын хоосон мөрийн утгыг оруулах нь "хост олдоогүй" төрлийн алдаа үүсгэдэг: NULL эсвэл FALSE оруулах нь сайн ажилладаг.

bhargav dot khatana at gmail dot com

WSSE (Вэб үйлчилгээний аюулгүй байдал) толгойг эх PHP SOAP дээр хэрхэн хэрэгжүүлэх талаар олж мэдэхэд долоо хоногоос илүү хугацаа зарцуулсан. Энэ талаар олон эх сурвалж байхгүй тул олон нийтэд ашигтай байх үүднээс энд нэмж оруулахыг бодлоо.

Алхам 1: WSSE толгойн бүтцийг бий болгохын тулд хоёр анги үүсгэ

анги clsWSSEAuth(
хувийн $Хэрэглэгчийн нэр;
хувийн $Нууц үг;
функц __ бүтэц ($ хэрэглэгчийн нэр, $ нууц үг) (
$this -> Хэрэглэгчийн нэр = $хэрэглэгчийн нэр;
$энэ -> Нууц үг = $нууц үг;
}
}

Анги clsWSSEToken (
хувийн $UsernameToken;
функц __ бүтэц ($innerVal)(
$this -> UsernameToken = $innerVal;
}
}
?>
Алхам 2: Хэрэглэгчийн нэр болон нууц үгийн савангийн хувьсагчийг үүсгэ

$хэрэглэгчийн нэр = 1111 ;
$нууц үг = 1111;

//Үйлчилгээ үзүүлэгчээсээ ямар хамгаалалтын нэрийн орон зай ашиглаж байгааг шалгана уу.
$strWSSENS = "http://schemas.xmlsoap.org/ws/2002/07/secext";

$objSoapVarUser = шинэ SoapVar($хэрэглэгчийн нэр, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS);
$objSoapVarPass = шинэ SoapVar($нууц үг, XSD_STRING, NULL, $strWSSENS, NULL, $strWSSENS);
?>
Алхам 3: Auth Class-д зориулж Объект үүсгээд, саван дээр дамжуулна

$objWSSEAuth = шинэ clsWSSEAuth ($objSoapVarUser, $objSoapVarPass);
?>
Алхам 4: Auth ангийн объектоос SoapVar үүсгэнэ үү

$objSoapVarWSSEAuth= шинэ SoapVar ($objWSSEAuth , SOAP_ENC_OBJECT , NULL , $strWSSENS , "UsernameToken" , $strWSSENS );
?>
Алхам 5: Токен ангиллын объект үүсгэх

$objWSSEToken = шинэ clsWSSEToken ($objSoapVarWSSEAuth);
?>
Алхам 6: Token ангийн объектоос SoapVar үүсгэнэ үү

$objSoapVarWSSEToken= шинэ SoapVar ($objWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, "UsernameToken", $strWSSENS);
?>
Алхам 7: "Аюулгүй байдлын" зангилаанд зориулж SoapVar үүсгэ

$objSoapVarHeaderVal=шинэ SoapVar ($objSoapVarWSSEToken, SOAP_ENC_OBJECT, NULL, $strWSSENS, "Аюулгүй байдал", $strWSSENS);
?>
Алхам 8: Хамгаалалтын савангаас толгойн объект үүсгэ

$objSoapVarWSSEHeader= шинэ SoapHeader ($strWSSENS , "Аюулгүй байдал" , $objSoapVarHeaderVal , үнэн , "http://abce.com");

//Гурав дахь параметр нь "mustUnderstand=1" болгодог
//Дөрөв дэх параметр нь "actor="http://abce.com ""-г үүсгэдэг.
?>
Алхам 9: Soap Client-ийн объект үүсгэх

$objClient = шинэ SoapClient ($WSDL, $arrOptions);
?>
Алхам 10: Soapclient объектын толгой хэсгийг тохируулна уу

$objClient -> __setSoapHeaders (массив($objSoapVarWSSEHeader ));
?>
Алхам 11: Арга руу эцсийн дуудлага

$objResponse = $objClient -> __soapCall ($strMethod, $requestPayloadString);
?>

peter on webacoustics dot com

Soapclient дээр үндсэн нэвтрэлт танилтыг ашиглах үед WSDL татаж авах ажиллагаа амжилтгүй болсныг би олж мэдсэн. Тиймээс би wget ашиглан дараах тоймыг хэрэгжүүлсэн. Зарим орчинд wget нь сонголт биш байж магадгүй, энэ тохиолдолд cURL нь дараагийн хамгийн энгийн зүйл байх болно гэдгийг би ойлгож байна.

$wsdl = get_wsdl ( "https://example.com/soap/service?wsdl");
$this -> client = new SoapClient ($wsdl , array("user" => "someuser" , "password" => "somepassword" ));

Get_wsdl хувийн функц ($url) (
дэлхийн $g;
$url = escapeshellarg($url);
$cache_file = "/tmp/soap.wsdl." . md5($url);

//зөвхөн цаг тутамд шинэ wsdl дуудна
if(! file_exists ($cache_file ) || filectime ($cache_file )< time () - 3600 ) {
$agent = escapeshellarg("--user-agent=($g["хэрэглэгч"])");
mwexec("wget ​​--quiet --timeout=5 ( $агент) --no-check-certificate --output-document=( $cache_file ) ( $url ) " );
хэрэв(! файл_байвал ($cache_file )) (
шинэ онцгой тохиолдол ("WSDL-г ( $url ) дээр ачаалж чадсангүй" );
}
}
буцах
$cache_file;
}
?>

meltir at meltir dot com

NTLM баталгаажсан прокси серверүүдтэй тулалдаж байгаа хүмүүст хандаж хэлэхэд миний ATM ашиглаж байгаа шийдэл энд байна:

/**
* ntlm прокси баталгаажуулалтыг дэмждэг SoapClient-ийн хүүхэд
*
* @ Зохиогч Мелтир
*
*/
NTLM_SoapClient анги нь SoapClient (

Нийтийн функц __construct ($wsdl, $options = массив()) (
хэрэв (хоосон($options [ "proxy_login" ]) || хоосон($options [ "proxy_password" ])) шинэ Үл хамаарах зүйл ( "NTLM баталгаажуулалтад нэвтрэх болон нууц үг шаардлагатай!");
$this -> proxy_login = $options [ "proxy_login" ];
$this -> proxy_password = $options [ "proxy_password" ];
$ this -> proxy_host = (хоосон($options [ "proxy_host" ]) ? "localhost": $ сонголт[ "прокси_хост"]);
$энэ-> прокси_порт= (хоосон($ сонголт[ "прокси_порт"]) ? 8080 : $ сонголт[ "прокси_порт"]);
эцэг эх:: __ барих($wsdl, $ сонголт);
}

/**
* Ntlm auth-тай curl ашиглан url руу залгана уу
*
* @param string $url
* @param string $data
* @ буцах мөр
* @ Curl холболтын алдаа дээр SoapFault шиддэг
*/
хамгаалагдсан функцcallCurl($url, $ өгөгдөл) {
$ бариул= curl_init();
curl_setopt($ бариул, CURLOPT_HEADER, худлаа);
curl_setopt($ бариул, CURLOPT_URL, $url);
curl_setopt($ бариул, CURLOPT_FAILONERROR, үнэн);
curl_setopt($ бариул, CURLOPT_HTTPHEADER,массив("PHP SOAP-NTLM үйлчлүүлэгч"));
curl_setopt($ бариул, CURLOPT_RETURNTRANSFER, үнэн);
curl_setopt($ бариул, CURLOPT_POSTFIELDS, $ өгөгдөл);
curl_setopt($ бариул, CURLOPT_PROXYUSERPWD, $энэ-> proxy_login. ":" . $энэ-> прокси_нууц үг);
curl_setopt($ бариул, CURLOPT_PROXY, $энэ-> прокси_хост. ":" . $энэ-> прокси_порт);
curl_setopt($ бариул, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
$хариу= curl_exec($ бариул);
хэрэв (хоосон (
$хариу)) {
шинэ шидэх
Савангийн алдаа("CURL алдаа:". буржгар_алдаа($ бариул), curl_errno($ бариул));
}
curl_close($ бариул);
буцах
$хариу;
}

Нийтийн чиг үүрэг __хүсэлт($ хүсэлт, $ байршил, $ үйлдэл, $ хувилбар, $ one_way= 0 ) {
буцах
$энэ-> callCurl($ байршил, $ хүсэлт);
}

}
?>

Curl шаарддаг бөгөөд сунгаж болно, гэхдээ энэ нь миний энгийн хэрэгцээнд нийцдэг.

eric dot caron on gmail dot com

"WSDL задлан шинжилдэг: олж чадсангүй" гэсэн нийтлэг эх сурвалж болох 27777-р алдаан дээр jan-ийн онцолсон санааг авч үзсэн. " алдаа нь HTTP нэвтрэлт танилтаар хамгаалагдсан WSDL-д хандах оролдлого юм. 2-р параметрт нэвтрэх/нууц үг оруулах нь үргэлж ажилладаггүй; Хэрэв та энэ алдааны мэдэгдэлтэй тулгараад, хамгаалагдсан WSDL файлд хандах гэж байгаа бол хэрэглэгчийн нэр, нууц үгээ эхний параметрээр оруулахыг оролдоно уу.

Нэргүй

Стандарт Parlay X вэб үйлчилгээг ашиглах гэж оролдохдоо би нэлээн хачирхалтай зан авиртай тэмцэж, амжилтгүй болсон. Гэсэн хэдий ч би өөрийнхөө асуудлыг шийдэх арга замыг олсон.

Миний тулгарсан асуудал бол вэб үйлчилгээ рүү илгээсэн алдаатай, буруу HTTP баталгаажуулалтын үндсэн хүсэлттэй холбоотой байв. Хэдийгээр би зөв итгэмжлэл илгээж байсан ч баталгаажуулалтын алдаа гарлаа. PHP нь вэб үйлчилгээгээр шууд харагдаагүй өөр төгсгөлийн цэг рүү HTTP хүсэлтийг илгээж байсан бөгөөд уг төгсгөлийн цэг нь баталгаажуулалт шаарддаггүй.

Энэ асуудлыг шийдэх арга бол sendSms Paraly-X аргыг ашиглах жишээн дээрх энгийн мөрүүдийг ашиглах явдал байв.

Нэгдүгээрт, ямар ч HTTP баталгаажуулалтын сонголтгүйгээр саван клиент үүсгэх:

$ үйлчлүүлэгч= шинэSoapClient($wsdl_url);
?>

Дээрх хүсэлт нь /tmp сан дахь wsdl-г кэш болгоно. Энэхүү бүтээн байгуулалтын дараа бид өөр нэг савангийн үйлчлүүлэгчийг үүсгэсэн бөгөөд энэ удаад HTTP баталгаажуулалтын сонголттой:

оролдох (
$ үйлчлүүлэгч= шинэSoapClient($wsdl_url, массив("нэвтрэх"=> "гриффин",
"нууц үг"=> "нууц үг"));
) барих (
Үл хамаарах зүйл $e) {
printf("Алдаа: sendSms: %s\n", $e-> __toString());
буцах
худлаа;
}
?>

Одоо энэ нь ямар ч асуудалгүйгээр ажиллах ёстой. Хоёрдахь дуудлага хийхгүй бол PHP нь итгэмжлэлгүйгээр sendSms руу залгах бөгөөд баталгаажуулалтын мэдээлэл дутуу байснаас бүтэлгүйтсэн оролдлого болно. Би энэ процедурыг хамгийн энгийн гэж үзсэн.

Энэ процессыг кэшд хадгалагдсан wsdl-н хугацаа дуусах бүрд хийх ёстой, эсвэл php.ini-с хадгалагдсан wsdl-ийн ажиллах хугацааг нэмэгдүүлэх боломжтой.

Жон Дот Гилберт at net-entwicklung dot de

Хүчингүй URL-д зориулж савангийн клиент үүсгэх нь (үйлчилгээ байхгүй үед юу тохиолдохыг шалгадаг, тийм ээ?) try..catch-д баригдаж болох онцгой тохиолдол гардаг гэдгийг анхаарна уу. Гэсэн хэдий ч, хэрэв xdebug идэвхтэй байвал танд маш аюултай алдаа гарах бөгөөд үүнийг барьж чадахгүй нь ойлгомжтой.

sloloem on gmail dot com

Ангийн газрын зургийн ашиглалтын талаар ярилцахад надад нэлээд удсан асуудал гарсан. Би баримт бичигт дурдсан WSDL төрлийг SOAP-д буцаасан элементийн нэр гэж таамаглаж байсан.

Тэгээд яагаад зураглал хийж байгаа юм бол гэж гайхаж байлаа
"classmap"=>array("node"=>"MyNode")

Юу ч хийгээгүй.
Учир нь би WSDL дээрээ зангилаа гэж тодорхойлсон:

Надад хэрэгтэй ангийн зураг нь:
"classmap"=>array("nodeType"=>"MyNode")

Би SoapClient->__getTypes() ашиглан төрлийн нэрийг олж чадсан.
Дараа нь би WSDL дотроос хэрэгтэй нэрээ хаанаас хайж болохыг ойлгосон.

Би ямар нэг зүйлийг алдсан эсэхийг мэдэхгүй ч магадгүй энэ нь зарим баримт бичгүүдийг арилгах болно.

Жон

Бид SoapClient-ийг Microsoft ISA (одоогоор 2006 оны хувилбар)-аар дамжуулан гадаад серверт холбоход зарим асуудалтай тулгарсан боловч энэ нь бусад хувилбаруудад ч хамаатай байж магадгүй юм. Бид proxy_host, proxy_port, proxy_login болон proxy_password-ыг нийлүүлдэг боловч ISA сервер нэвтрэлтийг өөрийн хаягаар мэдээлдэг. "Нэргүй" гэж бүртгэдэг.

Манай системийн админ үүнийг PHP нь NTLN мэдээллийг (Windows-ын аюулгүй байдлын протокол) зөв форматаар хангаагүйтэй холбоотой гэж үзэж байна (мөн энэ нь хувийн прокситэй ажиллах эсэх нь мэдээж өөр маргаан юм). Бид "хэрэглэгчийн нэр", "DOMAIN\хэрэглэгчийн нэр"-г оролдсонгүй. Энэ шийдэл нь зорилтот хостын нэр/IP-д ISA серверт үл хамаарах зүйл нэмэх явдал юм; дараа нь proxy_login болон proxy_password-д null-г оруулах боломжтой бөгөөд холболт ажиллах ёстой. хүссэнээр.

Бага зэрэг холбоотой тэмдэглэлд, хэрэв танд асуудал байгаа бол портын дугаарыг бүхэл тоогоор оруулсан эсэхийг шалгаарай. Хэрэв портын дугаарыг мөр хэлбэрээр өгсөн бол PHP-ийн зарим хувилбарууд SoapClient-тэй прокси ашиглахгүй.

jan at bestbytes dot de

Хэрэв та үндсэн баталгаажуулалт шаардлагатай бол wsdl авч болно:

$нэвтрэх = "берт";
$нууц үг= "berts нууц үг";

$ үйлчлүүлэгч= шинэSoapClient(
"http://". urlencode($нэвтрэх) . ":" . urlencode($нууц үг) . "@www.server.com/path/to/wsdl",
массив(
"нэвтрэх"=> $нэвтрэх,
"нууц үг"=> $нууц үг
)
);

?>

nicksilvestro dot net дээрх мэдээлэл

ArrayOf_xsd_string-тэй холбоотой асуудалтай байгаа болон "Масивын төрөл (http://www.w3.org/2001/XMLSchema) стрингэд зориулж deserializer тодорхойлогдоогүй"-тэй төстэй алдаа гарсан хэн бүхэнд зориулав.
"Онцлогууд" параметрийг SOAP_USE_XSI_ARRAY_TYPE гэж тохируулж үзнэ үү - энэ нь зөв deserializer ашигласан эсэхийг шалгана.

Жишээ нь,
$ үйлчлүүлэгч= шинэSoapClient("some.wsdl", массив("онцлогууд"=> САВАН_АШИГЛАХ_XSI_ARRAY_TYPE));
?>

мэргэн буудагч

Би сайн жишээ хайж байсан ч олж чадаагүй,
эцэст нь хаа нэгтээ олсон (хаана гэдгийг мартчихаж) би үүнийг бодож байна
олон парамтай савангийн хүсэлт гаргах хамгийн сайн жишээ

$params->AWSAccessKeyId = AMAZON_API_KEY;
$params->Request->SearchIndex = "Номууд";
$params->Хүсэлт->Түлхүүр үг = "php5 oop";

$amazon = new SoapClient("http://webservices.amazon.com
/AWSECommerceService/AWSECommerceService.wsdl");
$үр дүн = $amazon->itemSearch($params);

reutone таслал дээр алекс

PHP SOAP-г MS SOAP (CRM/EXCHANGE/...)-тэй холбохын тулд би доорх тайлбарыг ашиглан зарим ангиудыг үүсгэсэн.
www.reutone.com/heb/articles.php?instance_id=62&action=show&id=521

naugtur on gmail dot com

SoapFault-н онцгой тохиолдол: бидэнд XML баримт бичиг байхгүй бололтой Таны сервер өмнө нь ямар нэгэн зүйл гаргавал тохиолддог гэж аль хэдийн дурдсан ... > шошго.

Учир нь үүнд асуудалтай байгаа бүх хүмүүс, басерверийн код руу нэвтрэх боломжгүй:
Энэ бол хариултуудыг цэвэрлэх прокси хийх арга юмтөлөөТа

php
/**
* Жеймс Эллисийн тэмдэглэлээс авсан энгийн хичээл
*/
ангиProxy_ClientсунгадагSoapClient{
хамгаалагдсан
$cacheDocument= "" ;
нийтийн чиг үүрэг
__ барих($wsdl, $ сонголт) {
эцэг эх:: __ барих($wsdl, $ сонголт);
}

/**
* SetCacheDocument() нь өмнө нь хадгалагдсан баримтын агуулгыг тохируулдаг
*/
нийтийн чиг үүрэгSetCacheDocument($баримт бичиг) {
$энэ-> кэш баримт= $баримт бичиг;
}

/**
* __doRequest() нь локал хүсэлтийг шийдвэрлэхийн тулд стандарт SoapClient-ийг дардаг
*/
нийтийн чиг үүрэг__хүсэлт() {
буцах
$энэ-> кэш баримт;
}
}

//Энэ кодыг өөрийн функц эсвэл шаардлагатай бүх хувьсагчийг тохируулсан газар болгонд оруулна уу

$ үйлчлүүлэгч= шинэSoapClient($wsdl_url, $settings_array);
$ хүчингүй= $ үйлчлүүлэгч-> $ арга($params); // серверээс хариу авахын тулд үүнийг дуудна уу

$response_string= $ үйлчлүүлэгч-> __getLastResponse();

//энэ хэсэг нь зүйлсийг устгадаг
$start= strpos($response_string, ");
$end= strrpos($response_string, ">" );
$response_string= дэд стр($response_string, $start, $end- $start+ 1 );

//прокси бэлдээрэй
$ прокси= шинэProxy_Client($wsdl_url, $settings_array);
//мөн серверийн хариултаар бөглөнө үү
$ прокси-> SetCacheDocument($response_string);

$болон_эцэст нь_үр дүн_болов= $ прокси-> $ арга($params);

хэвлэх_r($болон_эцэст нь_үр дүн_болов); // энэ нь танд юу байгааг харах боломжийг олгоно

?>

$method нь аргын нэр, жишээ нь. $method="getVersion";
$params - савангийн аргын ердийн параметрүүд