You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:30:47