欢迎光临
我们一直在努力

Golang模拟POST thinkPHP API接口

Golang模拟POST thinkPHP API接口

最近有个项目要用goalng对一个thinkPHP 5的项目进行模拟post.

thinkPHP的默认输出方式设置成HTML, 默认AJAX 数据返回格式JSON,所以在正常的模拟提交只能获取到HTML的返回数据,thinkPHP的配置是这样的:

// 默认输出类型

‘default_return_type’    => ‘html’,

// 默认AJAX 数据返回格式,可选json xml …

‘default_ajax_return’    => ‘json’,

所以需要采用Ajax异步请求方式,在请求的Header增加x-requested-with,并设置值为XMLHttpRequest,这样就能取得thinkPHP的json返回数据.

 

以下是参考网络的golang几种post请求方式,仅供学习

get请求

get请求可以直接http.Get方法,非常简单。

func httpGet() {

resp, err := http.Get(“http://www.01happy.com/demo/accept.php?id=1”)

if err != nil {

// handle error

}

 

defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)

if err != nil {

// handle error

}

 

fmt.Println(string(body))

}

post请求

一种是使用http.Post方式

func httpPost() {

resp, err := http.Post(“http://www.01happy.com/demo/accept.php”,

“application/x-www-form-urlencoded”,

strings.NewReader(“name=cjb”))

if err != nil {

fmt.Println(err)

}

 

defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)

if err != nil {

// handle error

}

 

fmt.Println(string(body))

}

Tips:使用这个方法的话,第二个参数要设置成”application/x-www-form-urlencoded”,否则post参数无法传递。

一种是使用http.PostForm方法

func httpPostForm() {

resp, err := http.PostForm(“http://www.01happy.com/demo/accept.php”,

url.Values{“key”: {“Value”}, “id”: {“123”}})

 

if err != nil {

// handle error

}

defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)

if err != nil {

// handle error

}

fmt.Println(string(body))

}

复杂的请求

有时需要在请求的时候设置头参数、cookie之类的数据,就可以使用http.Do方法。

func httpDo() {

client := &http.Client{}

 

req, err := http.NewRequest(“POST”, “http://www.01happy.com/demo/accept.php”, strings.NewReader(“name=cjb”))

if err != nil {

// handle error

}

 

req.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)

req.Header.Set(“Cookie”, “name=anny”)

 

resp, err := client.Do(req)

 

defer resp.Body.Close()

 

body, err := ioutil.ReadAll(resp.Body)

if err != nil {

// handle error

}

 

fmt.Println(string(body))

}

 

同上面的post请求,必须要设定Content-Type为application/x-www-form-urlencoded,post参数才可正常传递。

如果要发起head请求可以直接使用http client的head方法,比较简单,这里就不再说明。

 

golang进行http请求类型总结备忘如下

 

1.普通的postget请求

    var r http.Request

r.ParseForm()

r.Form.Add(“uuid”, orderUUID)

bodystr := strings.TrimSpace(r.Form.Encode())

request, err := http.NewRequest(“GET”, url, strings.NewReader(bodystr))

if err != nil {

//TODO:

}

request.Header.Set(“Content-Type”, “application/x-www-form-urlencoded”)

request.Header.Set(“Connection”, “Keep-Alive”)

 

var resp *http.Response

resp, err = http.DefaultClient.Do(request)

if err != nil {

//TODO:

}

 

  1. body全部二进制数据流进行post

 //body提交二进制数据

func DoBytesPost(url string, data []byte) ([]byte, error) {

 

body := bytes.NewReader(data)

request, err := http.NewRequest(POST_METHOD, url, body)

if err != nil {

log.Println(“http.NewRequest,[err=%s][url=%s]”, err, url)

return []byte(“”), err

}

request.Header.Set(“Connection”, “Keep-Alive”)

var resp *http.Response

resp, err = http.DefaultClient.Do(request)

if err != nil {

log.Println(“http.Do failed,[err=%s][url=%s]”, err, url)

return []byte(“”), err

}

defer resp.Body.Close()

b, err := ioutil.ReadAll(resp.Body)

if err != nil {

log.Println(“http.Do failed,[err=%s][url=%s]”, err, url)

}

return b, err

}

  1. 模拟web表单文件上传进行post

func newfileUploadRequest(uri string, params map[string]string, paramName, path string) (*http.Request, error) {

file, err := os.Open(path)

if err != nil {

return nil, err

}

defer file.Close()

 

body := &bytes.Buffer{}

writer := multipart.NewWriter(body)

part, err := writer.CreateFormFile(paramName, path)

if err != nil {

return nil, err

}

_, err = io.Copy(part, file)

 

for key, val := range params {

_ = writer.WriteField(key, val)

}

err = writer.Close()

if err != nil {

return nil, err

}

request, err := http.NewRequest(“POST”, uri, body)

request.Header.Set(“Content-Type”, writer.FormDataContentType())

return request, err

}

关注婴儿健康成长

防撞条冬季鞋