Как создать контейнер в SoLiD?
У меня автономный однопользовательский 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?
2 ответа
Мне нужно было создать еще один почтовый ящик в моем профиле на сервере 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.
Забрал тело из оригинального почтового ящика.
Возвращаясь к этому, теперь я знаю немного больше о Solid, чтобы правильно ответить на этот вопрос.
Итак, вы сможете создать пустой контейнер, отправив
PUT
запрос с пустым телом к URL-адресу контейнера с добавленной косой чертой, указывающей, что это контейнер:
PUT https://my.server:8443/network/001/call/
.
К сожалению, на момент написания наиболее широко используемое в настоящее время программное обеспечение Solid server (Node Solid Server) не поддерживает это, поэтому в качестве временного решения требуется создание файла внутри него. Это работает, потому что в спецификации Solid явно указано, что также следует создавать промежуточные контейнеры.
(И, конечно, вы можете использовать библиотеку, которая абстрагирует это за вас .)
Ошибка, с которой вы столкнулись в начальном описании вопроса, похоже, была ошибкой в версии 4 NSS, которая к настоящему времени исправлена.