Golang で SOAP をリクエストする方法

PHPz
リリース: 2023-04-25 13:39:27
オリジナル
792 人が閲覧しました

Go 言語は、オープンソースの高速かつ軽量のプログラミング言語であり、高い同時実行性、マルチスレッド、クロスプラットフォームなどの機能をサポートしているため、ネットワーク開発で広く使用されています。ほとんどの場合、HTTP リクエストを通じて他のシステムと対話する必要があります。ただし、一部のシステムは HTTP プロトコルをサポートせず、SOAP プロトコル (Simple Object Access Protocol) を使用します。では、Go 言語で SOAP リクエストを送信するにはどうすればよいでしょうか?この記事ではこの問題について紹介します。

前提知識

SOAP リクエストの送信方法について説明する前に、いくつかの必要な知識ポイントを理解する必要があります。

SOAP プロトコル

SOAP は、分散環境でデータを交換するために使用される XML 言語ベースのプロトコルです。メッセージの形式と説明と通信のルールを定義し、アプリケーションが HTTP や SMTP などのプロトコルを介してメッセージを送受信できるようにします。 SOAP メッセージは主に、エンベロープ、ヘッダー、ボディの 3 つの部分で構成されます。

  • envelope: SOAP メッセージのルート要素。すべてのメッセージ要素が含まれます。
  • ヘッダー: オプション。セキュリティ情報など、実際のデータに関係のない情報を渡すために使用されます。
  • body: 実際に送信されたデータが含まれます。

SOAP メッセージの形式は次のとおりです。

<?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>
ログイン後にコピー

Go 言語の Net/http ライブラリ

net/http は、Go 言語の標準ライブラリの 1 つです。 Go 言語。HTTP リクエストとレスポンスを処理するために使用されます。このライブラリを通じて、HTTP サーバーと HTTP クライアントのネットワーク操作を簡単に実装できます。 HTTP リクエストの場合、次の重要なパラメータに注意する必要があります。

  • URL: リクエストのターゲット アドレス。
  • メソッド: GET、POST、PUT、DELETE などのリクエスト メソッド。
  • Headers: Content-Type、User-Agent などのリクエスト ヘッダー情報。
  • 本文: 要求された実際のデータ。

SOAP リクエストを送信する手順

以前のナレッジ ベースを使用して、Go 言語で SOAP リクエストを送信する方法を段階的に学習できます。具体的な手順は次のとおりです。

  • ターゲット アドレスの確認

まず、ターゲット サーバーのアドレスとポート番号を確認する必要があります。この情報を決定したら、リクエスト URL を構築できます。

  • リクエストメソッドとリクエストヘッダの確認

次に、SOAPリクエストメソッドとリクエストヘッダ情報を確認する必要があります。 SOAP リクエストでは、XML ドキュメント タイプのデータを HTTP リクエストにカプセル化する必要があるため、リクエスト ヘッダーに Content-Type や SOAPAction などのパラメータを設定する必要があります。具体的なリクエストヘッダ情報はインターフェースドキュメントに従って決定する必要があります。

  • リクエストメッセージの構築

リクエストメソッドとリクエストヘッダー情報を確認したら、リクエストメッセージを構築する必要があります。リクエスト メッセージには、SOAP メッセージのすべての要素 (エンベロープ、ヘッダー、本文など) が含まれています。このうち、Body 要素の内容が実際のデータです。エンコーディング/xml または文字列を使用してリクエスト メッセージを構築できます。ここでは、encoding/xml メソッドを使用します。

  • リクエストの送信

リクエスト メッセージを作成したら、net/http ライブラリのクライアントを使用してリクエストを送信できます。具体的な方法は以下の通りです。

resp, err := client.Do(req)
ログイン後にコピー

このうち、clientはHTTPクライアント、reqはHTTPリクエストです。 Do メソッドは、HTTP 要求を送信し、HTTP 応答を返すために使用されます。使用後、クライアントは接続を閉じる必要があることに注意してください。

  • 応答の処理

最後に、HTTP 応答を処理する必要があります。応答から実際のデータを抽出し、解析します。ここでは、インターフェイス ドキュメントに基づいて抽出および解析する必要があるデータの内容と形式を決定する必要があります。

サンプルコード

以下では、実際のSOAPリクエストを例として、Go言語を使用してSOAPリクエストを送信する方法のサンプルコードを示します。ここでは、特定の状況に少し変更を加えて、電子商取引プラットフォームのインターフェイスを使用しています。

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进行解析,提取需要的数据
}
ログイン後にコピー

まとめ

Go 言語で SOAP リクエストを送信するのは少し面倒かもしれませんが、基本的な知識と注意事項を理解していれば、問題なくリクエストを完了できます。これらの知識ポイントは、SOAP プロトコルのみをサポートするインターフェイスにアクセスする必要がある場合に特に重要です。この記事が読者のお役に立てれば幸いです。

以上がGolang で SOAP をリクエストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!