Office 365 REST API - добавление контакта с JSON в C #

1

Я пытаюсь использовать Office API для синхронизации контактов из нескольких разных источников. У меня возникла проблема с попыткой сделать запрос POST с моим объектом JSON для создания нового контакта. Я смотрел страницы MSDN, но мне кажется, что я должен разъяснить Im относительно новое для С#, это мой первый раз, когда я пытаюсь использовать протоколы REST и асинхронные методы на С#.

У меня есть мой код ниже, я попытался создать класс, который добавит новый контакт с жестко закодированной строкой JSON. Я попробовал несколько различных способов попытаться выполнить этот запрос. Каждый запрос, который я попытался, дает мне ошибку 401 или 400. Я оставил пару строк, которые, по моему мнению, были ближе всего к решению, но если они не на правильном пути, у меня нет проблем с попыткой чего-то другого. Существует также функция, которая, я считаю, может быть полезна, но я не мог найти документацию о том, как ее использовать:

await client.Me.Contacts.AddContactAsync();

Снова я сказал, что я довольно новичок в этом, поэтому, если есть способ создать элемент IContact из JSON и использовать вышеупомянутый метод или просто передать JSON напрямую, это будет чрезвычайно полезно. Даже ссылки на документацию, которые могут быть полезны, мне бы очень хотелось увидеть. Im довольно застрял на этой проблеме Ive никогда не отправлял вопрос раньше, но Im stumped на этом.

Ниже приведена документация для API контактов, возможно, это будет иметь больше смысла для вас, ребята, чем я.

http://msdn.microsoft.com/en-us/library/office/dn792115(v=office.15).aspx

Если кто-нибудь может понять, как сделать почтовый запрос от этого JSON, он будет очень признателен.

using Microsoft.Office365.Exchange;
using Microsoft.Office365.OAuth;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows;
using System.Net.Http;
using System.Net.Http.Headers;

namespace ContactSynchronization
{
    class OfficeAPIWrite
    {
        private static string odata = "@odata.type";
        private static string type = "#Microsoft.Exchange.Services.OData.Model.Contact";


        const string ServiceResourceId = "https://outlook.office365.com";
        static readonly Uri ServiceEndpointUri = new Uri("https://outlook.office365.com/ews/odata/Me/Contacts");

        static string _lastLoggedInUser;
        static DiscoveryContext _discoveryContext;

        public static async Task OfficeWrite()
        {
            try
            {
                var client = await EnsureClientCreated();

                string json = new JavaScriptSerializer().Serialize(new
                {
                    odata = type,
                    GivenName = "Mara",
                    Surname = "Whitley",
                    EmailAddress1 = "[email protected]",
                    BusinessPhone1 = "425-555-1313",
                    Birthday = "1974-07-22T07:00:00Z"
                });

                try
                {
                    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, ServiceEndpointUri);
                    request.Content = new StringContent(json);
                    request.Headers.Add("Accept", "application/json;odata=minimalmetadata");
                    request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                }
                catch (System.Net.WebException e)
                {
                    MessageBox.Show(e.ToString());
                }
            }
            catch (Microsoft.Office365.OAuth.AuthenticationFailedException)
            {
                MessageBox.Show("Authentication Failed Exception was thrown");
            }
        }

        public static async Task<ExchangeClient> EnsureClientCreated()
        {
            if (_discoveryContext == null)
            {
                _discoveryContext = await DiscoveryContext.CreateAsync();
            }

            var dcr = await _discoveryContext.DiscoverResourceAsync(ServiceResourceId);

            _lastLoggedInUser = dcr.UserId;

            return new ExchangeClient(ServiceEndpointUri, async () =>
            {
                return (await _discoveryContext.AuthenticationContext.AcquireTokenSilentAsync(ServiceResourceId, _discoveryContext.AppIdentity.ClientId, new Microsoft.IdentityModel.Clients.ActiveDirectory.UserIdentifier(dcr.UserId, Microsoft.IdentityModel.Clients.ActiveDirectory.UserIdentifierType.UniqueId))).AccessToken;
            });
        }

