Go调用webservice
最近写项目,切换在java,go,python之间……不过也好,同时对三种语言进行了对比,给我的感觉就是基础原理最重要,只要明白了原理,编程语言只不过是工具罢了。从速度和编码量来说,go无疑是最好的选择,无奈项目中使用oracle数据库较多,只得做备选;java毋庸置疑还是首选,毕竟与项目贴合;python主要是用于做一些快速类的数据分析,以满足业务对报表需要。下面就是用go调用webservice的例子,如果要插入数据库进行保存,返回的数据库连接根据自身情况编写即可。
下面展示一些 内联代码片
。
// go and webservice
maple
// An highlighted block
/*
程序目的:查询起飞城市到目的城市的航班信息
程序版本:go1.14
程序编写:枫叶
编写时间:2020年3月15日
*/
package main
import (
"GoAlgorithm/AirlineSchedule"
"fmt"
)
const(
airUrl = "http://ws.webxml.com.cn/webservices/DomesticAirline.asmx?wsdl"
contentType = "application/soap+xml; charset=utf-8"
)
func main(){
//定义起飞城市,抵达城市,查询时间
startCity := "桂林"
lastCity := "厦门"
theDate := "2020-3-18"
userID := ""
fmt.Println("----------航班查询系统---------")
AirlineSchedule.ReceiveParam(airUrl,contentType,startCity,lastCity,theDate,userID)
}
/*
程序目的:设置请求报文
程序版本:go1.14
程序编写:枫叶
编写时间:2020年3月15日
*/
package AirlineSchedule
import (
"fmt"
"io/ioutil"
"net/http"
"strings"
"time"
)
//对外接口函数
func ReceiveParam(url string,contentType string,startCity string,lastCity string,theDate string,userID string){
fmt.Println("-------正在查询",startCity,"到",lastCity,"航班信息-------")
buildRequest(url,contentType,startCity,lastCity,theDate,userID)
}
//soap1.2
func buildRequest(url string,contentType string,startCity string,lastCity string,theDate string,userID string){
req := `
` +startCity+`
` +lastCity+`
` +theDate+`
` +userID+``
res,err := http.Post(url,contentType,strings.NewReader(req))
if err != nil{
fmt.Println("http post err:", err)
return
}
defer res.Body.Close()
if http.StatusOK != res.StatusCode{
fmt.Println("WebService soap1.2 request fail, status: %s\n", res.StatusCode)
return
}
response,err := ioutil.ReadAll(res.Body)
if err!=nil{
fmt.Println("ioutil ReadAll err:", err)
return
}
fmt.Println("----------",startCity,"到",lastCity,"航班信息一览----------")
currentTime := time.Now()
resData := string(response)
fmt.Println(currentTime.Format("2006-01-02 15:04:05")," response:")
fmt.Println(resData)
startFlag := strings.Index(resData,") //字符串起始位置,int型
endFlag := strings.Index(resData,"") //字符串结束位置,int型
//position := strings.Index(resData[comma:]," ")
//fmt.Println(resData[startFlag:endFlag])
ReceivXml(resData[startFlag:endFlag],startCity,lastCity,theDate) //同目录下函数引用不需要前缀
}
/*
程序目的:解析从webservice服务端返回的xml,同时将记录保存到数据库
程序版本:go1.14
程序编写:枫叶
编写时间:2020年3月15日
*/
package AirlineSchedule
import (
"GoAlgorithm/UseMariadb"
"encoding/xml"
"fmt"
"time"
_ "github.com/go-sql-driver/mysql"
)
//_ "github.com/go-sql-driver/mysql" 操作数据库一定要引用该包,否则会报invalid memory address or nil pointer dereference错误
//内部属性都要大写字母开头,属性节点的名称变量名固定为XMLName
//定义航空信息struct
type airlinestime struct{
Company string `xml:"Company"`
AirlineCode string `xml:"AirlineCode"`
StartDrome string `xml:"StartDrome"`
ArriveDrome string `xml:"ArriveDrome"`
StartTime string `xml:"StartTime"`
ArriveTime string `xml:"ArriveTime"`
Mode string `xml:"Mode"`
AirlineStop string `xml:"AirlineStop"`
Cycle string `xml:"Week"`
}
//定义xml的struct
type xmlInfo struct{
XMLName xml.Name `xml:"Airlines"`//定义要解析内容的最外层标签
AirlineTime []airlinestime `xml:"AirlinesTime"`
}
func ReceivXml(xmlStr string,startCity string,lastCity string,theDate string) {
//fmt.Println(xmlStr)
analyzeXml(xmlStr,startCity,lastCity,theDate)
}
//解析xml
func analyzeXml(xmlStr string,startCity string,lastCity string,theDate string) {
//fmt.Println("test:",startCity,lastCity,theDate)
airlineData := xmlInfo{}
err := xml.Unmarshal([]byte(xmlStr), &airlineData)
if err != nil {
fmt.Printf("error: %v", err)
return
}
//fmt.Println(airlineData)
//fmt.Println("company:",airlineData.AirlineTime[0].Company)
//建立数据连接
db,err := UseMariadb.ConDatabase()
if err != nil{
fmt.Println("error:%v",err)
return
}
//insertSql,err := db.Prepare("insert into airline set company=?,airlinecode=?,startdrome=?,arrivedrome=?,starttime=?,arrivetime=?,airmode=?,airlinestop=?,cycle=?,querydate=?,startcity=?,arrivecity=?,platform=?")
insertSql,err := db.Prepare("insert into airline(company,airlinecode,startdrome,arrivedrome,starttime,arrivetime,airmode,airlinestop,cycle,querydate,startcity,arrivecity,platform) values (?,?,?,?,?,?,?,?,?,?,?,?,?)")
if err != nil {
fmt.Println("error:%v",err)
}
a := 0 //请求报文返回记录
b := 0 //插入数据库的记录
currentTime := time.Now()
fmt.Println(currentTime.Format("2006-01-02 15:04:05"))
for i:=0;i< len(airlineData.AirlineTime);i++{
res,_ := insertSql.Exec(airlineData.AirlineTime[i].Company,airlineData.AirlineTime[i].AirlineCode,airlineData.AirlineTime[i].StartDrome,airlineData.AirlineTime[i].ArriveDrome,airlineData.AirlineTime[i].StartTime,airlineData.AirlineTime[i].ArriveTime,airlineData.AirlineTime[i].Mode,airlineData.AirlineTime[i].AirlineStop,airlineData.AirlineTime[i].Cycle,theDate,startCity,lastCity,"Go")
lastId,_ := res.LastInsertId()
if lastId == 0{
b++
}
fmt.Println("航空公司:",airlineData.AirlineTime[i].Company)
fmt.Println("航空编号:",airlineData.AirlineTime[i].AirlineCode)
fmt.Println("起飞机场:",airlineData.AirlineTime[i].StartDrome)
fmt.Println("抵达机场:",airlineData.AirlineTime[i].ArriveDrome)
fmt.Println("起飞时间:",airlineData.AirlineTime[i].StartTime)
fmt.Println("抵达时间:",airlineData.AirlineTime[i].ArriveTime)
fmt.Println("机型:",airlineData.AirlineTime[i].Mode)
fmt.Println("经停:",airlineData.AirlineTime[i].AirlineStop)
fmt.Println("飞行周期:",airlineData.AirlineTime[i].Cycle)
fmt.Println("起飞城市:",startCity)
fmt.Println("抵达城市:",lastCity)
fmt.Println("查询时间:",theDate)
fmt.Println("操作平台:Go")
fmt.Println("---------------------------------------------------")
a++
}
insertSql.Close()
UseMariadb.CloseDb(db)
fmt.Println("共返回",a,"条记录,插入数据库",b,"条...")
}