wordpress站群搭建6外部库的引入和测试

wordpress站群搭建6wordpress外部库的引入和测试

本次目标我们主要讲解引入wordpress外部库并测试。

我们将一些外部库和工具包放入到pkg项目,方便其他项目引用。

1.安装go-wordpress库

进入到pkg项目

go get github.com/robbiet480/go-wordpress

2.编写工具类

我们在添加station的时候,在之前的代码中我们有几个todo,现在我们将这几个todo进行处理。

// todo 校验wordpress账号密码// todo 加密密码// todo 自动获取服务器ip

pkg包下创建 wordpressutil目录,创建wordpressutil.go文件,编写 创建客户端和测试账号密码方法。

wordpressutil.go

package wordpressutilimport ("context""fmt""github.com/robbiet480/go-wordpress"
)// 创建wordpress客户端
func Client(DomainName string, Username string, Password string) (client *wordpress.Client, err error) {Url := fmt.Sprintf("%s/wp-json", DomainName)tp := wordpress.BasicAuthTransport{Username: Username,Password: Password,}// create wp-api clientclient, err = wordpress.NewClient(Url, tp.Client())if err != nil {return nil, err}return client, nil
}// 测试账号是否正确
func Test(DomainName string, Username string, Password string) error {client, err := Client(DomainName, Username, Password)if err != nil {return err}_, r, err := client.Users.Me(context.Background(), nil)if err != nil {return err}if r.StatusCode != 200 {return fmt.Errorf("账号验证失败")}return nil
}

3.编写测试类

编写完工具方法后我们需要对接方法进行测试。

测试之前我们需要先准备到wordpress账号密码

wordpressutil.go同级目录创建 wordpressutil_test.go文件。

测试类需要引入testing包,测试方法以Test开头,参数为*testing.T。下面是一个Test函数的典型定义

import "testing"
func Test_test(t *testing.T) {}

wordpressutil_test.go

package wordpressutilimport ("context""fmt""net/http""testing""github.com/robbiet480/go-wordpress"
)func getClient() (client *wordpress.Client, err error) {client, err = Client("https://xxx.com/wp-json/", "admin", "xxx")if err != nil {return nil, err}return client, nil
}// 测试Client函数
func Test_getClient(t *testing.T) {client, err := getClient()if err != nil {fmt.Println(err.Error())}media, resp, _ := client.Media.List(context.Background(), nil)if resp != nil && resp.StatusCode != http.StatusOK {t.Errorf("Expected 200 OK, got %v", resp.Status)}if len(media) < 1 {t.Fatalf("Should not return empty comments")}fmt.Println(media)
}// 测试Test函数
func Test12(t *testing.T) {err := Test("https://www.xxxxx.com/wp-json/", "gxx", "xxx")if err != nil {fmt.Println(err.Error())}
}// 测试Create_User函数
func Test_Create_User(t *testing.T) {client, err := getClient()if err != nil {fmt.Println(err.Error())}user, _, err := client.Users.Create(context.Background(), &wordpress.User{Username: "test", Email: "test@test.com"})if err != nil {fmt.Println(err.Error())}fmt.Println(user)
}

如果你使用vscode在测试函数旁边有个测试按钮,直接进行测试。其他的ide也是类型的操作。
test
右键点击有更多操作下拉.
debug

测试完成后们就可以在业务代码中使用了。使用时把 pkg/wordpressutilimport即可使用

4.编写其他工具类

有了上面的流程我们在引入下其他的工具类。由于涉及到密码所以我们存入数据库时需要进行加密,因此需要编写一个加密解密工具。

pkg包下创建 encryption目录,创建encryption.go文件

encryption.go

package encryptionimport ("crypto/aes""crypto/cipher""crypto/rand""crypto/sha256""encoding/base64""fmt""io"
)// AES加密函数
func AESEncrypt(plainText, key string) (string, error) {// 创建 AES 加密器block, err := aes.NewCipher(createHash(key))if err != nil {return "", err}// 使用 GCM 模式gcm, err := cipher.NewGCM(block)if err != nil {return "", err}// 创建 noncenonce := make([]byte, gcm.NonceSize())if _, err = io.ReadFull(rand.Reader, nonce); err != nil {return "", err}// 加密数据cipherText := gcm.Seal(nonce, nonce, []byte(plainText), nil)return base64.StdEncoding.EncodeToString(cipherText), nil
}// AES解密函数
func AESDecrypt(cipherText, key string) (string, error) {// 将密文解码data, err := base64.StdEncoding.DecodeString(cipherText)if err != nil {return "", err}// 创建 AES 解密器block, err := aes.NewCipher(createHash(key))if err != nil {return "", err}// 使用 GCM 模式gcm, err := cipher.NewGCM(block)if err != nil {return "", err}nonceSize := gcm.NonceSize()if len(data) < nonceSize {return "", fmt.Errorf("ciphertext too short")}// 解密nonce, cipherTextByte := data[:nonceSize], data[nonceSize:]plainText, err := gcm.Open(nil, nonce, cipherTextByte, nil)if err != nil {return "", err}return string(plainText), nil
}// 创建哈希函数
func createHash(key string) []byte {hash := sha256.New()hash.Write([]byte(key))return hash.Sum(nil)[:32] // AES-256 密钥需要32字节
}

encryption_test.go

package encryptionimport ("testing"
)func TestEncryption(t *testing.T) {res, err := AESEncrypt("hello", "12345678")if err != nil {t.Error(err)}t.Log(res)t.Log("---------------------")res, err = AESDecrypt(res, "12345678")if err != nil {t.Error(err)}t.Log(res)
}

同样的方式进行测试
test
iputil.go

package iputilimport ("errors""net""net/http""net/url""strings"
)func GetIP(r *http.Request) (string, error) {ip := r.Header.Get("X-Forwarded-For")for _, i := range strings.Split(ip, ",") {if net.ParseIP(i) != nil {return i, nil}}ip, _, err := net.SplitHostPort(r.RemoteAddr)if err != nil {return "", err}if net.ParseIP(ip) != nil {return ip, nil}return "", errors.New("no valid ip found")
}// 获取域名ip
func GetDomainIP(domain string) (string, error) {domain, err := extractDomain(domain)if err != nil {return "", err}ips, err := net.LookupIP(domain)if err != nil {return "", err}for _, ip := range ips {return ip.String(), err}return "", errors.New("no valid ip found")
}// 提取域名
func extractDomain(u string) (string, error) {if strings.Contains(u, "http") {parsedUrl, err := url.Parse(u)if err != nil {return "", err}return parsedUrl.Hostname(), nil}return u, nil
}

我们同样进行测试,这里就不直接复制出,大家可以自行测试练习。

5.业务代码调用

编写完工具类后,我们对之前业务代码中的todo 逻辑进行补全。

addstationlogic.go中我们在之前的todo处进行逻辑处理

addstationlogic.go

func (l *AddStationLogic) AddStation(in *types.StationInfo) (resp *types.StationInfoResp, err error) {//校验wordpress 账号密码err = wordpressutil.Test(in.DomainName, in.UserName, in.PassWord)if err != nil {return nil, err}// 加密密码pw, err := encryption.AESEncrypt(in.PassWord, l.svcCtx.Config.Secret.AESSecret)if err != nil {return nil, err}info := &station.StationInfo{Id:           in.Id,DomainName:   in.DomainName,DomainYear:   in.DomainYear,GoogleWeight: in.GoogleWeight,Type:         in.Type,Industry:     in.Industry,UserName:     in.UserName,PassWord:     pw,ArticlesNum:  in.ArticlesNum,Ip:           in.Ip,}// 自动获取服务器ipif info.Ip == "" {ip, _ := iputil.GetDomainIP(info.DomainName)info.Ip = ip}// 后的代码省略了
}

这样我们完成了外部公共库的引入和使用。

完整代码查询 6wordpress外部库的引入和测试 代码分支 。

5.总结

引入公共库,工具类时,我们可以对其进行测试。测试使用testing,通过测试我们可以快速验证工具能力。测试做的完善可以大大减少我们bug量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为的流程管理

华为建设流程体系始于2000年&#xff0c;那时华为公司面临着快速扩张和全球化发展的挑战&#xff0c;意识到传统的管理模式已经无法满足业务发展的需求。为了提高公司的管理效率和竞争优势&#xff0c;华为决定启动流程体系的建设。在建设过程中&#xff0c;华为借鉴了业界最佳…

Linux命令grep -R

1. Linux 命令grep -R 的基本用法如下。 功能&#xff1a;主要用来搜索指定目录下的所有文件是否包含某个文本等等。 特点: 递归查询. 2. 特殊发现 今天使用时发现&#xff0c;这个命令同样可以从.a&#xff0c;.so 等各种动静态库 搜索出文本&#xff0c; 缺点是没有没有列举…

橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码

源码名称&#xff1a;酷黑简洁大气体育直播自适应模板赛事直播门户网站 源码开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 带采集&#xff0c;可以挂着电脑上自动采集发布&#xff0c;无需人工操作&#xff01; 橙色简洁大气体育直播自适应模板赛事直播门户…

Redis的基本概念和使用

目录 一、Redis简介 1、NOSQL 2、NOSQL和关系型数据库比较 3、主流的NOSQL产品 4、什么是Redis 5、启动Redis 二、Redis基本操作 1、大概操作 三、 Redis 数据类型&#xff08;5种常用&#xff09; 1、redis 数据存储格式 2、String 3、hash 4、list 5、Set 6、…

音频剪辑软件哪个好用?五大音频剪辑软件分享

如果你正打算在家自学视频制作&#xff0c;那么恭喜你&#xff0c;你已经踏上了一段充满魔法与惊喜的旅程&#xff01;不过&#xff0c;别忘了&#xff0c;视频的灵魂不仅仅在于画面&#xff0c;更在于那直击心灵的音效。 想象一下&#xff0c;一个精心剪辑的片段&#xff0c;…

【设计模式】六大原则-下

