Saya mencoba bekerja dengan Apiary dan membuat template universal untuk mengirim JSON ke server tiruan dan memiliki kode ini:
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())
}
Kode ini tidak mengirim JSON dengan benar, tetapi saya tidak tahu mengapa. String JSON dapat berbeda di setiap panggilan. Saya tidak bisa menggunakan Struct
ini.
json.Marshall
, saya tidak yakin mengapa itu tidak berhasil untuknya.Jawaban:
Saya tidak terbiasa dengan tidur siang, tetapi menggunakan
net/http
paket Golang berfungsi dengan baik ( taman bermain ):sumber
client.Timeout = time.Second * 15
Anda bisa menggunakannya
post
untuk memposting json Anda.sumber
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
untukhttp.Post
, dan bytes.NewBuffer () bekerja dengan baik dalam kodebytes.NewBuffer()
tetapi menggunakanhttp.NewRequest
bukanhttp.Post
)resp.Body
ketika selesai membaca dari itu. Jika badan yang disediakan adalahio.Closer
, itu ditutup setelah permintaan." Bagaimana saya bisa tahu, sebagai pemula, jika badan itu adalahio.Closer
, atau dengan kata lain, apakah contoh ini aman?Jika Anda sudah memiliki struct.
Inti penuh .
sumber
Selain paket net / http standar, Anda dapat mempertimbangkan untuk menggunakan GoRequest saya yang membungkus net / http dan membuat hidup Anda lebih mudah tanpa terlalu memikirkan json atau struct. Tetapi Anda juga dapat mencampur dan mencocokkan keduanya dalam satu permintaan! (Anda dapat melihat detail lebih lanjut tentang hal ini di halaman gorequest github)
Jadi, pada akhirnya kode Anda akan menjadi seperti ikuti:
Ini tergantung pada bagaimana Anda ingin mencapai. Saya membuat perpustakaan ini karena saya memiliki masalah yang sama dengan Anda dan saya ingin kode yang lebih pendek, mudah digunakan dengan json, dan lebih mudah dikelola dalam basis kode dan sistem produksi saya.
sumber
tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }