Hi, I'm working on creating a CLI tool for importing and exporting APIs between different environments (for WSO2 API Manager 3.0.0) using Golang.
I have an issue with importing APIs. The following curl command works fine. *`curl -k -F "[email protected]" -X PUT -H "Authorization: Bearer <access_token>" https://localhost:9292/api/am/publisher/v1.0/import/apis <https://localhost:9292/api/am/publisher/v1.0/import/apis>`* The problem is with mapping this to Go code. Here's what I wrote at first. func main() { data, err := os.Open("./exported.zip") accessToken := "<access_token>" if err != nil { fmt.Println("Error oening file") panic(err) } req, reqErr := http.NewRequest(http.MethodPut, " https://localhost:9292/api/am/publisher/v1.0/import/apis", data) if reqErr != nil { fmt.Println("Error creating request") panic(reqErr) } req.Header.Add("Content-Type", "multipart/form-data") // response is 500 with or without this line req.Header.Add("Authorization", "Bearer "+accessToken) tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // for skipping errors in https } client := &http.Client{Transport: tr} res, resErr := client.Do(req) if resErr != nil { fmt.Println("Error in response") panic(resErr) } body, err := ioutil.ReadAll(res.Body) fmt.Println("Response:", res) fmt.Println("Body:", string(body)) fmt.Println("Status:", res.Status) defer res.Body.Close() } This returns a *500 Internal Server Error.* But the request works fine with *Postman* client. Therefore, I tried putting the extra headers generated by Postman in Go code. func main() { url := "https://localhost:9292/api/am/publisher/v1.0" accessToken := "<access_token>" payload := strings.NewReader("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"; filename=\"./exported.zip\"\r\nContent-Type: application/zip\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--") req, _ := http.NewRequest(http.MethodPut, url, payload) req.Header.Add("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW") req.Header.Add("authorization", "Bearer "+accessToken) req.Header.Add("cache-control", "no-cache") tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // for skipping errors in https } client := &http.Client{Transport: tr} resp, _ := client.Do(req) if resp != nil { body, _ := ioutil.ReadAll(resp.Body) fmt.Println(resp) fmt.Println(string(body)) } else { fmt.Println("Null Response") } fmt.Println(resp.Status) } This returns a *405 - Method Not Allowed* So, Postman works. Curl works. Go does not. I googled on 'multipart/form-data' under HTTP, but that didn't help either. Your advice is much appreciated in solving this issue. Thanks and Regards *Menuka Warushavithana* *Software Engineering Intern* *WSO2* *Moblie: + <%2B%2094%2011%202145345%20%C2%A0Ext.%205737> 94 77 6979690*
_______________________________________________ Dev mailing list [email protected] http://wso2.org/cgi-bin/mailman/listinfo/dev
