
本文旨在解决go语言中发送soap xml请求时遇到的http 401 unauthorized错误。我们将详细介绍如何利用`net/http`包的`setbasicauth`方法,通过http basic authentication机制在请求中携带凭据,从而成功访问需要认证的soap服务。教程将提供完整的代码示例和关键步骤解析,帮助开发者构建健壮的认证请求。
在Go语言中与SOAP服务进行交互时,一个常见的问题是遇到HTTP 401 Unauthorized错误,这通常意味着请求没有提供有效的认证信息。对于大多数需要认证的HTTP服务,特别是那些使用HTTP Basic Authentication的服务,我们需要在请求中明确地设置认证头。本教程将详细阐述如何在Go语言中构建一个包含HTTP Basic Auth的SOAP XML请求。
在Go的标准库net/http中,http.Post函数是一个便捷的封装,用于发送POST请求。然而,它只接受URL、内容类型和请求体,并没有直接提供设置认证凭据的参数。当目标服务要求认证时,仅仅使用http.Post会导致请求被服务器拒绝,返回401状态码。
例如,原始代码中尝试直接使用http.Post:
r, _ := http.Post("http://mywebsite.com.br/service.svc?wsdl", "text/xml", body)这种方式无法在请求头中加入认证信息,因此无法通过需要认证的SOAP服务验证。
立即学习“go语言免费学习笔记(深入)”;
为了在Go中发送带有HTTP Basic Authentication的请求,我们需要更细粒度地控制请求的构建过程。这包括以下几个关键步骤:
下面是一个完整的Go程序,演示如何通过HTTP Basic Auth发送SOAP XML请求:
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
// 1. 定义SOAP XML请求体
soapXML := `<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ClientGetByGuid xmlns="http://tempuri.org/">
<guid>fc40a874-2902-4539-b8e7-6aa7084644ec</guid>
</ClientGetByGuid>
</soap:Body>
</soap:Envelope>`
// 2. 将XML字符串转换为字节缓冲区
requestBody := bytes.NewBufferString(soapXML)
// 3. 定义目标URL、用户名和密码
url := "http://mywebsite.com.br/service.svc?wsdl" // 替换为你的SOAP服务URL
username := "your_username" // 替换为你的用户名
password := "your_password" // 替换为你的密码
// 4. 创建一个新的HTTP请求
req, err := http.NewRequest("POST", url, requestBody)
if err != nil {
log.Fatalf("创建请求失败: %v", err)
}
// 5. 设置HTTP Basic Authentication
req.SetBasicAuth(username, password)
// 6. 设置Content-Type头部,对于SOAP通常是text/xml
req.Header.Set("Content-Type", "text/xml")
// 根据SOAP版本,可能需要设置SOAPAction头,例如:
// req.Header.Set("SOAPAction", "http://tempuri.org/ClientGetByGuid")
// 7. 创建HTTP客户端并发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Fatalf("发送请求失败: %v", err)
}
defer resp.Body.Close() // 确保关闭响应体
// 8. 读取并打印响应
fmt.Printf("HTTP 状态码: %d %s\n", resp.StatusCode, resp.Status)
responseBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("读取响应体失败: %v", err)
}
fmt.Println("响应体:")
fmt.Println(string(responseBody))
// 9. 检查响应状态码
if resp.StatusCode != http.StatusOK {
log.Printf("请求未成功,状态码: %d", resp.StatusCode)
}
}
通过本教程,我们学习了如何在Go语言中解决SOAP XML请求的HTTP 401 Unauthorized问题。核心在于使用http.NewRequest创建请求,并通过SetBasicAuth方法添加HTTP Basic Authentication凭据。掌握这些技术将帮助你更有效地与需要认证的SOAP服务进行交互,构建更加健壮和安全的Go应用程序。
以上就是Go语言中实现HTTP Basic Auth的SOAP XML请求的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号