go实现的http client有好几种的实现方式。
但是http的请求分为好几种的格式,比如x-www-form-urlencoded、json。json比较常用,但是也不乏x-www-form-urlencoded这种。
而go的post只能发string类型,这时候假如post里面有得字段需要int如果使用json就不行,必须使用x-www-form-urlencoded,而且经过实验url.Values{}类型是不能使用urlencoded的,转出来的字符串的数字前会加上%0。只有下面这种http请求方式可以解决。
package main
import (
"bytes"
"fmt"
"net/http"
"strings"
)
func main() {
var err error
var url_tmp = "http://**********"
//type sendMsg struct {
// Task_id string `json:"task_id"`
// Task_type string `json:"task_type"`
// Source_url string `json:"source_url"`
// Result_url string `json:"result_url"`
// Streaming_media_type int `json:"streaming_media_type"`
// Task_mode int `json:"task_mode"`
// Interval int `json:"interval"`
// Encoder_type string `json:"encoder_type"`
//}
//sendBodyMsg := sendMsg{
// Task_id:"123",
// Task_type:"safety_wear_server:DETECT",
// Source_url:"***************************",
// Result_url:"http://*******",
// Streaming_media_type:0,
// Task_mode:0,
// Interval:30,
// Encoder_type:"H265",
//}
//body := url.Values{}
//body.Add("task_id", "123_001")
//body.Add("task_type", "safety_wear_server:DETECT")
//body.Add("source_url", "****************")
//body.Add("result_url", "******")
//body.Add("streaming_media_type", "0")
//body.Add("task_mode", "0")
//body.Add("interval", "30")
//body.Add("encoder_type", "H265")
//body := map[string]string{
// "task_id": "123_001",
// "task_type": "safety_wear_server",
// "source_url": "rtsp://***********",
// "result_url": "http://**********",
// "streaming_media_type": "0",
// "task_mode": "0",
// "interval": "30",
// "encoder_type": "H265",
//}
//post要提交的数据,不接受int,所以上面只能写成map[string]string
//DataUrlVal := url.Values{}
//for key, val := range body {
// DataUrlVal.Add(key, val)
//}
//bt, err := json.Marshal(sendBodyMsg)
//
//body := ioutil.NopCloser(strings.NewReader(string(bt)))
//req, err := http.NewRequest("POST", url_tmp, ioutil.NopCloser(strings.NewReader(body.Encode())))
//if err != nil {
// fmt.Println("Fatal error ", err.Error())
//}
////req.Header.Set("Content-Type", "application/json")
//req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
//req.Header.Add("Accept","*/*")
//req.Header.Add("Accept-Encoding","gzip, deflate")
//client := &http.Client{}
//resp, err := client.Do(req)
//defer resp.Body.Close()
//只能用这种post请求才能够与服务器交互成功,并不能使用json格式来请求
var r http.Request
r.ParseForm()
r.Form.Add("task_id", "****")
r.Form.Add("task_type", "*****")
r.Form.Add("source_url", "rtsp://************")
r.Form.Add("result_url", "http://**********")
r.Form.Add("streaming_media_type", "0")
r.Form.Add("task_mode", "1")
r.Form.Add("interval", "50")
r.Form.Add("encoder_type", "H265")
bodystr := strings.TrimSpace(r.Form.Encode())
request, err := http.NewRequest("POST", url_tmp, strings.NewReader(bodystr))
if err != nil {
//TODO:
}
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
var resp *http.Response
resp, err = http.DefaultClient.Do(request)
if err != nil {
//TODO:
}
fmt.Printf("resp status %s,statusCode %d\n", resp.Status, resp.StatusCode)
buf := bytes.NewBuffer(make([]byte, 0, 512))
length, _ := buf.ReadFrom(resp.Body)
fmt.Println(string(buf.Bytes()))
if resp.Status != "200" && resp.StatusCode != 200 {
fmt.Println(len(buf.Bytes()))
fmt.Println(length)
fmt.Println(string(buf.Bytes()))
}
}