Создать контакт возвращает HTTP 400 - Плохой запрос - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь создать контакт в офисе 365. Метод PostJson () выдает следующую ошибку.

Удаленный сервер возвратил ошибку: (400) Bad Request.

Я зарегистрировал приложение в Azure AD и получил необходимые разрешения.Я следовал этой статье .

Я использую WebAPI .Net Core.Ниже мой код.Любая помощь приветствуется.

public async Task<string> AcquireToken()
{
    var tenant = "red.onmicrosoft.com";
    var resource = "https://graph.microsoft.com/";
    var instance = "https://login.microsoftonline.com/";
    var clientID = "db19fbcc-d1e8-4d60-xxxx-xxxxxxxxxx";
    var secret = "EXh3MNe5tGW8+Jh1/3OXXXRvEKqdxuuXXXXXXX=";
    var authority = $"{instance}{tenant}";
    var authContext = new AuthenticationContext(authority);
    var credentials = new ClientCredential(clientID, secret);
    var authResult = await authContext.AcquireTokenAsync(resource, credentials);
    return authResult.AccessToken;
}

public static string PostJson(string token)
{
    Contact contact = new Contact()
    {
        givenName = "Pavel",
        surname = "Bansky"
    };

    contact.emailAddresses.Add(new emailAddresses()
    {
        address = "pavelb@doneitsoftware.com",
            name = "Pavel Bansky"
    });

    contact.businessPhones.Add("+1 732 555 0102");

    var jsonString = JsonConvert.SerializeObject(contact);

    string body = jsonString.ToString();

    HttpWebRequest hwr = (HttpWebRequest) WebRequest
        .CreateHttp("https://graph.microsoft.com/v1.0/me/contacts");
    hwr.Method = "POST";
    hwr.Headers.Add("Authorization", "Bearer " + token);
    hwr.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    hwr.ContentType = "application/json";
    var postData = Encoding.UTF8.GetBytes(body.ToString());

    using(var stream = hwr.GetRequestStream())
    {
        stream.Write(postData, 0, postData.Length);
    }
    WebResponse response = null;

    try
    {
        response = hwr.GetResponse();
        using(Stream stream = response.GetResponseStream())
        {
            using(StreamReader sr = new StreamReader(stream))
            {
                return sr.ReadToEnd();
            }
        }
    }
    catch (Exception e)
    {
        throw e;
    }
}

[HttpGet]
public async Task<ActionResult<IEnumerable<string>>> GetAsync()
{
    Office365Manager office = new Office365Manager();
    string aa = await office.AcquireToken();
    Office365Manager.PostJson(aa.ToString());
    return new string[] { "value1", "value2" };
}

1 Ответ

1 голос
/ 08 марта 2019

Одной из проблем в ваших кодах является то, что вы используете неправильный API, поскольку вы используете поток учетных данных клиента для получения токена доступа с использованием идентификатора приложения, вам следует использовать ниже api для создания контакта:

POST /users/{id | userPrincipalName}/contacts

Я проверяю ваши коды с объектами:

 public class Contact {
        public string givenName { get; set; }

        public string surname { get; set; }


        public List<emailAddresses> emailAddresses { get; set; }

        public List<string> businessPhones { get; set; }
    }

    public class emailAddresses {

        public string address { get; set; }

        public string name { get; set; }
    }

И все работает отлично.Пожалуйста, попробуйте изменить вызов API, если ошибка все еще возникает, предоставьте подробное / внутреннее сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...