使用Golang开发一个本地代理

 

引言

最近需要对接一个接口,人家提供了两种调用方式,第一种是基于IE浏览器的Active,第二种是动态链接库dll。我们公司的产品不支持IE,所以只能通过调用dll来完成了。

之前我已经用Java实现了这个代理,但是感觉很笨重,依赖于容器还有JVM一大堆,这个代理要安装在客户端电脑上,基于Http协议来调用,然后透传参数调用dll,将返回的结果转换为Json。

如今我想用Golang来实现这个功能,它不依赖特定的运行环境,而且天然高并发,适合做网络通信相关,结合了Java的高效和C的高性能。

一、功能拆解

  • http模块
  • 调用dll
  • 返回结果处理

功能大致上分为三步,三步独立完成,分步进行。第一个很简单,网上一搜就出来了,也没遇到什么波折。然后直接测试调用dll,这个耽误了不少时间,不知道问题出在哪,又不好测试,打的包不在dll所在文件夹里,每次还要复制过去测试。

二、遇到的问题

1. 对于入参和出参的处理

void _stdcall PostAndRecvEx(IN char* pszPost, OUT char* pszRecv) 参数:    pszPost 输入XML信息    pszRecv 返回XML信息 返回值:无

2. 程序异常退出

由于dll文件在指定的安装目录,将golang生成的exe复制过去后才能找到它,但是一运行却出现闪退,根本不知道哪里出了问题。

3. 中文乱码

这里体现在两个地方,一是输入参数无法被dll中的函数识别,一直报错。第二个是输出的xml中包含中文乱码。

4. 返回结果无法映射到结构体

要转成Json,首先应该定义结构体,我是利用返回结果直接测试的,但是返回的xml无法映射到结构体对应的字段上,怀疑是编码问题,返回的xml指定了GBK(encoding="gbk")。由于是模拟的返回数据,我直接修改了编码发现可以映射到指定字段。网上查了下没什么好办法,看到这个很妙就直接用了:

xmlDataRsp = strings.Replace(xmlDataRsp, "gbk", "UTF-8", -1)

三、涉及知识点

1. 如何使用http模块写一个服务(找个官方的示例)

import (     "fmt"     "log"     "net/http" )  func handler(w http.ResponseWriter, r *http.Request) {     fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) }  func main() {     http.HandleFunc("/", handler)     log.Fatal(http.ListenAndServe(":8080", nil)) }

2. 如何调用dll(这个也有几种方式)

dll := syscall.NewLazyDLL("NISEC_SKSC.dll") proc := dll.NewProc("PostAndRecvEx")

3. 捕获异常 明确问题点

defer func() {     //恢复程序的控制权     err := recover()     if err != nil {         fmt.Println(err)     } }() // 可能出问题的代码

4. 如何使用cgo

//#include <stdio.h> //#include <stdlib.h> import "C" import (     "bytes"     "strconv"     "unsafe" )  func main() {     cs := C.CString("你好")     defer C.free(unsafe.Pointer(cs))     println(cs) }

一开始以为注释是没用的,后来才知道编译器识别加注释的c代码(通过import "C")

5. 底层数据类型不一致的处理

使用java调用dll的时候我特地在后面加了结束符:

JNAOperateDll.instanceDll.PostAndRecvEx((xmlStr + "\0") .getBytes("gbk"), b);

用golang的时候,我也一直不知道如何处理,到底该用字符串加"\0",还是字节加\x00。
这就要了解golang和c对字符的处理,c需要通过结束符来判断字符串何时结束,而golang不需要,它有长度标

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信