golang 调用顺丰API接口测试

golang 调用顺丰API接口首先得去https://qiao.sf-express.com/pages/service/API.html这个网站申请注册,拿到我的API接口如下图所示

之后就可以按照文档生成xml请求信息

为了方便快速搭建 golang 的结构粘贴如下

type Rquest struct {
	XMLName xml.Name `xml:"Request"`
	Service string   `xml:"service,attr"`
	Lang    string   `xml:"lang,attr"`
	Head    string   `xml:"Head"`
	Error   string   `xml:"ERROR"`
	Body    Body     `xml:"Body"`
}
type Body struct {
	SFOrder SFOrder `xml:"Order"`
}
type SFOrder struct {
	XMLName           xml.Name `xml:"Order"`
	OrderId           string   `xml:"orderid,attr"`
	ExpressType       string   `xml:"express_type,attr"`
	JProvince         string   `xml:"j_province,attr"`
	JCity             string   `xml:"j_city,attr"`
	JCounty           string   `xml:"j_county,attr"`
	JCompany          string   `xml:"j_company,attr"`
	JContact          string   `xml:"j_contact,attr"`
	JTel              string   `xml:"j_tel,attr"`
	JAddress          string   `xml:"j_address,attr"`
	DProvince         string   `xml:"d_province,attr"`
	DCity             string   `xml:"d_city,attr"`
	DCounty           string   `xml:"d_county,attr"`
	DCompany          string   `xml:"d_company,attr"`
	DContact          string   `xml:"d_contact,attr"`
	DTel              string   `xml:"d_tel,attr"`
	DAddress          string   `xml:"d_address,attr"`
	ParcelQuantity    string   `xml:"parcel_quantity,attr"`
	CargoTotalWeight  string   `xml:"cargo_total_weight,attr"`
	Custid            string   `xml:"custid,attr"`
	PayMethod         string   `xml:"pay_method,attr"`
	RoutelabelService string   `xml:"routelabelService,attr"`
	Cargo             Cargo
}
type Cargo struct {
	XMLName xml.Name `xml:"Cargo"`
	Name    string   `xml:"name,attr"`
}
type Response struct {
	XMLName xml.Name `xml:"Response"`
	Service string   `xml:"service,attr"`
	Lang    string   `xml:"lang,attr"`
	Head    string   `xml:"Head"`
	Error   string   `xml:"ERROR"`
	Body    RBody    `xml:"Body"`
}
type RBody struct {
	ResponseBody ResponseBody `xml:"OrderResponse"`
}
type ResponseBody struct {
	XMLName      xml.Name `xml:"OrderResponse"`
	FilterResult string   `xml:"filter_result,attr"`
	DestCode     string   `xml:"destcode,attr"`
	Mailno       string   `xml:"mailno,attr"`
	Origincode   string   `xml:"origincode,attr"`
	OrderId      string   `xml:"orderid,attr"`
	RlsInfo      RlsInfo  `xml:"rls_info"`
}
type RlsInfo struct {
	RlsErrormsg  string    `xml:"rls_errormsg,attr"`
	InvokeResult string    `xml:"invoke_result,attr"`
	RlsCode      string    `xml:"rls_code,attr"`
	RlsDetail    RlsDetail `xml:"rls_detail"`
}
type RlsDetail struct {
	WaybillNo           string `xml:"waybillNo,attr"`
	SourceTransferCode  string `xml:"sourceTransferCode,attr"`
	SourceCityCode      string `xml:"sourceCityCode,attr"`
	SourceDeptCode      string `xml:"sourceDeptCode,attr"`
	SourceTeamCode      string `xml:"sourceTeamCode,attr"`
	DestCityCode        string `xml:"destCityCode,attr"`
	DestDeptCode        string `xml:"destDeptCode,attr"`
	DestDeptCodeMapping string `xml:"destDeptCodeMapping,attr"`
	DestTeamCode        string `xml:"destTeamCode,attr"`
	DestTransferCode    string `xml:"destTransferCode,attr"`
	DestRouteLabel      string `xml:"destRouteLabel,attr"`
	ProName             string `xml:"proName,attr"`
	CargoTypeCode       string `xml:"cargoTypeCode,attr"`
	LimitTypeCode       string `xml:"limitTypeCode,attr"`
	ExpressTypeCode     string `xml:"expressTypeCode,attr"`
	CodingMapping       string `xml:"codingMapping,attr"`
	XbFlag              string `xml:"xbFlag,attr"`
	PrintFlag           string `xml:"printFlag,attr"`
	TwoDimensionCode    string `xml:"twoDimensionCode,attr"`
	ProCode             string `xml:"proCode,attr"`
	PrintIcon           string `xml:"printIcon,attr"`
}

将数据结构转换为xml格式化字符串代码如下

        xmlorder, _ := xml.Marshal(sfOrder)
	str2 := string(xmlorder[:])

根据文档提示将信息加密,注意这边是两层加密方式

// str为xml code 为效验码func md5V(str string, code string) string {
	md5Key := md5.New()
	md5Key.Write([]byte(fmt.Sprintf("%s%s", str, code)))
	xmlKey := base64.StdEncoding.EncodeToString(md5Key.Sum(nil))
	return xmlKey
}

