Drupal 8-9 REST PATCH提交带翻译节点报422验证错误如何解决?
可以通过一次PATCH请求完成多语言节点的提交,不需要分多次更新,你之前报错是因为请求体结构不符合Drupal REST接口的多语言提交规范。
报错原因
Drupal核心REST/JSON:API默认的单字段值校验逻辑不支持直接在字段数组内传入多语言值,可翻译字段的不同语言版本值不能放在顶层字段的数组内,所以会触发title字段不能存储超过1个值的422校验错误。
单请求提交多语言节点的实现方案
前置要求
- 后台已开启对应内容类型的翻译功能,且需要翻译的字段已勾选「允许用户翻译」
- 接口调用账号已分配以下权限:
- 管理内容翻译
- 对应内容类型的编辑权限
- 对应内容类型的翻译权限
- REST接口已启用Content资源的PATCH方法,接受JSON格式提交
请求配置
- 请求地址:
PATCH /entity/node/{{你的节点ID}} - 请求头:
Content-Type: application/json X-CSRF-Token: 你的请求csrf令牌 Authorization: 你的认证信息(如Basic Auth、Bearer令牌等,根据你的认证方式配置) - 请求体结构调整为如下格式:
const data = { "type": [{"target_id": "charset"}], // 源语言(这里示例为英文)的字段值 "langcode": [{"value": "en"}], "title": [{"value": sName1}], "field_unicode_range": [{"from": iFrom, "to": iTo}], // 所有其他语言的翻译内容统一放在translations字段下 "translations": { "ru": { "title": [{"value": sName2}] // 俄语版本的其他可翻译字段也放在此处 } // 需新增更多语言翻译时,直接在translations下加对应语言code为键的配置即可 } };
注意事项
- 如果字段是全站共享的非翻译字段,直接放在顶层结构即可,不需要在每个翻译里重复提交
- 不需要提前手动创建各语言的翻译版本,接口会自动根据translations的配置创建不存在的翻译
- 如果你用JSON:API接口,核心原生实现暂时不支持单请求提交多语言,需要配合第三方贡献模块才能实现,建议直接用上述REST接口方案更简单。
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

