I am trying to post a struct
using Go's http.POST
, however I am not being succeeded with that.
Please look:
//SKUStock definition
type SkuStock struct {
Sku string `json:"id"`;
Quantity int64 `json:"stockQuantity"`;
}
type StockJson struct {
Items []SkuStock `json:"skus"`;
}
After loading some data from a database, I have the following, in order to perform the POST itself:
//Sends the skuStock Information to server
func SendSkuData(stockItems []SkuStock) {
//creates a json like {"skus":[{"id":"ITEM1576","stockQuantity":995}]}
stockPayload, err := json.Marshal(StockJson{stockItems});
if err != nil {
log.Fatal(err);
}
client := &http.Client{}
apiRequestUrl := os.Getenv("api.protocol") + "://" + os.Getenv("api.address") + "/batch/sku/stock";
req, err := http.NewRequest("POST", apiRequestUrl, bytes.NewBuffer(stockPayload));
req.Header.Add("Content-Type", "application/json;charset=utf-8");
req.SetBasicAuth(os.Getenv("api.key"), "");
log.Printf("Request body: %s", string(stockPayload));
log.Printf("Request %s", req);
resp, err := client.Do(req);
if(err != nil) {
log.Fatal(err);
}
defer resp.Body.Close();
log.Printf("Response %s", resp);
}
Unfortunately, the return I get from server is not as expected:
2015/12/08 23:42:47 Request body: {"skus":[{"id":"ITEM1576","stockQuantity":995}]}
2015/12/08 23:42:47 Request &{POST http://api-sandbox.bonmarketplace.com.br/batch/sku/stock HTTP/1.1 %!s(int=1) %!s( int=1) map[Authorization:[Basic REMzRjAyNjUwNDE5RDAzQUJBNjEyM0E0QUZCMzJGQUQ6] Content-Type:[application/ json;charset=utf-8]] {{"skus":[{"id":"ITEM1576","stockQuantity":995}]}} %!s(int64=48) [] %!s(bool=false) api-sandbox. bonmarketplace.com.br map[] map[] %!s(*multipart.Form=<nil>) map[] %!s(*tls.ConnectionState=<nil>) %!s(<-chan struct {}=<nil>)}
2015/12/08 23:42:47 Response &{415 Unsupported Media Type %!s(int=415) HTTP/1.1 %!s(int=1) %!s(int=1) map[Server:[ nginx/1.7.5] Date:[Wed, 09 Dec 2015 01:40:18 GMT] Content-Type:[application/json;charset=utf-8] Content-Length:[163] Connection:[keep-alive] X-Access-Control-Realm:[external]] %!s(*http.bodyEOFSignal=&{0xc820122000 {0 0} false <nil> 0xd78a0 0xd7840}) %!s(int64=163) [] %!s(bool=false) map[] %!s(*http.Request=&{POST 0xc820064480 HTTP/1.1 1 1 map[Content- Type:[application/json;charset=utf-8] Authorization:[Basic REMzRjAyNjUwNDE5RDAzQUJBNjEyM0E0QUZCMzJGQUQ6]] {0xc82000e460} 48 [] false api-sandbox.bonmarketplace.com.br map[] map[] <nil> map[] <nil> <nil>}) %!s(*tls.ConnectionState=<nil>)}
Edit: inserted the post body(first line on program's output). If I run the request on Postman, with this body, it works as expected. Server does not check Accept
header, just the Content-Type
, which is already set to application/json;charset=utf-8
.
What am I doing wrong? I have spent the last hours looking into this, but no luck at all.