Bahasa Go ialah bahasa pengaturcaraan sumber terbuka, pantas dan ringan Ia menyokong konkurensi tinggi, berbilang benang, merentas platform dan ciri lain, jadi ia digunakan secara meluas dalam pembangunan rangkaian. Dalam kebanyakan kes, kita perlu berinteraksi dengan sistem lain melalui permintaan HTTP. Walau bagaimanapun, sesetengah sistem tidak menyokong protokol HTTP, tetapi menggunakan protokol SOAP (Simple Object Access Protocol). Jadi, bagaimana untuk menghantar permintaan SOAP dalam bahasa Go? Artikel ini akan memperkenalkan isu ini.
Pengetahuan prasyarat
Sebelum mula bercakap tentang cara menghantar permintaan SOAP, anda perlu memahami beberapa perkara pengetahuan yang diperlukan.
Protokol SOAP
SOAP ialah protokol berasaskan bahasa XML yang digunakan untuk bertukar-tukar data dalam persekitaran yang diedarkan. Ia mentakrifkan format mesej dan peraturan untuk penerangan dan komunikasi, membenarkan aplikasi menghantar dan menerima mesej melalui protokol seperti HTTP dan SMTP. Mesej SOAP terutamanya terdiri daripada tiga bahagian: sampul surat, pengepala dan badan.
Format mesej SOAP adalah seperti berikut:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <!-- 可选的头部信息 --> </soap:Header> <soap:Body> <!-- 实际数据 --> </soap:Body> </soap:Envelope>
Pustaka net/http bahasa Go
net/http ialah salah satu daripada standard perpustakaan yang disediakan oleh bahasa Go One, untuk mengendalikan permintaan dan respons HTTP. Melalui perpustakaan ini, kami boleh melaksanakan operasi rangkaian pelayan HTTP dan klien HTTP dengan mudah. Untuk permintaan HTTP, anda perlu memberi perhatian kepada parameter utama berikut:
Langkah-langkah untuk menghantar permintaan SOAP
Dengan pangkalan pengetahuan sebelumnya, kini kita boleh mempelajari langkah demi langkah cara menghantar permintaan SOAP dalam bahasa Go. Langkah-langkah khusus adalah seperti berikut:
Pertama, kita perlu mengesahkan alamat dan nombor port pelayan sasaran. Selepas menentukan maklumat ini, kami boleh membina URL permintaan.
Seterusnya, kami perlu mengesahkan kaedah permintaan SOAP dan meminta maklumat pengepala. Permintaan SOAP perlu merangkum data jenis dokumen XML ke dalam permintaan HTTP, jadi kami perlu menetapkan parameter seperti Content-Type dan SOAPAction dalam pengepala permintaan. Maklumat pengepala permintaan khusus perlu ditentukan mengikut dokumen antara muka.
Selepas mengesahkan kaedah permintaan dan meminta maklumat pengepala, kami perlu membina mesej permintaan. Mesej permintaan mengandungi semua elemen mesej SOAP: Sampul, Pengepala, Badan, dsb. Antaranya, kandungan dalam elemen Badan adalah data sebenar. Anda boleh menggunakan pengekodan/xml atau rentetan untuk membina mesej permintaan. Di sini kami menggunakan kaedah pengekodan/xml.
Selepas membina mesej permintaan, kami boleh menggunakan klien dalam perpustakaan net/http untuk menghantar permintaan. Kaedah khusus adalah seperti berikut:
resp, err := client.Do(req)
Antaranya, klien ialah klien HTTP dan req ialah permintaan HTTP. Kaedah Do digunakan untuk menghantar permintaan HTTP dan mengembalikan respons HTTP. Perlu diingatkan bahawa pelanggan perlu menutup sambungan selepas digunakan.
Akhir sekali, kami perlu mengendalikan respons HTTP. Ekstrak data sebenar daripada respons dan huraikannya. Di sini, kita perlu menentukan kandungan dan format data yang perlu diekstrak dan dihuraikan berdasarkan dokumen antara muka.
Kod Contoh
Di bawah, kami mengambil permintaan SOAP sebenar sebagai contoh untuk menunjukkan cara menggunakan bahasa Go untuk menghantar kod sampel permintaan SOAP. Di sini, kami menggunakan antara muka platform e-dagang, dengan sedikit pengubahsuaian pada situasi tertentu.
package main import ( "bytes" "encoding/xml" "fmt" "io/ioutil" "net/http" "os" ) type Envelope struct { XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` Header *Header `xml:",omitempty"` Body *Body } type Header struct { // 这里可以定义需要的头部信息 } type Body struct { XMLName xml.Name `xml:"Body"` Req *Req } type Req struct { XMLName xml.Name `xml:"http://www.example.com/ OrderRequest"` Order *Order } type Order struct { XMLName xml.Name `xml:"Order"` // 这里定义Order元素的子元素 } func main() { // 确认目标地址 url := "http://example.com/path/to/server" // 确认请求方法和请求头部信息 soapAction := "http://www.example.com/OrderRequest" contentType := "text/xml;charset=utf-8" // 构建请求消息 order := &Order{ // 这里为Order元素的子元素赋值 } req := &Req{ Order: order, } body := &Body{ Req: req, } envelope := &Envelope{ Body: body, } data, err := xml.Marshal(envelope) if err != nil { fmt.Println("marshal error:", err) os.Exit(1) } // 发送请求 client := &http.Client{} reqBody := bytes.NewBuffer(data) req, err := http.NewRequest("POST", url, reqBody) if err != nil { fmt.Println("create request error:", err) os.Exit(1) } req.Header.Set("Content-Type", contentType) req.Header.Set("SOAPAction", soapAction) resp, err := client.Do(req) if err != nil { fmt.Println("send request error:", err) os.Exit(1) } defer resp.Body.Close() // 处理响应 respBody, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("read response body error:", err) os.Exit(1) } // 这里对respBody进行解析,提取需要的数据 }
Ringkasan
Menghantar permintaan SOAP dalam bahasa Go mungkin agak menyusahkan, tetapi selagi kami memahami beberapa pengetahuan asas dan langkah berjaga-jaga, kami boleh menyelesaikan permintaan itu dengan lancar. Titik pengetahuan ini amat penting apabila anda perlu mengakses antara muka yang hanya menyokong protokol SOAP. Saya harap artikel ini dapat memberi manfaat kepada pembaca.
Atas ialah kandungan terperinci Cara minta sabun di golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!