2015-09-23 107 views
0

我想在SharePoint中使用下面的代码的项目添加到列表:C#添加项目到SharePoint列表使用REST API

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”:{ “类型”: “SP.Data.Test_x0020_ListListItem”}, “标题”: “测试”, “列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,它甾体抗炎药,我可以”得到的,更的accessToken,所以我用的用户名和密码登录的共享点,但这里涉及另外一个问题:

一个System.Net.WebExceptionvar resp = endpointRequest.GetResponse()被抛出,错误是说The remote server returned an error: (403) Forbidden.

该帐户是域管理员以及SharePoint管理员。

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

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

+1

您是否缺少网络凭证中的域名....? –

+0

@vinayakhegde我检查了用户名和密码,他们正确的相应的域名,我也尝试登录在Internet Explorer中使用该用户名和密码,它的工作原理... – User2012384

+1

我可以提供一个REST示例如果你喜欢,可以使用HttpClient上传文件。走这条路很容易。有什么理由不想使用休息吗?它与您正在做的相似,并且可以在任何地方使用,包括商店应用。 –

回答

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([email protected],overwrite='true')[email protected]='Project Photos'&@TargetFileName='TestUpload.jpg'", file); 
response.EnsureSuccessStatusCode(); 
if (response.IsSuccessStatusCode) 
{ } 
} 
相关问题