调用Shopify文章PUT接口传数组时返回406 Not Acceptable错误求助
解决Shopify Admin REST API(2022-10版本)PUT更新list.url类型metafield返回406错误的问题
问题根源
导致406 Not Acceptable错误的核心原因有两个:
1. 请求体根键格式错误
Shopify Admin REST API要求文章更新请求的根键为小写的article,但当前代码使用了大写的"Article",导致API无法正确解析请求体。
2. list.url类型metafield值格式不符合要求
Shopify REST API中,list.url类型的metafield值需要传递JSON序列化后的字符串,而非直接的字符串数组。你的结构体将Value定义为[]string,序列化后生成原生JSON数组,不符合API对list类型字段的格式要求。
修正后的代码
第一步:修正结构体定义
将ArticlePutMeta中的Value字段类型改为string:
type ArticlePut struct { Blog_id string `json:"blog_id"` ID string `json:"id"` Metafields []ArticlePutMeta `json:"metafields"` } type ArticlePutMeta struct { Key string `json:"key"` Value string `json:"value"` // 修改为string类型,存储JSON序列化后的数组字符串 Type string `json:"type"` Namespace string `json:"namespace"` }
第二步:修正请求体构建逻辑
将URL数组序列化为JSON字符串,并把请求根键改为小写的article:
func UploadArticleListImg(client *http.Client, ArticleIDs []string, imageURL []string, blogID string) { newArticleQueryFinal := fmt.Sprintf(newArticleQuery, blogID) for _, ID := range ArticleIDs { // 将URL数组序列化为JSON字符串 valueBytes, err := json.Marshal(imageURL) if err != nil { fmt.Println("序列化图片URL数组失败:", err) continue } valueStr := string(valueBytes) Article := &ArticlePut{ Blog_id: blogID, ID: ID, Metafields: []ArticlePutMeta{ { Key: "flip_book_images", Value: valueStr, Type: "list.url", Namespace: "custom", }, }, } spew.Dump(Article) // 修正根键为小写的"article" articleJSON, err := json.Marshal(map[string]interface{}{"article": Article}) if err != nil { fmt.Println("序列化请求体失败:", err) continue } articleReq, err := http.NewRequest("PUT", newArticleQueryFinal, bytes.NewReader(articleJSON)) articleReq.Header.Add("X-Shopify-Access-Token", token) articleReq.Header.Add("Content-Type", "application/json") resp, err := client.Do(articleReq) if err != nil { fmt.Println(err) continue } defer resp.Body.Close() // 记得关闭响应体 fmt.Println(resp.Status) body, err := io.ReadAll(resp.Body) if err != nil { fmt.Println(err) continue } sb := string(body) fmt.Println(sb) } }
补充说明
根据你提供的配置截图内容:
- 该metafield属于
custom命名空间,键为flip_book_images,类型为list.url,关联对象为文章,权限为商店和应用可读可写。 - Shopify文档对
list.url类型的定义是:用于存储URL数组,值必须是JSON格式的字符串数组(例如"[\"https://example.com/img1.jpg\", \"https://example.com/img2.jpg\"]")。
内容的提问来源于stack exchange,提问作者Sp3LLingzz
相关产品推荐
相关产品推荐

