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

如何从R向AEM JCR发送JSON格式的POST请求?

解决R中调用AEM JCR API创建节点的412 Precondition Failed错误

折腾三周确实够让人头疼的,咱们从你Postman成功但R失败这个点入手,核心问题大概率是请求头和请求体的编码方式不匹配,咱们一步步来调整:

问题根源分析

你在R代码里设置了Content-Type: application/x-www-form-urlencoded,同时用encode = "form"处理请求体,但实际发送的是JSON格式数据。AEM的import操作期望接收raw JSON,这种格式不匹配直接导致服务器无法解析请求,返回了412预条件失败。而Postman里你应该是正确设置了Content-Type: application/json,所以能成功执行。

具体修改步骤

  1. 修正Content-Type请求头:把application/x-www-form-urlencoded改成application/json,明确告诉服务器你发送的是JSON数据。
  2. 调整请求体编码方式:将encode = "form"改为encode = "raw",或者直接去掉encode参数(当body是字符串且Content-Type为json时,httr会自动处理编码)。
  3. 简化认证参数:httr的authenticate函数不需要命名参数,直接传用户名和密码更清晰(这不是核心问题,但能让代码更规范)。

修改后的R代码示例

library(httr)
library(purrr)

# 目标URL保持不变
aem_stage_url <- "http://aem-stage-xxxx.mydomain.com:4502/content/myorganization/en?:contentType=json&:nameHint=mynode&:operation=import"

# 你的JSON内容(用单引号包裹避免转义问题)
json_str <- '{"content":{"jcr:content":{"cq:designPath":["/etc/designs/myorg"],"cq:template":["/apps/myorg/templates/mynode"],"sling:resourceType":["myorg/components/pages/mynode"],"hideInNav":["true"],"jcr:primaryType":["cq:PageContent"],"jcr:title":["Node Name"]}}}'

safe_POST <- purrr::safely(httr::POST)
aem_res <- safe_POST(
  url = aem_stage_url,
  add_headers("Content-Type" = "application/json"),
  authenticate("myuser", "mypassword", type = "basic"),
  body = json_str,
  encode = "raw",
  verbose(data_out = TRUE, info = TRUE)
)

# 查看响应结果
if (!is.null(aem_res$result)) {
  print(content(aem_res$result, "parsed"))
} else {
  print("请求出错:")
  print(aem_res$error)
}

额外验证点

  • 确认JSON格式没问题:你用的数组格式(比如"jcr:title":["Node Name"])符合AEM JCR多值属性的要求,这部分是正确的。
  • 对比Postman的请求细节:打开Postman右上角的"Code"功能,选择"R - httr",直接对比生成的代码和你写的代码,能快速定位差异点。

这样调整后,应该就能成功创建节点了。

内容的提问来源于stack exchange,提问作者Abe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:06:19