1

我正在尝试为 Nextcloud 编写一个工具。

它从另一个数据库中读取一些信息,然后在 Nextcloud 中创建一个新用户,创建一个共享文件夹并将一些文件复制到新文件夹中。为此,我使用了 Nextcloud 的 API。

该工具是用 C# 编写的,并使用 HttpWebRequest 将数据发送到服务器。大多数事情都很好,但是在创建新用户时,我无法设置用户的电子邮件地址。所以我尝试了 API 中的另一种方法来更新现有用户。

要更新用户,我必须使用 PUT 方法将键值对中的数据发送到服务器。有关 API 信息,请参见此处

string mail = "key='email' value='e@mail.us'";
        byte[] data = Encoding.ASCII.GetBytes(mail);

        string requestURL = $"https://nc.example.com/ocs/v1.php/cloud/users/USERNAME";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL);
        request.ContentType = "text/plain";
        request.Method = "PUT";
        request.ContentLength = data.Length;
        request.KeepAlive = true;
        request.Headers.Add("OCS-APIRequest", "true");
        request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"USERNAME:PASSWORD")));

        Stream dataStream = request.GetRequestStream();
        dataStream.Write(data, 0, data.Length);
        dataStream.Close();
        HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();
        Console.WriteLine("" + webResponse.StatusCode);
        StreamReader sr = new StreamReader(webResponse.GetResponseStream());
        String result = sr.ReadToEnd();
        Console.Write(result);

在 Nextcloud 文档中有一个例子可以做到这一点

PUT http://admin:secret@example.com/ocs/v1.php/cloud/users/Frank -d key="email" -d value="franksnewemail@example.org"

但我不知道如何创建键值对以将其发送到服务器。

任何人的想法?

提前致谢!

r3d007

编辑:当我给你相应的 cURL 命令时,也许会更容易:

curl -u USER:PW -d key="email" -d value="user@mail.us" -X PUT 'https://nc.example.com/ocs/v1.php/cloud/users/USERNAME' -H "OCS-APIRequest: true"

再次......提前谢谢!

4

2 回答 2

1

我想到了。

我通过 NuGet 安装了 RestSharp。

然后这对我有用:

        RestClient rc = new RestClient($"{URL}{UserAPI}/{user}");
        rc.Authenticator = new HttpBasicAuthenticator(Username, Password);
        RestRequest rr = new RestRequest(Method.PUT);
        rr.AddHeader("OCS-APIRequest", "true");
        rr.AddParameter("key", "email");
        rr.AddParameter("value", email);
        var response = rc.Execute(rr);

感谢您的帮助!

于 2018-09-24T06:52:59.483 回答
0

您需要创建一个具有键值属性的对象

public class foo {

    public string key { get; set; }
    public string mail { get; set; }

}

并将其序列化为您的数据

于 2018-09-21T11:10:25.417 回答