记一次golang_post_xml时返回错误码的问题
详情
昨天由于项目需要,加入发送短信功能,首先测试了一下已存在的一个Python代码,原理比较简单,向一个接口发送一个http post请求,请求的数据为xml格式,同时请求会带一个header头,Key为Host信息。
Python代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# coding=utf-8
import requests
import cgi
def send(phone, msg):
url = 'http://xxx.com/MoblMsgSender'
headers = {
'Host': 'xxx.com',
}
body = '<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><AuthenticationHeader xmlns="http://xxx.com/MoblMsgSender"><Token>Tokenxxx==</Token></AuthenticationHeader></S:Header><S:Body><ns2:xxMmSender xmlns:ns2="http://xxx.com/"><arg0 xmlns="">%s</arg0><arg1 xmlns="">%s</arg1><arg2 xmlns="">yunwei.alarm</arg2><arg3 xmlns=""></arg3></ns2:xxMmSender></S:Body></S:Envelope>' % (phone, cgi.escape(msg))
try:
r = requests.post(url, data=body, headers=headers)
if '<return>true</return>' in r.content:
return True
except:
pass
return False
|
send("135xxxxxxx","testPython")
果然成功收到了短信,证明接口调用成功。
于是我转化成golang代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package main
import (
"bytes"
"crypto/tls"
"log"
"net/http"
"strings"
"time"
)
func sendmessage(phone string, msg string) error {
uri := `http://xxx.com/MoblMsgSender`
//proxy, _ := url.Parse("http://127.0.0.1:8080")
tr := &http.Transport{
//Proxy: http.ProxyURL(proxy),
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{
Transport: tr,
Timeout: time.Second * 5, //超时时间
}
body := `<?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><AuthenticationHeader xmlns="http://mms.360buy.com/services/MoblMsgSender"><Token>666a8EN3oIijHY+KjS+2mg==</Token></AuthenticationHeader></S:Header><S:Body><ns2:xxMmSender xmlns:ns2="http://xxx.com/"><arg0 xmlns="">` + phone + `</arg0><arg1 xmlns="">` + msg + `</arg1><arg2 xmlns="">yunwei.alarm</arg2><arg3 xmlns=""></arg3></ns2:xxMmSender></S:Body></ S:Envelope>`
log.Println(strings.NewReader(body))
req, err := http.NewRequest("post", uri, bytes.NewBuffer([]byte(body)))
if err != nil {
log.Println(err)
// handle error
}
req.Host = "xxx.com"
resp, err := client.Do(req)
if err != nil {
log.Println(err)
}
log.Println(resp)
//log.Println(respbody)
return err
}
func main() {
sendmessage("135xxxxxxx", "testGolang")
}
|
然而我发现此请求并没有获取到短信,于是挂上代理进行抓包,发现其响应码为502.
对比Python的正常请求:
发现是因为http.NewRequest()方法第一个参数options方法写错了,不能写成小写..