Maison >développement back-end >Golang >Comment publier sur une API avec Content-Type : multipart/form-data à l'aide de paramètres []byte et d'arguments de chaîne ?
Publication sur une API avec Content-Type : multipart/form-data
Lors d'une tentative de POST sur une API nécessitant un type de contenu : multipart/form-data, vous pouvez rencontrer des problèmes si vous utilisez des paramètres []byte et des arguments de chaîne. Le message d'erreur fourni indique un problème de redirection, qui n'est pas lié au problème en question.
La solution réside dans la construction du corps de la requête multipart/form-data à l'aide du package multipart. Voici un exemple :
<code class="go">package main import ( "bytes" "fmt" "io" "io/ioutil" "mime/multipart" "net/http" "github.com/ganshane/typeregistry" ) type FileItem struct { Key string //image_content FileName string //test.jpg Content []byte //[]byte } func NewPostFile(url string, paramTexts map[string]interface{}, paramFile FileItem) ([]byte, error) { // Construct the multipart request body bodyBuf := &bytes.Buffer{} bodyWriter := multipart.NewWriter(bodyBuf) for k, v := range paramTexts { bodyWriter.WriteField(k, v.(string)) } fileWriter, err := bodyWriter.CreateFormFile(paramFile.Key, paramFile.FileName) if err != nil { fmt.Println(err) //fmt.Println("Create form file error: ", error) return nil, err } fileWriter.Write(paramFile.Content) contentType := bodyWriter.FormDataContentType() bodyWriter.Close() fmt.Println(bodyBuf.String()) // Perform the POST request resp, err := http.Post(url, contentType, bodyBuf) if err != nil { return nil, err } defer resp.Body.Close() fmt.Println(resp) // Handle the response if resp.StatusCode < 200 || resp.StatusCode >= 300 { b, _ := ioutil.ReadAll(resp.Body) return nil, fmt.Errorf("[%d %s]%s", resp.StatusCode, resp.Status, string(b)) } respData, err := ioutil.ReadAll(resp.Body) if err != nil { return nil, err } fmt.Println(string(respData)) return respData, nil } func main() { m := make(map[string]interface{}, 0) m["fileName"] = "good" m["name"] = typeregistry.Base64ToByte("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDHooor+wD+Zz//2Q==") paramFile := FileItem{ Key: "image_content", FileName: "test.jpg", Content: m["name"].([]byte), } respData, err := NewPostFile("API_URL", m, paramFile) if err != nil { // Handle error } fmt.Println(string(respData)) } </code>
Dans cet exemple, nous avons utilisé la fonction NewPostFile pour construire une requête POST avec des données multipart/form, comprenant à la fois des champs de formulaire normaux et un fichier. La fonction prend l'URL, une carte d'arguments de chaîne et un élément de fichier en entrée.
La réponse de l'API peut être récupérée à partir de la variable respData et traitée selon les besoins. Le code de gestion des erreurs et des réponses est laissé au développeur à mettre en œuvre en fonction de ses exigences spécifiques.
Cette solution devrait résoudre le problème que vous rencontrez lors du POST sur l'API à l'aide de Content-Type : multipart/form-data. avec []paramètres d'octet et arguments de chaîne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!