3

我正在运行一个独立的单用户 v5 Node Solid Server。当我以该单个用户身份登录时,我可以在一个不存在的容器中创建一个文档,并且服务器会为我创建容器。

例如

POST https://my.server:8443/network/001/call/call-001

@prefix c0: <http://example.org/foo/call#> .
@prefix foo: <http://example.org/foo/> .

<https://my.server:8443/network/001/call/call-0001>
  a foo:call;
  c0:caller "401-555-0001";
  c0:created "2019-05-02T19:54:10.007Z";
  c0:id "call-0001";
  c0:network-id "001";
  c0:receiver "555-555-0002";
  c0:updated "2019-05-02T19:54:10.007Z” .

当我将它发布到我自己的单用户服务器时,容器/network/001/call不存在,它会为我创建它。但是当我将它发布到一个 Inrupt 服务器(我拥有 POD,但不是服务器,并且它不是单用户模式)时,我收到一个错误:

500:补丁后写入文件失败:错误:ENOENT:没有这样的文件或目录,打开'/var/solid/user.inrupt.net/network/001/call/call-001'

所以 - 我很好奇为什么它在一种情况下创建容器而不是另一种情况,但我认为短期内的答案也是我应该在将东西放入容器之前明确创建容器。不幸的是,目前面向任务的文档似乎有点缺乏,因此这个问题的标题是 - 如何POST ...在 SoLiD 服务器上创建容器(?)?

4

2 回答 2

0

回到这一点,我现在对 Solid 有了更多的了解,以便能够正确回答这个问题。

因此,您应该能够通过向 Container URL 发送一个PUT带有空正文的请求来创建一个空 Container,并在后面附加一个斜杠以指示它是一个 Container: PUT https://my.server:8443/network/001/call/

不幸的是,在撰写本文时,目前使用最广泛的 Solid 服务器软件(Node Solid Server)不支持此功能,因此需要在其中创建一个文件作为解决方法。这是可行的,因为 Solid 规范明确规定也应该创建中间容器。

(当然,您可以使用一个为您抽象的库。)

您在最初的问题描述中遇到的错误似乎是 NSS v4 中的一个错误,现已修复。

于 2020-12-16T14:24:50.703 回答
0

我需要在 inrupt.net Solid 服务器(Solid 5.6.3当时的版本)上的个人资料中创建另一个收件箱。我尝试了这样的 PUT 请求并且它有效:

PUT /inbox2 HTTP/1.1
Cookie: (cookie from browser where I'm logged in)
Link: <.acl>; rel="acl", <.meta>; rel="describedBy", <http://www.w3.org/ns/ldp#Container>; rel="type", <http://www.w3.org/ns/ldp#BasicContainer>; rel="type"
Content-Type: text/turtle
Host: inbox2.inrupt.net
Content-Length: 274
@prefix : <#>.
@prefix inbox: <>.
@prefix ldp: <http://www.w3.org/ns/ldp#>.
@prefix terms: <http://purl.org/dc/terms/>.
@prefix XML: <http://www.w3.org/2001/XMLSchema#>.
@prefix st: <http://www.w3.org/ns/posix/stat#>.
inbox:
a ldp:BasicContainer, ldp:Container.

我从原始收件箱中取出了尸体。

于 2021-02-07T11:35:06.457 回答