如何从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,所以能成功执行。
具体修改步骤
- 修正Content-Type请求头:把
application/x-www-form-urlencoded改成application/json,明确告诉服务器你发送的是JSON数据。 - 调整请求体编码方式:将
encode = "form"改为encode = "raw",或者直接去掉encode参数(当body是字符串且Content-Type为json时,httr会自动处理编码)。 - 简化认证参数: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
相关产品推荐
相关产品推荐