❓首先什么是设计模式&#xff1f; &#x1f635;相信刚上大学的你和我一样&#xff0c;在学习这门课的时候根本不了解这些设计原则和模式有什么用处&#xff0c;反而不如隔壁的C更有意思&#xff0c;至少还能弹出一个小黑框&#xff0c;给我个hello world。 ✨ 如何你和我一样…

前端基础知识(一些基本标签的用法)

前端&#xff1a;html,css,javascript html:超文本结构化标记语言 使用角度 1、供显示的元素 2、供收集信息的元素 css层叠联样式单 选择器&#xff08;给谁做样式&#xff09; 盒子模型&#xff08;了解html元素内部结构&#xff09; 布局&#xff08;把元素进行摆布&a…

干货分享!渗透测试成功的8个关键

01 知道为什么要测试 执行渗透测试的目的是什么&#xff1f;是满足审计要求&#xff1f;是你需要知道某个新应用在现实世界中表现如何&#xff1f;你最近换了安全基础设施中某个重要组件而需要知道它是否有效&#xff1f;或者渗透测试根本就是作为你定期检查防御健康的一项例行…

ant design 的 tree 如何作为角色中的权限选择之一

这种功能如何弄呢&#xff1f; 编辑的时候要让权限能选中哦。 <ProForm.Item name"permissions" label{intl.formatMessage({ id: permission_choose })}><Spin spinning{loading}><TreecheckableonExpand{onExpand}expandedKeys{expandedKeys}auto…

Debug-021-el-table实现分页多选的效果(切换分页,仍可以保持前一页的选中效果)

前情提要&#xff1a; 这个功能实现很久了&#xff0c;但是一直没有留意如何实现&#xff0c;今天想分享一下。具体就是我们展示table数据的时候&#xff0c;表格中的数据多数情况是分页展示&#xff0c;毕竟数据量太多&#xff0c;分页的确是有必要的。那么我们有业务需要给表…

[C#]winform基于深度学习算法MVANet部署高精度二分类图像分割onnx模型高精度图像二值化

【训练源码】 https://github.com/qianyu-dlut/MVANet 【参考源码】 https://github.com/hpc203/MVANet-onnxrun 【算法介绍】 二分图像分割&#xff08;DIS&#xff09;最近出现在从高分辨率自然图像中进行高精度对象分割方面。在设计有效的DIS模型时&#xff0c;主要的挑战是…

代码随想录训练营 Day31打卡 贪心算法 part05 56. 合并区间 738. 单调递增的数字 968. 监控二叉树

代码随想录训练营 Day31打卡 贪心算法 part05 一、 力扣56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中…

【C++ 第十三章】AVL 二叉平衡树

1. AVL树的概念 普通二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。 因此&#xff0c;两位俄罗斯的数学家 G.M.Adelson-Velskii 和 E.M.Landis 在1962年发明…

【YashanDB知识库】共享集群YAC换IP

【标题】共享集群YAC换IP 【需求分类】安装部署&#xff0c;配置变更 【关键字】安装部署&#xff0c;更换IP&#xff0c;运维&#xff0c;配置变更&#xff0c;高可用&#xff0c;YAC 【需求描述】客户需要将已经部署的YAC集群更换IP&#xff0c;从测试网段切换生产网段 【…

高性能web服务器详解

一、Web服务的基础介绍 正常情况下单次web服务访问的流程简图&#xff1a; 1.1 Web服务介绍 这里介绍的是 Apache 和 NGINX 1.1.1 Apache 经典的Web服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X…

高性能web服务器--nginx

下载nginx [rootnginx ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz [rootnginx ~]# tar zxf nginx-1.24.0.tar.gz创建nginx用户 [rootnginx nginx-1.24.0]# useradd -s /sbin/nologin -M nginx先安装依赖 dnf install gcc pcre-devel zlib-devel openssl-d…

p0级别事故 分类

信息化系统 P0至P4事故级别描述了不同严重程度的服务中断或功能故障&#xff0c;其中P0代表最高级别的事故。以下是各级别的详细描述&#xff1a; ● P0&#xff1a;核心业务重要功能不可用&#xff0c;且影响范围广泛&#xff0c;如大面积影响用户。这包括系统崩溃、页面无法访…

Android低内存设备系统优化

切记,所有的优化都遵循一条准则: 空间换时间,时间换空间。 一、前言 我们为什么会觉得卡顿、不流畅? 卡顿等性能问题的最主要根源都是因为渲染性能,Android系统很有可能无法及时完成那些复杂的界面渲染操作。Android系统每隔16ms发出信号,触发对UI进行渲染,如果每次渲染…

springboot整合mybatis以及mybatis-plus 开发

一、springboot整合mybatis 1.注解版 1.1 导入坐标 <dependencies><!--mybatis坐标--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</…

【C++】使用红黑树封装map与set

文章目录 1. 源码分析2. 调整红黑树的结构搭建map、set3. 红黑树的迭代器3.1 普通迭代器3.2 const迭代器3.3 map的operator[ ] 4. 完整代码4.1 RBTree4.2 MyMap4.3 MySet 对于map与set&#xff0c;它们一个是KV模型&#xff0c;一个是K模型&#xff0c;那我们要写两个红黑树吗&…