如何设置HTTP Post实体,如Java的方法HttpPost.setEntity

时间:2016-07-22 09:08:14

标签: go

我是一名新的golang程序员。在java中,使用方法HTTP.setEntity()进行设置非常容易。但是在golang中,我有测试servel方式来设置它,但我们的服务器仍然缺少接收实体数据。 这是代码:

func bathPostDefects(){
    url := "http://127.0.0.1/edit"
    var jsonStr =  []byte(`{"key":"abc","id":"110175653","resolve":2,"online_time":"2016-7-22","priority":1,"comment":"something.."}`)
    req, err := http.NewRequest("POST",url,bytes.NewBuffer(jsonStr))
    fmt.Println("ContentLength: ",len(jsonStr))
    req.Header.Set("Content-Type","application/json")
    req.Header.Set("Content-Length",string(len(jsonStr)))
    client := &http.Client{}
    resp,err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    fmt.Println("response Status:", resp.Status)
    fmt.Println("response Headers:", resp.Header)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println("response Body:", string(body))
}

问题找到它,它是由我们的servlet读取了表单值,而不是请求体,代码更新如下:

func bathPostDefects(){
    v := url.Values{}
    v.Set("key", "abc")
    v.Add("id", "110175653")
    v.Add("resolve", "2")
    v.Add("online_time", "2016-7-22")
    v.Add("priority", "1")
    v.Add("comment", "something..")
    fmt.Println(v.Get("id"))
    fmt.Println(v.Get("comment"))
    resp, err := http.PostForm("http://127.0.0.1/edit",v)
    if err != nil {
          panic(err)
    }
    defer resp.Body.Close()
    fmt.Println("response Status:", resp.Status)
    fmt.Println("response Headers:", resp.Header)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println("response Body:", string(body))
}

谢谢你们所有人。

1 个答案:

答案 0 :(得分:1)

我更改了一些代码以使用NewBufferString,并与打印请求正文的服务器一起测试:

package main

import (
    "bytes"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "time"
)

func bathPostDefects() {
    url := "http://127.0.0.1:4141/"
    var jsonStr = `{"key":"abc","id":"110175653","resolve":2,"online_time":"2016-7-22","priority":1,"comment":"something.."}`
    req, err := http.NewRequest("POST", url, bytes.NewBufferString(jsonStr))
    fmt.Println("ContentLength: ", len(jsonStr))
    req.Header.Set("Content-Type", "application/json")
    req.Header.Set("Content-Length", string(len(jsonStr)))
    client := &http.Client{}
    _, err = client.Do(req)
    if err != nil {
        panic(err)
    }
}

func server() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        body, _ := ioutil.ReadAll(r.Body)
        fmt.Println("Body: ", string(body))
    })

    log.Fatal(http.ListenAndServe(":4141", nil))
}
func main() {
    go server()
    time.Sleep(time.Second)

    bathPostDefects()
}