Eu tentei trabalhar com o Apiary e fiz um modelo universal para enviar JSON para servidor de simulação e ter este código:
package main
import (
"encoding/json"
"fmt"
"github.com/jmcvetta/napping"
"log"
"net/http"
)
func main() {
url := "http://restapi3.apiary.io/notes"
fmt.Println("URL:>", url)
s := napping.Session{}
h := &http.Header{}
h.Set("X-Custom-Header", "myvalue")
s.Header = h
var jsonStr = []byte(`
{
"title": "Buy cheese and bread for breakfast."
}`)
var data map[string]json.RawMessage
err := json.Unmarshal(jsonStr, &data)
if err != nil {
fmt.Println(err)
}
resp, err := s.Post(url, &data, nil, nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("response Status:", resp.Status())
fmt.Println("response Headers:", resp.HttpResponse().Header)
fmt.Println("response Body:", resp.RawText())
}
Esse código não envia JSON corretamente, mas não sei por que. A cadeia JSON pode ser diferente em cada chamada. Eu não posso usar Struct
para isso.
json.Marshall
, não sei por que não estava funcionando para ele.Respostas:
Eu não estou familiarizado com cochilos, mas usar o
net/http
pacote de Golang funciona bem ( playground ):fonte
client.Timeout = time.Second * 15
você pode apenas usar
post
para postar seu json.fonte
cannot use jsonValue (type []byte) as type io.Reader in argument to http.Post: []byte does not implement io.Reader (missing Read method)
io.Reader
parahttp.Post
, e bytes.NewBuffer () funciona bem no meu códigobytes.NewBuffer()
mas usoshttp.NewRequest
em vez dehttp.Post
)resp.Body
quando terminar de ler. Se o corpo fornecido for umio.Closer
, ele será fechado após a solicitação". Como posso dizer, como novato no Go, se o corpo é umio.Closer
, ou em outras palavras, se este exemplo é seguro?Se você já possui uma estrutura.
Essência completa .
fonte
Além do pacote padrão net / http, você pode usar o GoRequest, que envolve net / http e facilita sua vida sem pensar muito em json ou struct. Mas você também pode misturar e combinar os dois em uma solicitação! (você pode ver mais detalhes sobre isso na página do gorequest github)
Portanto, no final, seu código se tornará o seguinte:
Isso depende de como você deseja alcançar. Criei esta biblioteca porque tenho o mesmo problema com você e quero um código mais curto, fácil de usar com o json e mais sustentável em minha base de código e sistema de produção.
fonte
tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }