• 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的加密方式

  • 相关阅读:
    在线程中使用OpenFileDialog
    Log4net附加
    SQL表间列根据条件复制(赋值)
    DataGridView使用
    Latex使用总结及备忘
    Windows获取文件状态
    TabControl取消首次定位焦点
    C#跨线程调用
    电子词典的查寻程序,发送和接收应答程序
    电子词典的相关子函数db.c程序
  • 原文地址:https://www.cnblogs.com/tsxylhs/p/12098476.html
Copyright © 2020-2023  润新知