Golang实现HTTP Basic认证发送SOAP请求

Golang实现HTTP Basic认证发送SOAP请求

本文旨在解决go语言中发送soap xml请求时遇到的http 401未授权问题。我们将详细介绍如何利用go标准库的`net/http`包,通过创建自定义请求并设置http basic认证来成功发送带有凭据的soap请求,确保服务端正确授权并返回预期响应。

引言:Go语言中SOAP请求的认证挑战

在Go语言中与采用SOAP协议的服务进行通信时,开发者常会遇到HTTP 401 Unauthorized错误。这通常意味着客户端在发送请求时未能提供有效的身份验证凭据,或者提供的凭据不正确。对于需要HTTP Basic认证的SOAP服务,直接使用http.Post等简便函数往往不足以满足认证需求,因为它没有直接暴露设置认证信息的接口。解决这一问题的关键在于,需要更精细地控制HTTP请求的构建过程,手动添加认证头部信息。

HTTP Basic认证原理与Go语言实现

HTTP Basic认证是一种简单的认证机制,客户端将用户名和密码以username:password的格式组合,然后进行Base64编码,并将其作为Authorization头部的值发送到服务器。服务器接收到请求后,解码此值并验证凭据。

在Go语言中,net/http包提供了强大的功能来构建和发送自定义HTTP请求,从而轻松实现HTTP Basic认证。核心步骤包括:

创建HTTP请求对象:使用http.NewRequest函数创建一个*http.Request实例,而不是直接使用http.Post。这允许我们完全控制请求的各个方面,包括头部、方法和请求体。设置Basic认证信息:*http.Request对象提供了一个便捷的方法SetBasicAuth(username, password string)。调用此方法会自动将用户名和密码进行Base64编码,并将其添加到请求的Authorization头部,格式为Basic 。发送请求:创建*http.Client实例,并使用其Do方法执行我们自定义的请求。http.Client负责处理底层的网络通信,包括连接管理、重定向等。

实践:带有Basic认证的SOAP请求

下面我们将通过一个具体的例子,演示如何在Go语言中发送一个带有HTTP Basic认证的SOAP XML请求。

立即学习“go语言免费学习笔记(深入)”;

1. 构建SOAP XML请求体

首先,我们需要准备SOAP请求的XML内容。这通常是一个符合SOAP Envelope规范的XML字符串。

Otter.ai Otter.ai

一个自动的会议记录和笔记工具,会议内容生成和实时转录

Otter.ai 91 查看详情 Otter.ai

