客户端代码实现如下:
package main
import (
"bytes"
"encoding/xml"
"io"
"log"
"net"
"net/http"
"time"
)
const (
url = "http://localhost:8000/test" // 根据实际情况修改url
contentType = "application/xml"
)
var client *http.Client
type ReqXML struct {
XMLName xml.Name `xml:"test"`
Name string `xml:"name"`
Id int `xml:"id"`
Data string `xml:"data"`
}
type RespXML struct {
XMLName xml.Name `xml:"resp"`
Code int `xml:"code"`
Msg string `xml:"msg"`
Result string `xml:"result"`
}
func params() {
tr := &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}
client = &http.Client{Transport: tr}
}
func req() {
reqdata := ReqXML{
XMLName: xml.Name{Local: "test"},
Name: "测试",
Id: 1,
Data: "测试请求",
}
xmlbytes, err := xml.Marshal(reqdata)
if err != nil {
log.Println(err)
return
}
log.Println(string(xmlbytes))
resp, err := client.Post(url, contentType, bytes.NewBuffer(xmlbytes))
if err != nil {
log.Println("req err:", err)
}
defer resp.Body.Close()
str, _ := io.ReadAll(resp.Body)
log.Println(string(str))
var xmlData RespXML
err = xml.Unmarshal(str, &xmlData)
if err != nil {
log.Println(string(str))
log.Println(err)
return
}
log.Println(xmlData)
}
func main() {
params()
req()
}
服务端代码实现如下:
package main
import (
"encoding/xml"
"io"
"log"
"net/http"
"time"
)
type ReqXML struct {
XMLName xml.Name `xml:"test"`
Name string `xml:"name"`
Id int `xml:"id"`
Data string `xml:"data"`
}
type RespXML struct {
XMLName xml.Name `xml:"resp"`
Code int `xml:"code"`
Msg string `xml:"msg"`
Result string `xml:"result"`
}
func Service() {
http.HandleFunc("/test", testXMLHandler)
for true {
err := http.ListenAndServe(":8000", nil)
if err != nil {
log.Println(err)
time.Sleep(3 * time.Second)
continue
}
break
}
}
func testXMLHandler(w http.ResponseWriter, r *http.Request) {
// 请求来源方法判断
if r.Method != http.MethodPost {
w.WriteHeader(405) // 返回错误代码
return
}
var err error
var reqData ReqXML
str, _ := io.ReadAll(r.Body)
if err = xml.Unmarshal(str, &reqData); err != nil {
w.WriteHeader(401)
log.Println(string(str))
return
}
log.Println(reqData)
// 处理请求消息
// ......
// 响应
respbody := RespXML{
XMLName: xml.Name{Local: "resp"},
Code: 200,
Msg: "成功",
Result: "hello",
}
err = xml.NewEncoder(w).Encode(respbody)
if err != nil {
http.Error(w, "Error encoding XML", http.StatusInternalServerError)
return
}
}
func main() {
Service()
}