之后调用http post请求传入两个参数分别为 xml 和 verifyCode

代码如下

func HttpPost(xmls string) (err error, res model.Response) {
	checkwork := "rIGDqQhU5JbIVQ*******vjcivbg"
	urls := "http://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService"
	stringMd5 := md5V(xmls, checkwork)
	responseData := model.Response{}
	resp, err := http.PostForm(urls, url.Values{"xml": {xmls}, "verifyCode": {stringMd5}})
	if err != nil {
		return err, responseData
	}

	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	err = xml.Unmarshal(body, &responseData)
	if err != nil {
		return err, responseData
	}
	return err, responseData
}

主要的突出问题是:xml的转化,xml与chekwork的加密方式

原文地址:https://www.cnblogs.com/tsxylhs/p/12098476.html

时间: 2024-09-30 10:04:21

golang 调用顺丰API接口测试的相关文章

HTTP API接口测试利器PostMan介绍

一.什么是API接口测试? API接口有多种,个人将其划分为三类.第一种是函数级别的,测试需要对接口的各个参数进行测试,如:Int getResult(String key, String ID, Int ticket).第二种是对象级别的,开发在使用API接口时,先引入包名,在使用之前声明一个对象,之后可以使用对象提供的方法,而测试时,需要测试的是API的功能及对数据输入的正确性.第二种和第一种的差别是,我们只需关注提供给用户使用的接口就可以了,不用关心接口调用其他函数情况,相对于第一种来说,

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest  attilax大总结.docx

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest  attilax大总结.docx 1. 为什么需要接口调用??1 1.1. 为了方便集成复用模块类库1 1.2. 嫁接不同的语言与类库,以及嵌入dsl1 1.3. 方便跨机器,跨开发板,跨硬件,跨运行环境的代码复用2 2. 接口api的历史2 2.1. 发展历程2 2.2. API 这个类库默认提供的接口,要求同语言调用一般2 2.3. Cli接口 命令行接口.单机跨语言接口(推荐比较常用)3 2.4. 图形用户

Qt刷新机制的一些总结(Qt内部画的时候是相当于画在后台一个对象里,然后在刷新的时候调用bitblt统一画,调用window的api并不会影响到后面的那个对象)

前段时间做过一个界面刷新的优化,遇到的坑比较多,在这里做一点点总结吧. 优化的方案是滚动滚动条的时候用截屏的方式代替界面全部刷新,优化完成后,界面在滚动时效率能提升大概一倍,背景介绍完毕. 用到最主要的是QT的截屏功能 window原生api会提供截屏滚动的功能.可以用这个ScrollWindowEx这个api.它会根据相应的参数在屏幕中进行滚动相应的区域.是不是很容易?但是结果却是不理想,因为用的是Qt,控件重写过PaintEvent的方法.调用api实时能看到效果,但是触发一次PaintEv

java调用淘宝api

代码下载地址:http://www.zuidaima.com/share/1550463234034688.htm 原文:java调用淘宝api java代码结构: java调用淘宝api,布布扣,bubuko.com

【智能路由器】C代码调用uci的API读openwrt配置文件指南

[智能路由器]系列文章连接 http://blog.csdn.net/u012819339/article/category/5803489 上篇博客讲解了命令行下uci的使用方法,本篇博客arvik将简单剖析uci部分源码,带领大家使用c语言调用uci的API来读取配置文件. 实战背景 倘若我们自己写了一个应用程序,也想用uci来集中化管理配置该应用的配置文件,怎么办呢? 看了arvik的上一篇博客后相信新手能很快的使用uci对某个配置文件进行配置,只是如何让我们的应用程序读取配置文件内容呢,

HTML5 调用百度地图API地理定位

<!DOCTYPE html> <html> <title>HTML5 HTML5 调用百度地图API地理定位实例</title> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script type="text/javascript" src="ht

C#调用百度地图 api

转  http://blog.csdn.net/kkkkkxiaofei/article/details/8663377 这一篇,记录一下我调用的地图API实现的功能.下面介绍的都是一些片段的节选,不能直接复制就运行.在实现之前肯定要加载地图,先放一个webbroser控件,然后如下: [csharp] view plaincopyprint? private void Form1_Load(object sender, EventArgs e) { string str_url = Appli

Haskell ghci中调用pandoc的API进行markdown转换

所用环境:Windows Server 2008 + ghc 7.6.3(Haskell Platform 2013.2.0.0自带的) + pandoc 1.12.4 操作步骤: 1. 安装Haskell Platform,下载地址:http://www.haskell.org/platform/. 2. 安装pandoc,安装命令:cabal install pandoc 3. 在命令行中运行ghci 4. 引用pandoc的相应模块,在Prelude命令提示符中运行: :module Te

[Python-MATLAB] 在Python中调用MATLAB的API

可以参考官方的说明文档: http://cn.mathworks.com/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html MATLAB Engine API的使用文档: http://cn.mathworks.com/help/matlab/matlab-engine-for-python.html 原材料: 1.MATLAB 2015a  32位的 2.Python 2.7.13    32位