Saya terbiasa menulis kode PHP, tetapi tidak sering menggunakan pengkodean Object-Oriented. Saya sekarang perlu berinteraksi dengan SOAP (sebagai klien) dan saya tidak bisa mendapatkan sintaks yang benar. Saya punya file WSDL yang memungkinkan saya untuk mengatur koneksi baru dengan benar menggunakan kelas SoapClient. Namun, saya tidak dapat benar-benar melakukan panggilan yang benar dan mendapatkan kembali data. Saya perlu mengirim data berikut (disederhanakan):
- ID kontak
- Nama Kontak
- Gambaran umum
- Jumlah
Ada dua fungsi yang didefinisikan dalam dokumen WSDL, tetapi saya hanya perlu satu ("FirstFunction" di bawah). Berikut ini skrip yang saya jalankan untuk mendapatkan informasi tentang fungsi dan tipe yang tersedia:
$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
Dan inilah output yang dihasilkannya:
array(
[0] => "FirstFunction Function1(FirstFunction $parameters)",
[1] => "SecondFunction Function2(SecondFunction $parameters)",
);
array(
[0] => struct Contact {
id id;
name name;
}
[1] => string "string description"
[2] => string "int amount"
}
Katakanlah saya ingin melakukan panggilan ke FirstFunction dengan data:
- ID Kontak: 100
- Nama Kontak: John
- Deskripsi Umum: Barel Minyak
- Jumlah: 500
Apa sintaks yang tepat? Saya sudah mencoba segala macam pilihan tetapi tampaknya struktur sabunnya cukup fleksibel sehingga ada banyak cara untuk melakukan ini. Tidak dapat menemukannya dari manual juga ...
PEMBARUAN 1: mencoba sampel dari MMK:
$client = new SoapClient("http://example.com/webservices?wsdl");
$params = array(
"id" => 100,
"name" => "John",
"description" => "Barrel of Oil",
"amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));
Tapi aku mendapatkan respons ini: Object has no 'Contact' property
. Seperti yang Anda lihat di output dari getTypes()
, ada yang struct
dipanggil Contact
, jadi saya kira saya entah bagaimana harus menjelaskan parameter saya termasuk data Kontak, tetapi pertanyaannya adalah: bagaimana?
UPDATE 2: Saya juga mencoba struktur ini, kesalahan yang sama.
$params = array(
array(
"id" => 100,
"name" => "John",
),
"Barrel of Oil",
500,
);
Sebaik:
$params = array(
"Contact" => array(
"id" => 100,
"name" => "John",
),
"description" => "Barrel of Oil",
"amount" => 500,
);
Kesalahan dalam kedua kasus: Objek tidak memiliki properti 'Kontak'`
Anda dapat menggunakan layanan SOAP dengan cara ini juga:
Ini adalah contoh dengan layanan nyata, dan berfungsi.
Semoga ini membantu.
sumber
Inisialisasi layanan web pertama kali:
Kemudian atur dan lewati parameter:
Perhatikan bahwa nama metode tersedia di WSDL sebagai nama operasi, misalnya:
sumber
Saya tidak tahu mengapa layanan web saya memiliki struktur yang sama dengan Anda tetapi tidak perlu Kelas untuk parameter, hanya array.
Misalnya: - WSDL saya:
Saya var_dump:
Ini hasilnya:
Jadi dalam kode saya:
tetapi berhasil!
sumber
Baca ini;-
http://php.net/manual/en/soapclient.call.php
Atau
Ini adalah contoh yang baik, untuk fungsi SOAP "__call". Namun itu sudah usang.
sumber
Pertama, gunakan SoapUI untuk membuat proyek sabun Anda dari wsdl. Cobalah untuk mengirim permintaan untuk bermain dengan operasi wsdl. Amati bagaimana permintaan xml menyusun bidang data Anda.
Dan kemudian, jika Anda mengalami masalah dalam mendapatkan tindakan SoapClient seperti yang Anda inginkan, inilah cara saya men-debug-nya. Setel opsi penelusuran sehingga fungsi __getLastRequest () tersedia untuk digunakan.
Kemudian variabel $ xml berisi xml yang dibuat oleh SoapClient untuk permintaan Anda. Bandingkan xml ini dengan yang dihasilkan di SoapUI.
Bagi saya, SoapClient tampaknya mengabaikan kunci array asosiatif $ params dan menafsirkannya sebagai array yang diindeks, menyebabkan data parameter yang salah dalam xml. Yaitu, jika saya menyusun ulang data dalam $ params , $ response sama sekali berbeda:
sumber
Jika Anda membuat objek dari SoapParam, ini akan menyelesaikan masalah Anda. Buat kelas dan petakan dengan tipe objek yang diberikan oleh WebService, Inisialisasi nilai dan kirim permintaan. Lihat contoh di bawah ini.
sumber
Saya memiliki masalah yang sama, tetapi saya hanya membungkus argumen seperti ini dan itu berhasil sekarang.
Menggunakan fungsi ini:
Anda dapat melihat XML Permintaan apakah itu berubah atau tidak tergantung pada argumen Anda.
Gunakan [trace = 1, pengecualian = 0] dalam opsi SoapClient.
sumber
Anda perlu mendeklarasikan Kontrak kelas
atau
Kemudian
atau
sumber
Anda memerlukan array multi dimensi, Anda dapat mencoba yang berikut:
dalam PHP array adalah struktur dan sangat fleksibel. Biasanya dengan panggilan sabun saya menggunakan pembungkus XML jadi tidak yakin apakah itu akan berhasil.
EDIT:
Apa yang mungkin ingin Anda coba adalah membuat kueri json untuk mengirim atau menggunakannya untuk membuat semacam pembelian xml mengikuti apa yang ada di halaman ini: http://onwebdev.blogspot.com/2011/08/php-converting-rss- to-json.html
sumber
Ada opsi untuk menghasilkan objek php5 dengan kelas WsdlInterpreter. Lihat lebih lanjut di sini: https://github.com/gkwelding/WSDLInterpreter
sebagai contoh:
sumber
getLastRequest ():
Metode ini hanya berfungsi jika objek SoapClient dibuat dengan opsi jejak diatur ke TRUE.
BENAR dalam hal ini diwakili oleh 1
bekerja untukku.
sumber