Folder Maker 处理 POST 的 Web 脚本

Hello World Web Script 处理 GET HTTP 方法。但是如果你想在服务器上创建数据怎么办?为此,你的 Web 脚本应该处理 POST。

这是一个在 Company Home 中创建新文件夹的简单示例。通过使用看起来像这样的 JSON 主体进行 POST 调用来调用它:

{'name':'testfolder'}

(可选)你可以通过将标题或描述作为正文的一部分传递给文件夹,例如:

{
  'name':'testfolder',
  'title':'test title',
  'description':'test description'
}

描述符名为 foldermaker.post.desc.xml:

<webscript>
  <shortname>Folder Maker</shortname>
  <description>Creates folders</description>
  <family>Examples</family>
  <url>/example/folders</url>
  <format default="json"></format>
  <authentication>user</authentication>
</webscript>

可选的 family 元素是在 Web 脚本索引中对 Web 脚本进行分组的便捷方式。format 元素声明此 Web 脚本返回 JSON。

控制器名为 foldermaker.post.json.js:

var name = title = desc = null;

var name = json.get('name');

try {
  title = json.get('title');
} catch (err) {}

try {
  desc = json.get('description');
} catch (err) {}

var folder = companyhome.createFolder(name);

var needsSave = false;

if (title != null) {
  folder.properties['cm:title'] = title;
  needsSave = true;
}

if (desc != null) {
  folder.properties['cm:description'] = desc;
  needsSave = true;
}

if (needsSave) {
  folder.save();
}

model.id = folder.nodeRef.toString();
model.name = name;
model.title = title;
model.description = desc;

请注意,此控制器的名称中包含 json。这告诉 Alfresco 期望 JSON 有效载荷。Alfresco 将自动解析 JSON 并将其放在名为 json 的根变量中。

控制器从 JSON 中获取名称,标题和描述,并使用名为 companyhome 的根范围变量创建文件夹。

如果在这些属性中传递标题或描述,则保存。

在将控制权交给视图之前,在模型上设置传入的值以及新文件夹的节点引用。

该视图名为 foldermaker.post.json.ftl:

{
  <#if title??>
  "title": "${title}",
  </#if>
  <#if description??>
  "description": "${description}",
  </#if>
  "id": "${id}",
  "name": "${name}"
}

这个 freemarker 只是将模型上设置的值作为 JSON 回送。标题和描述可能并不总是存在,因此视图使用 if 语句中内置的 Freemarker null 检查来避免在未设置时返回那些。

任何 HTTP 客户端都可用于测试此 Web 脚本。这是使用 curl 的样子:

jpotts$ curl -uadmin:admin -H "content-type: application/json" -X POST "http://localhost:8080/alfresco/s/example/folders" -d "{'name':'testfolder','title':'test title', 'description':'test desc'}"
{
  "title": "test title",
  "description": "test desc"
  "id": "workspace://SpacesStore/cc26a12f-306b-41f1-a859-668f11fc2a54",
  "name": "testfolder"
}

请注意,curl 正在传递基本身份验证凭据。在这种情况下,它使用 admin。由于此示例在 Company Home 中创建项目,因此你必须使用具有相应权限的用户来执行此操作。

此 Web 脚本没有真正的错误检查。如果你未传入名称或传入已使用过的名称,则会看到错误。