如何通过POST发送参数

时间:2016-09-02 08:46:01

标签: post go

资源接收参数

示例:http://example.com/show-data?json={"fob":"bar"}

如果有GET请求,一切都清楚并且运作良好。

urlStr := "http://87.236.22.7:1488/test/show-data"
json := `"foo":"bar"`
r, _ := http.Get(urlStr+`?json=`+json)
println(r.Status)


200 OK

但是在使用POST请求时应该怎么做?

我试试

 urlStr := "http://87.236.22.7:1488/test/show-data"
    json := `{"foo":"bar"}`
    form := url.Values{}
    form.Set("json", json)

    println(form.Encode())
    post, _ := http.PostForm(urlStr, form)

    println(post.Status)



400 Bad Request 

json parameter is missing

但它不起作用。

2 个答案:

答案 0 :(得分:3)

有很多方法可以发布帖子,但你可能想要使用PostForm:https://golang.org/pkg/net/http/#PostForm

您需要首先设置一个Values对象,然后将其直接传入。请参阅文档中的示例代码:https://golang.org/pkg/net/url/#Values

一旦你将json卡入了一个Values对象,只需调用PostForm()来激活它。

编辑:这可以假设接收端想要编码为application / x-www-form-urlencoded的东西。如果接收端期待application / json,我会给出第二个答案。

答案 1 :(得分:-1)

这个答案假定接收端正在期待application / json。在这种特殊情况下,它仍然存在问题,尽管我已经使用Wireshark验证了请求是否正确(具有正确的标题和正文内容):

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {

    // Create a key/value map of strings
    kvPairs := make(map[string]string)
    kvPairs["foo"] = "bar"

    // Make this JSON
    postJson, err := json.Marshal(kvPairs)
    if err != nil { panic(err) }
    fmt.Printf("Sending JSON string '%s'\n", string(postJson))

    // http.POST expects an io.Reader, which a byte buffer does
    postContent := bytes.NewBuffer(postJson)

    // Send request to OP's web server
    resp, err := http.Post("http://87.236.22.7:1488/test/show-data", "application/json", postContent)
    if err != nil { panic(err) }

    // Spit back the complete status
    fmt.Printf("Status: %s\n", resp.Status)
    buf, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(buf))
}

似乎接收yii框架不知道如何处理这种类型的REST请求,或者无论如何都期望参数的GET部分中的内容。描述REST requests的yii页面有一个示例CURL命令行,该命令行发出的请求更像上面的代码,但它在OP的示例中并不起作用。

OP:请仔细检查您的接收器,确保它已配置为接收此类请求。类似的CURL命令行应该可以工作(如果有的话,我的代码也应该工作)。