【问题标题】:C# Add item to Sharepoint list using REST APIC# 使用 REST API 将项目添加到 Sharepoint 列表
【发布时间】:2015-12-20 11:08:30
【问题描述】:

我想使用以下代码将项目添加到 sharepoint 中的列表:

protected string httpGetPost(string getPostMode, string url, string dataToPost = "")
{
    HttpWebRequest endpointRequest = (HttpWebRequest)WebRequest.Create(url);
    endpointRequest.Method = getPostMode;

    var credentialCache = new CredentialCache();
    credentialCache.Add(
      new Uri(endpointRequest.RequestUri.GetLeftPart(UriPartial.Authority)), // request url's host
      "Digest",  // authentication type 
      new NetworkCredential(userName, password) // credentials 
    );
    endpointRequest.Credentials = credentialCache;

    endpointRequest.Accept = "application/json;odata=verbose";
    endpointRequest.ContentType = "application/json;odata=verbose";

    if (!string.IsNullOrEmpty(dataToPost))
    {
        using (Stream dataStream = endpointRequest.GetRequestStream())
        {
            byte[] bs = Encoding.ASCII.GetBytes(dataToPost);
            dataStream.Write(bs, 0, bs.Length);
        }
    }
    using (var resp = endpointRequest.GetResponse())
    {
        var html = new StreamReader(resp.GetResponseStream()).ReadToEnd();
        return html;
    }
}

并使用以下代码调用上述方法:

httpGetPost("POST", url, "{\"__metadata\": { \"type\": \"SP.Data.Test_x0020_ListListItem\" }, \"Title\": \"Test\", \"Column B\", \"BBB\"}");

这是我发布的数据:

{"__metadata": { "type": "SP.Data.Test_x0020_ListListItem" }, "Title": “测试”、“B 列”、“BBB”}

我查看了这个网站https://msdn.microsoft.com/en-us/library/office/dn292552.aspx,但是授权不同,它使用了一个accesstoken,但问题是:

在这个网站:http://sharepoint.stackexchange.com/questions/69617/sharepoint-2013-oauth-url-to-get-token,它说我无法获取访问令牌,所以我使用用户名和密码登录共享点,但这里又出现了一个问题:

var resp = endpointRequest.GetResponse() 中抛出了一个System.Net.WebException,错误是The remote server returned an error: (403) Forbidden.

该帐户是域管理员和共享点管理员。

为什么我仍然收到 403 错误?

由于某些原因,我只能使用 REST API 与 sharepoint 进行通信。

【问题讨论】:

  • 您是否在网络凭据中缺少域名......?
  • @vinayakhegde 我已经检查了用户名和密码,它们使用适当的域名是正确的,我也尝试在 Internet Explorer 中使用该用户名和密码登录,它可以工作......
  • 如果您愿意,我可以提供一个使用 HttpClient 上传文件的 REST 示例。走这条路很容易。有什么理由你不想使用休息吗?它与您正在做的事情类似,可以在任何地方使用,包括商店应用程序。
  • @Arcan.NET 好的,我很想看看你的例子,我只能使用 REST API,因为我有一个项目本身不想使用共享点库的请求.

标签: c# rest sharepoint sharepoint-2013


【解决方案1】:

这是实现目标的一种略有不同的方法。在此示例中,某些对象特定于商店应用程序,但它们都可以轻松地替换为标准应用程序中的其他值。

 public string digest()
 {
 String retVal = "";
 try
 {
 string url = "https://YourSite.com/";
 HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
 client.BaseAddress = new System.Uri(url);
 string cmd = "_api/contextinfo";
 client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
 client.DefaultRequestHeaders.Add("ContentType", "application/json");
 client.DefaultRequestHeaders.Add("ContentLength", "0");
 StringContent httpContent = new StringContent("");
 var response = client.PostAsync(cmd, httpContent).Result;
 if (response.IsSuccessStatusCode)
 {
 string content = response.Content.ReadAsStringAsync().Result;
 JsonObject val = JsonValue.Parse(content).GetObject();
 JsonObject d = val.GetNamedObject("d");
 JsonObject wi = d.GetNamedObject("GetContextWebInformation");
 retVal = wi.GetNamedString("FormDigestValue");
 }
 }
 catch
 { }
 return retVal;
 }

 FileOpenPicker picker = new FileOpenPicker();
 picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
 picker.ViewMode = PickerViewMode.Thumbnail;
 // Filter to include a sample subset of file types.
 picker.FileTypeFilter.Clear();
 picker.FileTypeFilter.Add(".bmp");
 picker.FileTypeFilter.Add(".png");
 picker.FileTypeFilter.Add(".jpeg");
 picker.FileTypeFilter.Add(".jpg");
 // Open the file picker.
 StorageFile path = await picker.PickSingleFileAsync();
 if (path != null)
 {
 string url = "https://YourSite.com/Subsite/";
 HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
 client.BaseAddress = new System.Uri(url);
 client.DefaultRequestHeaders.Clear();
 client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
 client.DefaultRequestHeaders.Add("X-RequestDigest", digest());
 client.DefaultRequestHeaders.Add("X-HTTP-Method", "POST");
 client.DefaultRequestHeaders.Add("binaryStringRequestBody", "true");
 IRandomAccessStream fileStream = await path.OpenAsync(FileAccessMode.Read);
 var reader = new DataReader(fileStream.GetInputStreamAt(0));
 await reader.LoadAsync((uint)fileStream.Size);
 Byte[] content = new byte[fileStream.Size];
 reader.ReadBytes(content);
 ByteArrayContent file = new ByteArrayContent(content);
 HttpResponseMessage response = await client.PostAsync("_api/web/lists/getByTitle(@TargetLibrary)/RootFolder/Files/add(url=@TargetFileName,overwrite='true')?@TargetLibrary='Project Photos'&@TargetFileName='TestUpload.jpg'", file);
 response.EnsureSuccessStatusCode();
 if (response.IsSuccessStatusCode)
 { }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多