资源接收参数
示例: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
但它不起作用。
答案 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命令行应该可以工作(如果有的话,我的代码也应该工作)。