Intenté trabajar con Apiary e hice una plantilla universal para enviar JSON al servidor falso y tener 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())
}
Este código no envía JSON correctamente, pero no sé por qué. La cadena JSON puede ser diferente en cada llamada. No puedo usar Struct
para esto.
json.Marshall
, no estoy seguro de por qué no estaba funcionando para él.Respuestas:
No estoy familiarizado con la siesta, pero usar el
net/http
paquete de Golang funciona bien (área de juegos ):fuente
client.Timeout = time.Second * 15
puedes usar
post
para publicar tu json.fuente
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
, y bytes.NewBuffer () funciona bien en mi códigobytes.NewBuffer()
pero usa enhttp.NewRequest
lugar dehttp.Post
)resp.Body
cuando termine de leerla. Si el cuerpo proporcionado es unio.Closer
, se cierra después de la solicitud". ¿Cómo puedo saber, como novato en Go, si el cuerpo esio.Closer
o, en otras palabras, si este ejemplo es seguro?Si ya tienes una estructura.
Esencia completa .
fuente
Además del paquete estándar net / http, puede considerar usar mi GoRequest que se ajusta a net / http y le facilita la vida sin pensar demasiado en json o struct. ¡Pero también puedes mezclar y combinar ambos en una sola solicitud! (puede ver más detalles al respecto en la página de gorequest github)
Entonces, al final su código se convertirá en el siguiente:
Esto depende de cómo quieras lograrlo. Hice esta biblioteca porque tengo el mismo problema contigo y quiero un código más corto, fácil de usar con json y más fácil de mantener en mi base de código y sistema de producción.
fuente
tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }