在Go语言开发中,对接需要HTTP Basic Auth认证的SOAP服务是常见需求,SOAP请求基于XML格式传输数据,结合HTTP协议的认证机制即可完成安全调用。

核心实现思路
实现该需求主要分为三个步骤:构造符合要求的SOAP请求XML内容,设置HTTP Basic Auth认证头,发送HTTP POST请求并处理响应。HTTP Basic Auth的原理是将用户名和密码拼接后用Base64编码,放入请求头的Authorization字段中。
完整代码示例
以下代码演示了完整的实现过程,包含请求构造、认证设置、请求发送和响应解析:
package main
import (
"encoding/base64"
"fmt"
"io/ioutil"
"net/http"
"strings"
)
func main() {
// SOAP请求体内容,根据实际接口要求修改
soapBody := `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetUserInfo xmlns="http://tempuri.org/">
<userId>1001</userId>
</GetUserInfo>
</soap:Body>
</soap:Envelope>`
// SOAP服务地址
soapURL := "http://ipipp.com/soap/userService"
// HTTP Basic Auth的用户名和密码
username := "test_user"
password := "test_pass_123"
// 创建HTTP请求
req, err := http.NewRequest("POST", soapURL, strings.NewReader(soapBody))
if err != nil {
fmt.Println("创建请求失败:", err)
return
}
// 设置SOAP请求必须的Content-Type
req.Header.Set("Content-Type", "text/xml; charset=utf-8")
// 设置SOAPAction,部分接口需要该字段,根据实际接口要求修改或删除
req.Header.Set("SOAPAction", "http://tempuri.org/GetUserInfo")
// 构造Basic Auth认证头
authStr := username + ":" + password
encodedAuth := base64.StdEncoding.EncodeToString([]byte(authStr))
req.Header.Set("Authorization", "Basic "+encodedAuth)
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("发送请求失败:", err)
return
}
defer resp.Body.Close()
// 读取响应内容
respBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应失败:", err)
return
}
fmt.Println("响应状态码:", resp.StatusCode)
fmt.Println("响应内容:", string(respBody))
}
关键注意事项
- SOAP请求体的XML格式必须严格符合接口要求,标签命名空间、节点顺序错误都会导致请求失败。
- HTTP Basic Auth的用户名和密码是明文Base64编码,没有加密,生产环境建议配合HTTPS使用。
- 部分SOAP服务会要求设置
SOAPAction请求头,具体值参考接口文档,不需要的话可以删除该设置。 - 如果SOAP服务地址是本地测试地址,比如
127.0.0.1或192.168.0.1,不需要修改地址内容,直接使用即可。
响应处理扩展
如果返回的SOAP响应需要解析XML内容,可以使用Go的encoding/xml包定义对应的结构体,将响应字符串反序列化后获取具体字段值,避免手动处理XML字符串的繁琐操作。
Go语言HTTP_Basic_AuthSOAP请求HTTP请求修改时间:2026-07-01 06:06:22