{"id":228,"date":"2013-04-16T10:00:44","date_gmt":"2013-04-16T09:00:44","guid":{"rendered":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?p=228"},"modified":"2013-07-16T10:07:40","modified_gmt":"2013-07-16T09:07:40","slug":"sharepoint-app-operaciones-basicas-utilizando-la-api-rest","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/","title":{"rendered":"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest"},"content":{"rendered":"<p><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-232\" alt=\"Office Application Challenge\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge-300x67.png\" width=\"300\" height=\"67\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge-300x67.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge.png 712w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Como cada vez queda menos para uno de los eventos que estamos organizando dentro de la comunidad de <strong>SharePoint<\/strong> y ese no es otro que el\u00a0<a title=\"Office &amp; SharePoint Application Challenge\" href=\"http:\/\/www.suges.es\/Paginas\/OfficeSharePoint_App_Challenge.aspx\" target=\"_blank\">Office &amp; SharePoint Application Challenge<\/a>\u00a0vamos a ir profundizando un poco sobre aspectos muy importantes para la realizaci\u00f3n de las APPS, vamos a realizar una serie de post (que comenzamos con el anterior de inicio de <a title=\"NAPA\" href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/2013\/04\/08\/office-365-introduccion-a-napa\/\" target=\"_blank\">NAPA<\/a>) y cuya finalidad tiene que los asistentes al evento tengan base para poder ir haciendo las APPs y para los que no asistan que sepan las grandes novedades que trae esta versi\u00f3n de como dice <a title=\"Juan Carlos\" href=\"https:\/\/twitter.com\/jcgm1978\" target=\"_blank\">Juan Carlos<\/a> nuestro servidor preferido.<\/p>\n<p>Una de las grandes novedades en esta versi\u00f3n como es sabido es el uso de la <strong>API REST<\/strong> en este\u00a0art\u00edculo\u00a0vamos a poner una demostraci\u00f3n de como hacer las operaciones b\u00e1sicas haciendo uso de la misma. Desde la consulta de listas, a\u00f1adir elementos en la misma, cambiar el nombre de la lista y eliminar la propia lista creada. Esto lo vamos a realizar desde dentro de una APP accediendo a las listas del sitio donde se aloja para ello tenemos que autentificando utilizando OAuth. Y veremos lo sencillo que es.<!--more--><\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/TipoProyectoVS.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-234\" title=\"Tipo Proyecto Visual Studio\" alt=\"TipoProyectoVS\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/TipoProyectoVS-300x278.png\" width=\"300\" height=\"278\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/TipoProyectoVS-300x278.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/TipoProyectoVS.png 304w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Esta demostraci\u00f3n la vamos a realizar contra un SharePoint Online, para ello en nuestro Visual Studio tendremos que tener instaladas las <a title=\"Office  Tools for Developer\" href=\"http:\/\/msdn.microsoft.com\/en-us\/office\/apps\/fp123627.aspx\" target=\"_blank\">Office Tools for Developer<\/a>. \u00a0Una vez las tenemos instaladas el primer paso es crearnos un Proyecto de APP de SharePoint y le tenemos que indicar que es una APP AutoHosted y a continuaci\u00f3n visualizamos un proyecto como el que tenemos en la imagen. Para este tipo de proyecto no vamos a realizar nada utilizando JavaScript por lo que la carpeta Scripts la podemos eliminar. Lo que vamos a realizar es colocar la estructura que queremos visualizar dentro del Default.aspx y dentro del code-behind a\u00f1adiremos las llamadas a la <strong>API Rest<\/strong>. Tambi\u00e9n conviene comentar la clase TokenHelper que ya viene en nuestro proyecto y es una clase que contiene una serie de clases para manejar el token de autentificaci\u00f3n de nuestra APP contra SharePoint de una forma semejante a la que se visualiza en la siguiente imagen:<\/p>\n<p><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/oAuth.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-241\" title=\"Autentificacion OData SharePoint 2013\" alt=\"oAuth\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/oAuth-300x147.png\" width=\"300\" height=\"147\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/oAuth-300x147.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/oAuth.png 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Esta es lo que tendr\u00edamos que a\u00f1adir en el Default.aspx, su c\u00f3digo no tiene mucha chicha son una serie de botones y una tabla en la que mostraremos las listas que tenemos en nuestro site.<\/p>\n<p>A continuaci\u00f3n, ya seria ponernos manos a la obra con los aspectos donde esta la chicha de la aplicaci\u00f3n. Para empezar nuestra APP una vez se cargue lo primero que vamos a hacer es mostrar las listas que tenemos en nuestro Site principal para ello tendr\u00edamos que hacer la siguiente funci\u00f3n:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n        \/\/This method retrieves all of the lists on the host Web.\r\n        private void RetrieveLists(string accessToken)\r\n        {\r\n            if (IsPostBack)\r\n            {\r\n                sharepointUrl = new Uri(Request.QueryString&#x5B;&quot;SPHostUrl&quot;]);\r\n            }\r\n            AddItemButton.Visible = false;\r\n            AddListItemBox.Visible = false;\r\n            DeleteListButton.Visible = false;\r\n            ChangeListTitleButton.Visible = false;\r\n            ChangeListTitleBox.Visible = false;\r\n            RetrieveListNameBox.Enabled = true;\r\n            ListTable.Rows&#x5B;0].Cells&#x5B;1].Text = &quot;List ID&quot;;\r\n\r\n            \/\/Add pertinent namespaces to the namespace manager.\r\n            xmlnspm.AddNamespace(&quot;atom&quot;, &quot;http:\/\/www.w3.org\/2005\/Atom&quot;);\r\n            xmlnspm.AddNamespace(&quot;d&quot;, &quot;http:\/\/schemas.microsoft.com\/ado\/2007\/08\/dataservices&quot;);\r\n            xmlnspm.AddNamespace(&quot;m&quot;, &quot;http:\/\/schemas.microsoft.com\/ado\/2007\/08\/dataservices\/metadata&quot;);\r\n            \/\/Execute a REST request for all of the site's lists.\r\n            HttpWebRequest listRequest =\r\n                (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/Web\/lists&quot;);\r\n            listRequest.Method = &quot;GET&quot;;\r\n            listRequest.Accept = &quot;application\/atom+xml&quot;;\r\n            listRequest.ContentType = &quot;application\/atom+xml;type=entry&quot;;\r\n            listRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n            HttpWebResponse listResponse = (HttpWebResponse)listRequest.GetResponse();\r\n            StreamReader listReader = new StreamReader(listResponse.GetResponseStream());\r\n            var listXml = new XmlDocument();\r\n            listXml.LoadXml(listReader.ReadToEnd());\r\n            var titleList = listXml.SelectNodes(&quot;\/\/atom:entry\/atom:content\/m:properties\/d:Title&quot;, xmlnspm);\r\n            var idList = listXml.SelectNodes(&quot;\/\/atom:entry\/atom:content\/m:properties\/d:Id&quot;, xmlnspm);\r\n            int listCounter = 0;\r\n            foreach (XmlNode title in titleList)\r\n            {\r\n                TableRow tableRow = new TableRow();\r\n                LiteralControl idClick = new LiteralControl();\r\n                \/\/Use Javascript to populate the RetrieveListNameBox control with the list id.\r\n                string clickScript = &quot;&lt;a onclick=&quot;\\&amp;quot;document.getElementById(\\'RetrieveListNameBox\\').value&quot; href=&quot;\\&amp;quot;#\\&amp;quot;&quot;&gt;&quot; + idList&#x5B;listCounter].InnerXml + &quot;&lt;\/a&gt;&quot;;\r\n                idClick.Text = clickScript;\r\n                TableCell tableCell1 = new TableCell();\r\n                tableCell1.Controls.Add(new LiteralControl(title.InnerXml));\r\n                TableCell tableCell2 = new TableCell();\r\n                tableCell2.Controls.Add(idClick);\r\n                tableRow.Cells.Add(tableCell1);\r\n                tableRow.Cells.Add(tableCell2);\r\n                ListTable.Rows.Add(tableRow);\r\n                listCounter++;\r\n            }\r\n        }\r\n<\/pre>\n<p>Explicando un poco este c\u00f3digo tenemos el Token para establecer la autentificaci\u00f3n este token lo veremos como lo obtenemos en el Load y lo explicare m\u00e1s adelante, con este token lo que hacemos es hacer la petici\u00f3n a la <strong>Api Rest \u00ab\/_api\/Web\/lists\u00bb<\/strong> Una vez obtenemos las listas del sitio las a\u00f1adimos a la table y las mostramos\u00a0quedar\u00eda\u00a0algo semejante a la siguiente pantalla:<\/p>\n<p style=\"text-align: center\"><a href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/ListasEnSitio.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-243 aligncenter\" title=\"Listas en el site\" alt=\"ListasEnSitio\" src=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/ListasEnSitio-300x256.png\" width=\"300\" height=\"256\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/ListasEnSitio-300x256.png 300w, https:\/\/encaminablogs.wpenginepowered.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/ListasEnSitio.png 742w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>A continuaci\u00f3n lo que vamos a realizar es ver como podemos crear Listas en nuestro Sitio para ello lo podemos hacer siguiendo esto c\u00f3digo<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n \/\/This method adds a list with the specified title.\r\n        private void AddList(string accessToken, string newListName)\r\n        {\r\n            if (IsPostBack)\r\n            {\r\n                sharepointUrl = new Uri(Request.QueryString&#x5B;&quot;SPHostUrl&quot;]);\r\n            }\r\n            try\r\n            {\r\n                \/\/Add pertinent namespace to the namespace manager.\r\n                xmlnspm.AddNamespace(&quot;d&quot;, &quot;http:\/\/schemas.microsoft.com\/ado\/2007\/08\/dataservices&quot;);\r\n                \/\/Execute a REST request to get the form digest. All POST requests that change the state of resources on the host\r\n                \/\/Web require the form digest in the request header.\r\n                HttpWebRequest contextinfoRequest =\r\n                    (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/contextinfo&quot;);\r\n                contextinfoRequest.Method = &quot;POST&quot;;\r\n                contextinfoRequest.ContentType = &quot;text\/xml;charset=utf-8&quot;;\r\n                contextinfoRequest.ContentLength = 0;\r\n                contextinfoRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n                HttpWebResponse contextinfoResponse = (HttpWebResponse)contextinfoRequest.GetResponse();\r\n                StreamReader contextinfoReader = new StreamReader(contextinfoResponse.GetResponseStream(), System.Text.Encoding.UTF8);\r\n                var formDigestXML = new XmlDocument();\r\n                formDigestXML.LoadXml(contextinfoReader.ReadToEnd());\r\n                var formDigestNode = formDigestXML.SelectSingleNode(&quot;\/\/d:FormDigestValue&quot;, xmlnspm);\r\n                string formDigest = formDigestNode.InnerXml;\r\n                \/\/Execute a REST request to add a list that has the user-supplied name.\r\n                \/\/The body of the REST request is ASCII encoded and inserted into the request stream.\r\n                string listPostBody = &quot;{'__metadata':{'type':'SP.List'}, 'Title':'&quot; + newListName + &quot;', 'BaseTemplate': 100}&quot;;\r\n                byte&#x5B;] listPostData = System.Text.Encoding.ASCII.GetBytes(listPostBody);\r\n                HttpWebRequest listRequest =\r\n                    (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/lists&quot;);\r\n                listRequest.Method = &quot;POST&quot;;\r\n                listRequest.ContentLength = listPostBody.Length;\r\n                listRequest.ContentType = &quot;application\/json;odata=verbose&quot;;\r\n                listRequest.Accept = &quot;application\/json;odata=verbose&quot;;\r\n                listRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n                listRequest.Headers.Add(&quot;X-RequestDigest&quot;, formDigest);\r\n                Stream listRequestStream = listRequest.GetRequestStream();\r\n                listRequestStream.Write(listPostData, 0, listPostData.Length);\r\n                listRequestStream.Close();\r\n                HttpWebResponse listResponse = (HttpWebResponse)listRequest.GetResponse();\r\n                RetrieveLists(accessToken);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                AddListNameBox.Text = e.Message;\r\n            }\r\n        }\r\n<\/pre>\n<p>Lo interesante de este c\u00f3digo, vemos la llamada a la API Rest pero de esta forma lo que estamos haciendo es un Create (para crear la lista), pero le pasamos el tipo de lista que vamos a crear y los campos que va a tener esto lo tenemos puesto en la variable <strong>listPostBody<\/strong>. Con este c\u00f3digo ya podemos crear listas utilizando la API Rest. Una vez la lista esta creada lo que hacemos es volver a llamar a la API Rest para ver las listas que hay en el Site y comprobamos que realmente se ha creado con \u00e9xito.<\/p>\n<p>Ahora cual seria el siguiente paso, podemos ver como consultamos los elementos a esta lista que nos hemos creado tambi\u00e9n se puede realizar de una forma muy sencillita:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n        \/\/This method retrieves all items from a specified list.\r\n        private void RetrieveListItems(string accessToken, Guid listId)\r\n        {\r\n            if (IsPostBack)\r\n            {\r\n                sharepointUrl = new Uri(Request.QueryString&#x5B;&quot;SPHostUrl&quot;]);\r\n            }\r\n            \/\/Adjust the visibility of controls on the page in light of the list-specific context.\r\n            AddItemButton.Visible = true;\r\n            AddListItemBox.Visible = true;\r\n            DeleteListButton.Visible = true;\r\n            ChangeListTitleButton.Visible = true;\r\n            ChangeListTitleBox.Visible = true;\r\n            RetrieveListNameBox.Enabled = false;\r\n            ListTable.Rows&#x5B;0].Cells&#x5B;1].Text = &quot;List Items&quot;;\r\n            \/\/Add pertinent namespaces to the namespace manager.\r\n            xmlnspm.AddNamespace(&quot;atom&quot;, &quot;http:\/\/www.w3.org\/2005\/Atom&quot;);\r\n            xmlnspm.AddNamespace(&quot;d&quot;, &quot;http:\/\/schemas.microsoft.com\/ado\/2007\/08\/dataservices&quot;);\r\n            xmlnspm.AddNamespace(&quot;m&quot;, &quot;http:\/\/schemas.microsoft.com\/ado\/2007\/08\/dataservices\/metadata&quot;);\r\n            \/\/Execute a REST request to get the list name.\r\n            HttpWebRequest listRequest =\r\n                (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/Web\/lists(guid'&quot; + listId + &quot;')&quot;);\r\n            listRequest.Method = &quot;GET&quot;;\r\n            listRequest.Accept = &quot;application\/atom+xml&quot;;\r\n            listRequest.ContentType = &quot;application\/atom+xml;type=entry&quot;;\r\n            listRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n            HttpWebResponse listResponse = (HttpWebResponse)listRequest.GetResponse();\r\n            StreamReader listReader = new StreamReader(listResponse.GetResponseStream());\r\n            var listXml = new XmlDocument();\r\n            listXml.LoadXml(listReader.ReadToEnd());\r\n            var listNameNode = listXml.SelectSingleNode(&quot;\/\/atom:entry\/atom:content\/m:properties\/d:Title&quot;, xmlnspm);\r\n            string listName = listNameNode.InnerXml;\r\n            \/\/Execute a REST request to get all of the list's items.\r\n            HttpWebRequest itemRequest =\r\n                (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/Web\/lists(guid'&quot; + listId + &quot;')\/Items&quot;);\r\n            itemRequest.Method = &quot;GET&quot;;\r\n            itemRequest.Accept = &quot;application\/atom+xml&quot;;\r\n            itemRequest.ContentType = &quot;application\/atom+xml;type=entry&quot;;\r\n            itemRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n            HttpWebResponse itemResponse = (HttpWebResponse)itemRequest.GetResponse();\r\n            StreamReader itemReader = new StreamReader(itemResponse.GetResponseStream());\r\n            var itemXml = new XmlDocument();\r\n            itemXml.LoadXml(itemReader.ReadToEnd());\r\n            var itemList = itemXml.SelectNodes(&quot;\/\/atom:entry\/atom:content\/m:properties\/d:Title&quot;, xmlnspm);\r\n            TableRow tableRow = new TableRow();\r\n            TableCell tableCell1 = new TableCell();\r\n            tableCell1.Controls.Add(new LiteralControl(listName));\r\n            TableCell tableCell2 = new TableCell();\r\n            foreach (XmlNode itemTitle in itemList)\r\n            {\r\n                tableCell2.Text += itemTitle.InnerXml + &quot;\r\n&quot;;\r\n            }\r\n            tableRow.Cells.Add(tableCell1);\r\n            tableRow.Cells.Add(tableCell2);\r\n            ListTable.Rows.Add(tableRow);\r\n        }\r\n<\/pre>\n<p>Como podemos ver a la vista del c\u00f3digo que hemos a\u00f1adido la \u00fanica diferencia es que hacemos la petici\u00f3n a una lista concreta y que mostramos solo el campo Title (para a\u00f1adir m\u00e1s campos es tan sencillo como concatenar el nombre de los mismos.<br \/>\nUna vez sabemos consultar estos elementos para finalizar el post nos quedar\u00eda mirar como podemos a\u00f1adir elementos a la lista para ello no es algo muy dif\u00edcil para ello bastar\u00eda con una funci\u00f3n como la siguiente:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n \/\/This method adds a list item to the specified list.\r\n        private void AddListItem(string accessToken, Guid listId, string newItemName)\r\n        {\r\n            if (IsPostBack)\r\n            {\r\n                sharepointUrl = new Uri(Request.QueryString&#x5B;&quot;SPHostUrl&quot;]);\r\n            }\r\n            try\r\n            {\r\n                \/\/Add pertinent namespaces to the namespace manager.\r\n                xmlnspm.AddNamespace(&quot;atom&quot;, &quot;http:\/\/www.w3.org\/2005\/Atom&quot;);\r\n                xmlnspm.AddNamespace(&quot;d&quot;, &quot;http:\/\/schemas.microsoft.com\/ado\/2007\/08\/dataservices&quot;);\r\n                xmlnspm.AddNamespace(&quot;m&quot;, &quot;http:\/\/schemas.microsoft.com\/ado\/2007\/08\/dataservices\/metadata&quot;);\r\n                \/\/Execute a REST request to get the form digest. All POST requests that change the state of resources on the host\r\n                \/\/Web require the form digest in the request header.\r\n                HttpWebRequest contextinfoRequest =\r\n                    (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/contextinfo&quot;);\r\n                contextinfoRequest.Method = &quot;POST&quot;;\r\n                contextinfoRequest.ContentType = &quot;text\/xml;charset=utf-8&quot;;\r\n                contextinfoRequest.ContentLength = 0;\r\n                contextinfoRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n                HttpWebResponse contextinfoResponse = (HttpWebResponse)contextinfoRequest.GetResponse();\r\n                StreamReader contextinfoReader = new StreamReader(contextinfoResponse.GetResponseStream(), System.Text.Encoding.UTF8);\r\n                var formDigestXML = new XmlDocument();\r\n                formDigestXML.LoadXml(contextinfoReader.ReadToEnd());\r\n                var formDigestNode = formDigestXML.SelectSingleNode(&quot;\/\/d:FormDigestValue&quot;, xmlnspm);\r\n                string formDigest = formDigestNode.InnerXml;\r\n                \/\/Execute a REST request to get the list name and the entity type name for the list.\r\n                \/\/The entity type name is the required type when you construct a request to add a list item.\r\n                HttpWebRequest listRequest =\r\n                    (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/Web\/lists(guid'&quot; + listId + &quot;')&quot;);\r\n                listRequest.Method = &quot;GET&quot;;\r\n                listRequest.Accept = &quot;application\/atom+xml&quot;;\r\n                listRequest.ContentType = &quot;application\/atom+xml;type=entry&quot;;\r\n                listRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n                HttpWebResponse listResponse = (HttpWebResponse)listRequest.GetResponse();\r\n                StreamReader listReader = new StreamReader(listResponse.GetResponseStream());\r\n                var listXml = new XmlDocument();\r\n                listXml.LoadXml(listReader.ReadToEnd());\r\n                var entityTypeNode = listXml.SelectSingleNode(&quot;\/\/atom:entry\/atom:content\/m:properties\/d:ListItemEntityTypeFullName&quot;, xmlnspm);\r\n                var listNameNode = listXml.SelectSingleNode(&quot;\/\/atom:entry\/atom:content\/m:properties\/d:Title&quot;, xmlnspm);\r\n                string entityTypeName = entityTypeNode.InnerXml;\r\n                string listName = listNameNode.InnerXml;\r\n\r\n                \/\/Execute a REST request to add an item to the list.\r\n                string itemPostBody = &quot;{'__metadata':{'type':'&quot; + entityTypeName + &quot;'}, 'Title':'&quot; + newItemName + &quot;'}}&quot;;\r\n                Byte&#x5B;] itemPostData = System.Text.Encoding.ASCII.GetBytes(itemPostBody);\r\n\r\n                HttpWebRequest itemRequest =\r\n                    (HttpWebRequest)HttpWebRequest.Create(sharepointUrl.ToString() + &quot;\/_api\/Web\/lists(guid'&quot; + listId + &quot;')\/Items&quot;);\r\n                itemRequest.Method = &quot;POST&quot;;\r\n                itemRequest.ContentLength = itemPostBody.Length;\r\n                itemRequest.ContentType = &quot;application\/json;odata=verbose&quot;;\r\n                itemRequest.Accept = &quot;application\/json;odata=verbose&quot;;\r\n                itemRequest.Headers.Add(&quot;Authorization&quot;, &quot;Bearer &quot; + accessToken);\r\n                itemRequest.Headers.Add(&quot;X-RequestDigest&quot;, formDigest);\r\n                Stream itemRequestStream = itemRequest.GetRequestStream();\r\n                itemRequestStream.Write(itemPostData, 0, itemPostData.Length);\r\n                itemRequestStream.Close();\r\n                HttpWebResponse itemResponse = (HttpWebResponse)itemRequest.GetResponse();\r\n                RetrieveListItems(accessToken, listId);\r\n            }\r\n            catch (Exception e)\r\n            {\r\n                AddListItemBox.Text = e.Message;\r\n            }\r\n<\/pre>\n<p>Para finalizar el post hay que mencionar el tema del Token, sin el token que es el encargado de autentificar nuestra APP contra <strong>SharePoint<\/strong> sin \u00e9l no podemos hacer nada como conseguimos este token pues es relativamente sencillo con esta linea de c\u00f3digo en el Load de la P\u00e1gina seria suficiente:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\n  TokenHelper.TrustAllCertificates();\r\n            string contextTokenString = TokenHelper.GetContextTokenFromRequest(Request);\r\n            if (contextTokenString != null)\r\n            {\r\n                contextToken =\r\n                    TokenHelper.ReadAndValidateContextToken(contextTokenString, Request.Url.Authority);\r\n                sharepointUrl = new Uri(Request.QueryString&#x5B;&quot;SPHostUrl&quot;]);\r\n                accessToken =\r\n                    TokenHelper.GetAccessToken(contextToken, sharepointUrl.Authority).AccessToken;\r\n}\r\n<\/pre>\n<p>Este ejemplo lo podemos descargar desde este <a href=\"http:\/\/code.msdn.microsoft.com\/office\/SharePoint-2013-Perform-335d925b\" target=\"_blank\">link de Micrososft<\/a><br \/>\n<strong>Conclusi\u00f3n<\/strong><br \/>\nEn este desarrollo hemos visto lo sencillo que es utilizar la API Rest, en este ejemplo podemos ver las operaciones b\u00e1sicas de acceso a datos (crear, leer, actualizar, eliminar). Es una base para ir cogiendo confianza sobre esta nueva forma de desarrollar.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>Como cada vez queda menos para uno de los eventos que estamos organizando dentro de la comunidad de SharePoint y ese no es otro que el\u00a0Office &amp; SharePoint Application Challenge\u00a0vamos a ir profundizando un poco sobre aspectos muy importantes para &hellip; <a href=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,11],"tags":[15,46,47,151],"class_list":["post-228","post","type-post","status-publish","format-standard","hentry","category-app","category-sharepoint-2013","tag-api-rest","tag-office365","tag-operaciones-basicas","tag-sharepoint-2013"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest - Desarrollando sobre SharePoint<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest - Desarrollando sobre SharePoint\" \/>\n<meta name=\"twitter:description\" content=\"Como cada vez queda menos para uno de los eventos que estamos organizando dentro de la comunidad de SharePoint y ese no es otro que el\u00a0Office &amp; SharePoint Application Challenge\u00a0vamos a ir profundizando un poco sobre aspectos muy importantes para &hellip; Continue reading &rarr;\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge.png\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Adri\u00e1n D\u00edaz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/#article\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/\"},\"author\":{\"name\":\"Adri\u00e1n D\u00edaz\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"headline\":\"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest\",\"datePublished\":\"2013-04-16T09:00:44+00:00\",\"dateModified\":\"2013-07-16T09:07:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/\"},\"wordCount\":2300,\"commentCount\":1,\"image\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2013\\\/04\\\/Office_Application_Challenge-300x67.png\",\"keywords\":[\"API Rest\",\"office365\",\"operaciones basicas\",\"sharepoint 2013\"],\"articleSection\":[\"APP\",\"sharepoint 2013\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/\",\"url\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/\",\"name\":\"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest - Desarrollando sobre SharePoint\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/#primaryimage\"},\"image\":{\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2013\\\/04\\\/Office_Application_Challenge-300x67.png\",\"datePublished\":\"2013-04-16T09:00:44+00:00\",\"dateModified\":\"2013-07-16T09:07:40+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"http:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2013\\\/04\\\/Office_Application_Challenge.png\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/wp-content\\\/uploads\\\/sites\\\/8\\\/2013\\\/04\\\/Office_Application_Challenge.png\",\"width\":712,\"height\":161,\"caption\":\"Office Application Challenge\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/\",\"name\":\"Desarrollando sobre SharePoint\",\"description\":\"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/#\\\/schema\\\/person\\\/c9bfaede1bfba9564bb7f500788782bb\",\"name\":\"Adri\u00e1n D\u00edaz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g\",\"caption\":\"Adri\u00e1n D\u00edaz\"},\"description\":\"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/desarrollandosobresharepoint\\\/author\\\/desarrollandosobresharepoint\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest - Desarrollando sobre SharePoint","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/","twitter_card":"summary_large_image","twitter_title":"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest - Desarrollando sobre SharePoint","twitter_description":"Como cada vez queda menos para uno de los eventos que estamos organizando dentro de la comunidad de SharePoint y ese no es otro que el\u00a0Office &amp; SharePoint Application Challenge\u00a0vamos a ir profundizando un poco sobre aspectos muy importantes para &hellip; Continue reading &rarr;","twitter_image":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge.png","twitter_misc":{"Escrito por":"Adri\u00e1n D\u00edaz","Tiempo de lectura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/#article","isPartOf":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/"},"author":{"name":"Adri\u00e1n D\u00edaz","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"headline":"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest","datePublished":"2013-04-16T09:00:44+00:00","dateModified":"2013-07-16T09:07:40+00:00","mainEntityOfPage":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/"},"wordCount":2300,"commentCount":1,"image":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge-300x67.png","keywords":["API Rest","office365","operaciones basicas","sharepoint 2013"],"articleSection":["APP","sharepoint 2013"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/#respond"]}]},{"@type":"WebPage","@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/","url":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/","name":"[SharePoint App] Operaciones b\u00e1sicas utilizando la API Rest - Desarrollando sobre SharePoint","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website"},"primaryImageOfPage":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/#primaryimage"},"image":{"@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge-300x67.png","datePublished":"2013-04-16T09:00:44+00:00","dateModified":"2013-07-16T09:07:40+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"http:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/sharepoint-app-operaciones-basicas-utilizando-la-api-rest\/#primaryimage","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge.png","contentUrl":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-content\/uploads\/sites\/8\/2013\/04\/Office_Application_Challenge.png","width":712,"height":161,"caption":"Office Application Challenge"},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#website","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/","name":"Desarrollando sobre SharePoint","description":"Arquitectura, buenas pr\u00e1cticas y desarrollo sobre la nueva herramienta de Microsoft SharePoint 2016","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/#\/schema\/person\/c9bfaede1bfba9564bb7f500788782bb","name":"Adri\u00e1n D\u00edaz","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fe10b9eaf8ce4565ec75fba5a0d121c16186696e515cad2bedd42f6cf54e2007?s=96&d=mm&r=g","caption":"Adri\u00e1n D\u00edaz"},"description":"Adri\u00e1n D\u00edaz es Ingeniero Inform\u00e1tico por la Universidad Polit\u00e9cnica de Valencia. Es MVP de Microsoft en la categor\u00eda Office Development desde 2014, MCPD de SharePoint 2010, Microsoft Active Profesional y Microsoft Comunity Contribuitor 2012. Cofundador del grupo de usuarios de SharePoint de Levante LevaPoint. Lleva desarrollando con tecnolog\u00edas Microsoft m\u00e1s de 10 a\u00f1os y desde hace 3 a\u00f1os est\u00e1 centrado en el desarrollo sobre SharePoint. Actualmente es Software &amp; Cloud Architect Lead en ENCAMINA.","url":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/author\/desarrollandosobresharepoint\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/comments?post=228"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/posts\/228\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/media?parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/categories?post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/desarrollandosobresharepoint\/wp-json\/wp\/v2\/tags?post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}