package mainimport (    "bytes"    "fmt"    "io/ioutil"    "log"    "net/http")func main() {    // SOAP XML请求体    soapXML := []byte(`            fc40a874-2902-4539-b8e7-6aa7084644ec      `)    // 目标SOAP服务URL和认证凭据    url := "http://mywebsite.com.br/service.svc?wsdl" // 替换为实际的SOAP服务URL    username := "your_username"                       // 替换为实际的用户名    password := "your_password"                       // 替换为实际的密码    // ... 后续代码}

2. 创建并配置HTTP请求

接下来,使用http.NewRequest创建POST请求,并将SOAP XML作为请求体。然后调用SetBasicAuth方法添加认证信息,并设置Content-Type头部,这对于SOAP请求至关重要。

    // ... 前面代码    // 1. 创建HTTP请求对象    req, err := http.NewRequest("POST", url, bytes.NewBuffer(soapXML))    if err != nil {        log.Fatalf("创建HTTP请求失败: %v", err)    }    // 2. 设置HTTP Basic认证    req.SetBasicAuth(username, password)    // 3. 设置Content-Type头部,SOAP请求通常是"text/xml"或"application/soap+xml"    // 注意:某些SOAP服务可能需要指定charset,例如 "text/xml; charset=utf-8"    req.Header.Set("Content-Type", "text/xml; charset=utf-8")    // ... 后续代码

3. 发送请求与处理响应

最后,创建http.Client实例来执行请求,并处理服务端的响应。

    // ... 前面代码    // 4. 创建HTTP客户端并发送请求    client := &http.Client{} // 可以配置超时等参数,例如: &http.Client{Timeout: 10 * time.Second}    resp, err := client.Do(req)    if err != nil {        log.Fatalf("发送HTTP请求失败: %v", err)    }    defer resp.Body.Close() // 确保在函数结束时关闭响应体    // 5. 检查响应状态码    if resp.StatusCode != http.StatusOK {        log.Printf("HTTP请求失败,状态码: %d", resp.StatusCode)        responseBody, _ := ioutil.ReadAll(resp.Body) // 即使失败也尝试读取响应体,可能包含错误信息        log.Fatalf("响应体: %s", string(responseBody))    }    // 6. 读取并打印响应体    responseBody, err := ioutil.ReadAll(resp.Body)    if err != nil {        log.Fatalf("读取响应体失败: %v", err)    }    fmt.Println("SOAP响应:")    fmt.Println(string(responseBody))}

完整示例代码

将上述步骤整合,形成一个完整的Go程序:

package mainimport (    "bytes"    "fmt"    "io/ioutil"    "log"    "net/http"    // "time" // 如果需要设置客户端超时)func main() {    // 1. 构建SOAP XML请求体    soapXML := []byte(`            fc40a874-2902-4539-b8e7-6aa7084644ec      `)    // 目标URL和认证信息    url := "http://mywebsite.com.br/service.svc?wsdl" // 替换为实际的SOAP服务URL    username := "your_username"                       // 替换为实际的用户名    password := "your_password"                       // 替换为实际的密码    // 2. 创建HTTP请求对象    // 使用http.NewRequest而不是http.Post,以便更精细地控制请求头和认证    req, err := http.NewRequest("POST", url, bytes.NewBuffer(soapXML))    if err != nil {        log.Fatalf("创建请求失败: %v", err)    }    // 3. 设置HTTP Basic认证    req.SetBasicAuth(username, password)    // 4. 设置Content-Type头,对于SOAP请求通常是"text/xml"    req.Header.Set("Content-Type", "text/xml; charset=utf-8") // 注意SOAP通常需要charset    // 5. 发送请求    client := &http.Client{} // 创建一个HTTP客户端,可以配置超时等    // client := &http.Client{Timeout: 10 * time.Second} // 例如,设置10秒超时    resp, err := client.Do(req)    if err != nil {        log.Fatalf("发送请求失败: %v", err)    }    defer resp.Body.Close() // 确保关闭响应体    // 6. 处理响应    if resp.StatusCode != http.StatusOK {        log.Printf("请求失败,状态码: %d", resp.StatusCode)        responseBody, _ := ioutil.ReadAll(resp.Body) // 尝试读取错误响应体        log.Fatalf("响应体: %s", string(responseBody))    }    responseBody, err := ioutil.ReadAll(resp.Body)    if err != nil {        log.Fatalf("读取响应体失败: %v", err)    }    fmt.Println("SOAP响应:")    fmt.Println(string(responseBody))}

注意事项与最佳实践

错误处理:在生产环境中,务必对err变量进行详尽的检查和处理,而不是简单地使用_忽略。示例代码中已加入了log.Fatalf来演示基本的错误处理。SOAP服务URL与凭证管理:示例中的url、username和password是占位符。在实际应用中,这些敏感信息应从配置文件、环境变量或安全的密钥管理服务中获取,避免硬编码。Content-Type头部:SOAP请求的Content-Type头部非常重要,必须与服务端的期望值匹配。常见的有text/xml或application/soap+xml,有时还需要指定字符集(如charset=utf-8)。SOAP客户端库:对于复杂的SOAP服务或需要处理WSDL的情况,可以考虑使用现有的Go语言SOAP客户端库(如gosoap等),它们通常能简化XML的序列化/反序列化和WSDL解析过程。本教程主要侧重于HTTP Basic认证的实现。安全性:HTTPS:强烈建议在生产环境中使用HTTPS来加密传输过程,保护认证凭据和数据内容不被窃听。HTTP Basic认证本身发送的是Base64编码的凭据,而非加密的凭据,因此在HTTP上使用并不安全。HTTP客户端配置:http.Client可以进行多种配置,例如设置请求超时时间(Timeout)、自定义传输层(Transport)等,以适应不同的网络环境和性能需求。

总结

通过net/http包的http.NewRequest和Request.SetBasicAuth方法,Go语言开发者可以灵活地构建并发送带有HTTP Basic认证的SOAP XML请求,有效解决401 Unauthorized错误。掌握这一技巧是进行Go语言SOAP客户端开发的基础,确保应用程序能够安全、可靠地与需要认证的SOAP服务进行交互。在实际项目中,结合良好的错误处理、凭证管理和安全性考虑,可以构建出健壮的SOAP客户端。

以上就是Golang实现HTTP Basic认证发送SOAP请求的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1113870.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
vertical-align属性失效?图片垂直居中失败的根本原因是什么
上一篇 2025年12月2日 13:42:54
动漫花园资源网怎么获取资源_动漫花园资源网如何获取动画
下一篇 2025年12月2日 13:43:04

相关推荐

  • 续航一般多久够用?友望洗地机:长续航+强性能,全屋清洁“一劳永逸”

    续航一般多久够用?友望洗地机:长续航+强性能,全屋清洁“一劳永逸”续航一般多久够用?友望洗地机:长续航+强性能,全屋清洁“一劳永逸”续航一般多久够用?友望洗地机:长续航+强性能,全屋清洁“一劳永逸”续航一般多久够用?友望洗地机:长续航+强性能,全屋清洁“一劳永逸”

    在家庭清洁场景中,洗地机凭借高效省力的特点,正逐步成为现代家庭的清洁“主力军”。然而面对琳琅满目的产品型号,消费者仍有不少疑问:洗地机究竟适合多大面积的空间?选购时应重点关注哪些功能?续航时间多久才够用?今天,我们将从真实用户需求出发,结合友望最新推出的大头pro洗地机,深入解析这些常见问题。 一、…

    2026年9月28日 • 用户投稿
    200
  • 如何在 Android 中保存动态创建的复选框状态

    如何在 Android 中保存动态创建的复选框状态如何在 Android 中保存动态创建的复选框状态如何在 Android 中保存动态创建的复选框状态如何在 Android 中保存动态创建的复选框状态

    本文介绍了如何在 Android 应用中保存动态创建的复选框的状态,以便用户在重新打开应用或界面后,复选框的选中状态能够保持不变。我们将探讨使用 SharedPreferences 来持久化复选框状态的方法,并提供示例代码帮助你理解和实现。 使用 SharedPreferences 持久化复选框状态…

    2026年9月28日 • 用户投稿
    000
  • 如何在Android中保存动态创建的CheckBox的状态

    如何在Android中保存动态创建的CheckBox的状态如何在Android中保存动态创建的CheckBox的状态如何在Android中保存动态创建的CheckBox的状态如何在Android中保存动态创建的CheckBox的状态

    本文旨在帮助开发者解决在Android应用中动态创建的CheckBox的状态保存问题。通过利用Shared Preferences,我们可以有效地存储CheckBox的选中状态,确保用户在重新进入应用或页面时,CheckBox的状态能够被正确恢复,从而提供更佳的用户体验。本文将提供详细的步骤和示例代…

    2026年9月28日 • 用户投稿
    100
  • 第五代高通骁龙8至尊版正式发布:全球最快移动SoC

    第五代高通骁龙8至尊版正式发布:全球最快移动SoC第五代高通骁龙8至尊版正式发布:全球最快移动SoC第五代高通骁龙8至尊版正式发布:全球最快移动SoC第五代高通骁龙8至尊版正式发布:全球最快移动SoC

    在今日举行的骁龙峰会上,高通正式发布了其最新旗舰移动平台——第五代骁龙 8 至尊版(Snapdragon 8 Elite Gen 5),并宣称该芯片为“全球速度最快的移动 SoC”。 此次发布的芯片基于台积电最新的第三代3nm N3P工艺打造,在CPU架构上采用了全新的Oryon核心设计,延续了2+…

    2026年9月28日 • 用户投稿
    000
  • Perplexity AI比Google好吗 与传统搜索引擎对比

    Perplexity AI比Google好吗 与传统搜索引擎对比Perplexity AI比Google好吗 与传统搜索引擎对比Perplexity AI比Google好吗 与传统搜索引擎对比Perplexity AI比Google好吗 与传统搜索引擎对比

    perplexity ai 的最大优势在于对话式搜索与实时检索的结合,能自然理解提问意图并提供结构化答案,适合快速获取信息;2. google 在全面性、稳定性与权威性方面仍占优势,适合深度调研和查找权威资料;3. 两者使用体验各有侧重,perplexity ai 提升效率,google 保障内容深…

    2026年9月28日 • 用户投稿
    100
  • 作业帮App如何搜索试卷进行模拟考试练习_作业帮App试卷练习的系统化操作教程

    作业帮App如何搜索试卷进行模拟考试练习_作业帮App试卷练习的系统化操作教程作业帮App如何搜索试卷进行模拟考试练习_作业帮App试卷练习的系统化操作教程作业帮App如何搜索试卷进行模拟考试练习_作业帮App试卷练习的系统化操作教程作业帮App如何搜索试卷进行模拟考试练习_作业帮App试卷练习的系统化操作教程

    首先进入作业帮App,点击底部【发现】进入后选择【试卷】模块,通过筛选年级、科目和考试类型或搜索关键词查找目标模拟卷,随后可在线答题提交查看解析,或下载PDF打印后线下练习并用拍照搜题核对答案。 如果您想在作业帮App中查找试卷进行模拟考试练习,但找不到入口或操作流程不清晰,则可能是由于功能路径更新…

    2026年9月28日 • 用户投稿
    200
  • Java中ArrayList引用传递陷阱:避免数据意外修改的策略

    Java中ArrayList引用传递陷阱:避免数据意外修改的策略Java中ArrayList引用传递陷阱:避免数据意外修改的策略Java中ArrayList引用传递陷阱:避免数据意外修改的策略Java中ArrayList引用传递陷阱:避免数据意外修改的策略

    本文探讨了Java中ArrayList作为引用类型在对象构造时可能导致的数据意外修改问题。当将同一个ArrayList实例传递给多个对象后,对该列表的后续操作(如清空或添加元素)会影响所有引用它的对象。核心解决方案是为每个需要独立数据副本的对象,实例化一个新的ArrayList,从而确保数据隔离和一…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么处理gbk编码的文件不乱码_Sublime正确打开GBK编码文件不乱码的设置

    sublime怎么处理gbk编码的文件不乱码_Sublime正确打开GBK编码文件不乱码的设置sublime怎么处理gbk编码的文件不乱码_Sublime正确打开GBK编码文件不乱码的设置sublime怎么处理gbk编码的文件不乱码_Sublime正确打开GBK编码文件不乱码的设置sublime怎么处理gbk编码的文件不乱码_Sublime正确打开GBK编码文件不乱码的设置

    安装ConvertToUTF8插件可解决Sublime Text打开GBK文件乱码问题,该插件能自动识别并转换编码,确保文件正确显示且保存时保留原编码,同时建议设置默认编码为UTF-8、备用编码为GBK,并通过项目配置或团队规范统一编码,避免后续乱码。 Sublime Text在处理GBK编码文件时…

    2026年9月28日 • 用户投稿
    100
  • 豆包AI如何实现图像识别?教你搭建计算机视觉模型

    豆包AI如何实现图像识别?教你搭建计算机视觉模型豆包AI如何实现图像识别?教你搭建计算机视觉模型豆包AI如何实现图像识别?教你搭建计算机视觉模型豆包AI如何实现图像识别?教你搭建计算机视觉模型

    豆包ai本身不直接提供图像识别模型训练功能,但可结合第三方工具实现。1. 准备数据集:收集高质量、多样化的图像并划分训练集与验证集,或使用公开数据集。2. 搭建模型结构:采用迁移学习方法,选用resnet等预训练模型,调整输出层并加入防止过拟合的机制,豆包ai可生成代码框架。3. 训练与调参:设置合…

    2026年9月28日 • 用户投稿
    100
  • 武侠世界起航指南:从萌新到高手的全章节精要攻略

    武侠世界起航指南:从萌新到高手的全章节精要攻略武侠世界起航指南:从萌新到高手的全章节精要攻略武侠世界起航指南:从萌新到高手的全章节精要攻略武侠世界起航指南:从萌新到高手的全章节精要攻略

    踏入江湖的第一步,如何走稳走远?这份深度章节指南助你精准规划,避开弯路,高效解锁绝世武功与隐藏机缘! 第一章:初入江湖 – 筑基破局 核心目标: 击败管家 + 两名教头(新手战力检验) 与张风对话并切磋取胜(开启江湖路) 隐藏门派的钥匙(散人必看): 在朱宇处习得一气功(基础内功)!这是…

    2026年9月28日 • 用户投稿
    000
  • Android动态复选框状态持久化:SharedPreferences实践指南

    Android动态复选框状态持久化:SharedPreferences实践指南Android动态复选框状态持久化:SharedPreferences实践指南Android动态复选框状态持久化:SharedPreferences实践指南Android动态复选框状态持久化:SharedPreferences实践指南

    本教程详细阐述了如何在Android应用中持久化动态创建的复选框状态。通过利用SharedPreferences这一轻量级数据存储机制,我们能够确保用户在勾选或取消勾选动态生成的复选框后,其状态即使在应用重启或Activity重建后也能得以保留。文章将提供具体的代码示例和实现步骤,帮助开发者构建更具…

    2026年9月28日 • 用户投稿
    000
  • 笔尖AI语音识别不灵敏:灵敏度调整与方言适配技巧

    笔尖AI语音识别不灵敏:灵敏度调整与方言适配技巧笔尖AI语音识别不灵敏:灵敏度调整与方言适配技巧笔尖AI语音识别不灵敏:灵敏度调整与方言适配技巧笔尖AI语音识别不灵敏:灵敏度调整与方言适配技巧

    笔尖ai语音识别不灵敏可通过调整灵敏度、优化环境设置、进行方言适配等方式解决。首先,检查设置中的语音识别选项,通过滑块或数值逐步提高或降低灵敏度,根据使用场景选择合适的配置文件,并确保麦克风位置正确或更换高质量麦克风;其次,进行方言适配时,先检查语言设置是否有方言选项,若无则可自定义词汇并建立方言与…

    2026年9月28日 • 用户投稿
    000
  • sublime怎么配置go语言环境_Sublime Text搭建Go语言开发环境指南

    sublime怎么配置go语言环境_Sublime Text搭建Go语言开发环境指南sublime怎么配置go语言环境_Sublime Text搭建Go语言开发环境指南sublime怎么配置go语言环境_Sublime Text搭建Go语言开发环境指南sublime怎么配置go语言环境_Sublime Text搭建Go语言开发环境指南

    答案是安装Go工具链并配置环境变量,再通过Sublime Text安装插件实现开发环境搭建。需先安装Go并设置GOPATH、GOROOT及bin目录到PATH,再在Sublime中安装如GoSublime等插件以支持自动补全、语法检查与编译运行功能。 在Sublime Text中配置Go语言开发环境…

    2026年9月28日 • 用户投稿
    000
  • Safari浏览器无法播放视频怎么回事_Safari浏览器网页视频播放问题排查与修复

    Safari浏览器无法播放视频怎么回事_Safari浏览器网页视频播放问题排查与修复Safari浏览器无法播放视频怎么回事_Safari浏览器网页视频播放问题排查与修复Safari浏览器无法播放视频怎么回事_Safari浏览器网页视频播放问题排查与修复Safari浏览器无法播放视频怎么回事_Safari浏览器网页视频播放问题排查与修复

    首先检查网络连接,确保Wi-Fi信号良好或切换至蜂窝数据;清除Safari缓存与网站数据;关闭内容拦截器;调整隐私设置如关闭“阻止跨站跟踪”;确认网站使用https/http协议且视频格式兼容;必要时重置网络设置以解决深层配置问题。 如果您在使用 Safari 浏览器时遇到网页视频无法播放的问题,可…

    2026年9月28日 • 用户投稿
    000
  • ChatSonic 创作 SEO 文案?关键词嵌入指令技巧​

    ChatSonic 创作 SEO 文案?关键词嵌入指令技巧​ChatSonic 创作 SEO 文案?关键词嵌入指令技巧​ChatSonic 创作 SEO 文案?关键词嵌入指令技巧​ChatSonic 创作 SEO 文案?关键词嵌入指令技巧​

    要写出高质量、能排名的 seo 文案,不能只依赖 chatsonic,还需掌握关键词嵌入技巧并对内容进行深度加工。1. 明确目标关键词与长尾关键词,专注几个核心词;2. 在 prompt 中明确指定关键词及出现位置,如标题、段首段尾等,但避免堆砌;3. 对生成内容进行润色,使其更自然流畅,并加入个人…

    2026年9月28日 • 用户投稿
    100
  • 支付宝双十一花呗临时额度怎么开通_支付宝11.11花呗临时额度开通

    支付宝双十一花呗临时额度怎么开通_支付宝11.11花呗临时额度开通支付宝双十一花呗临时额度怎么开通_支付宝11.11花呗临时额度开通支付宝双十一花呗临时额度怎么开通_支付宝11.11花呗临时额度开通支付宝双十一花呗临时额度怎么开通_支付宝11.11花呗临时额度开通

    支付宝双十一期间可通过参与“马上提额”活动、领取限时额度券、完成信用任务或转入余额宝资金四种方式提升花呗临时额度,具体操作包括点击翻倍按钮、领取系统发放的额度券、提交公积金社保记录等材料审核通过后获取提额资格。 如果您在备战双十一购物节时发现花呗额度不足,支付宝通常会推出限时活动为用户提供花呗临时额…

    2026年9月28日 • 用户投稿
    100
  • VSCode如何集成Git版本控制 VSCode中Git操作的便捷技巧

    首先确认git已安装并配置好用户名和邮箱;2. vscode通常自动检测git,若未检测到可手动在设置中指定git.path;3. 在vscode中打开项目并使用内置终端运行git init初始化仓库;4. 通过左侧源代码管理图标暂存、提交和推送更改;5. 遇到提交乱码时将files.encodin…

    2026年9月28日
    200
  • 和豆包一样的ai图片生成工具2025推荐top10

    2025年AI图片生成工具选择多样,boardmix因支持文生图、图生图、AI抠图、多种风格及在线协作,适合初学者与团队使用,且提供免费版,成为易用性高、功能全面的优选之一。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 2025年,想找个…

    2026年9月28日
    000
  • 拼多多官网入口直接打开 拼多多网页版不用登录

    拼多多官网入口直接打开 拼多多网页版不用登录拼多多官网入口直接打开 拼多多网页版不用登录拼多多官网入口直接打开 拼多多网页版不用登录拼多多官网入口直接打开 拼多多网页版不用登录

    拼多多官网可通过浏览器直接访问https://www.pinduoduo.com,无需下载App即可浏览商品,支持扫码登录、拼团购物、限时秒杀及百亿补贴活动,网页版界面简洁,分类清晰,具备关键词搜索与筛选功能,未登录也可查看商品详情,便于比价;平台覆盖多品类商品,设有专题推荐,提升选购效率,且网页端…

    2026年9月28日 • 用户投稿
    000
  • 豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法

    豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法豆瓣APP怎么看小组里自己的帖子_小组内个人发帖查找方法

    通过个人主页动态可直接查看按时间倒序排列的小组发帖与回复;2. 在小组内使用搜索功能输入用户名或关键词筛选个人发帖;3. 借助爱豆搜等外部工具输入ID和关键词高效检索历史帖子。 如果您在豆瓣小组中发布了多个帖子,但无法快速找到自己之前的发言记录,可能是因为缺少直接的“我的帖子”聚合功能。以下是几种在…

    2026年9月28日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信