        public static async Task SignOut()
        {
            if (string.IsNullOrEmpty(_lastLoggedInUser))
            {
                return;
            }

            if (_discoveryContext == null)
            {
                _discoveryContext = await DiscoveryContext.CreateAsync();
            }

            await _discoveryContext.LogoutAsync(_lastLoggedInUser);
        }
    }
}
Теги:
rest
post
office365

1 ответ

2

Ну, я думаю, я понял, что работает. Это использует ContactObject, который я создал, и newtonsoft JSON serializer. Я надеялся увидеть пример Microsoft ExchangeClient в действии, единственная причина, по которой я публикую это, - это помочь другим, у которых могут быть аналогичные проблемы с отправкой в офисный API, приведенный ниже код будет успешно работать. Я все еще смотрю, если кто-нибудь может показать мне правильный способ использования функций ExchangeClient.

    // your request must include these, and a given name,
    // everything else is optional
    private const string odata = "@odata.type";
    private const string type = "#Microsoft.Exchange.Services.OData.Model.Contact";

    public static async Task CreateContact(ContactObject officeContact, string userEmail, string userPassword)
    {
        var client = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Post, new Uri("https://outlook.office365.com/ews/odata/Me/Contacts"));

        // Add the Authorization header with the basic login credentials.
        var auth = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(userEmail + ":" + userPassword));
        request.Headers.Add("Accept", "application/json");
        request.Headers.Add("Authorization", auth);

        var createResponse = new JObject();
        createResponse[odata] = type; // this needs to be here for this to work
        if (!String.IsNullOrEmpty(officeContact.officeDisplayName)) createResponse["DisplayName"] = officeContact.officeDisplayName;
        if (!String.IsNullOrEmpty(officeContact.officeGivenName)) createResponse["GivenName"] = officeContact.officeGivenName;
        if (!String.IsNullOrEmpty(officeContact.officeMiddleName)) createResponse["MiddleName"] = officeContact.officeMiddleName;
        if (!String.IsNullOrEmpty(officeContact.officeNickName)) createResponse["NickName"] = officeContact.officeNickName;
        if (!String.IsNullOrEmpty(officeContact.officeSurname)) createResponse["Surname"] = officeContact.officeSurname;
        if (!String.IsNullOrEmpty(officeContact.officeEmailAddress1)) createResponse["EmailAddress1"] = officeContact.officeEmailAddress1;
        if (!String.IsNullOrEmpty(officeContact.officeEmailAddress2)) createResponse["EmailAddress2"] = officeContact.officeEmailAddress2;
        if (!String.IsNullOrEmpty(officeContact.officeEmailAddress3)) createResponse["EmailAddress3"] = officeContact.officeEmailAddress3;
        if (!String.IsNullOrEmpty(officeContact.officeHomePhone1)) createResponse["HomePhone1"] = officeContact.officeHomePhone1;
        if (!String.IsNullOrEmpty(officeContact.officeHomePhone2)) createResponse["HomePhone2"] = officeContact.officeHomePhone2;
        if (!String.IsNullOrEmpty(officeContact.officeBusinessPhone1)) createResponse["BusinessPhone1"] = officeContact.officeBusinessPhone1;
        if (!String.IsNullOrEmpty(officeContact.officeBusinessPhone2)) createResponse["BusinessPhone2"] = officeContact.officeBusinessPhone2;
        if (!String.IsNullOrEmpty(officeContact.officeMobilePhone1)) createResponse["MobilePhone1"] = officeContact.officeMobilePhone1;
        if (!String.IsNullOrEmpty(officeContact.officeOtherPhone)) createResponse["OtherPhone"] = officeContact.officeOtherPhone;
        if (!String.IsNullOrEmpty(officeContact.officeId)) createResponse["Id"] = officeContact.officeId;
        if (!String.IsNullOrEmpty(officeContact.officeCompanyName)) createResponse["CompanyName"] = officeContact.officeCompanyName;

        request.Content = new StringContent(JsonConvert.SerializeObject(createResponse));
        request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        var response = await client.SendAsync(request);

        try
        {
            response.EnsureSuccessStatusCode();
        }
        catch (System.Net.WebException)
        {
            MessageBox.Show("BAD REQUEST");
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню