Golang实现http请求 xml格式数据

客户端代码实现如下:

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()
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值