Office 365 REST API — Создание контакта дает мне HttpCode 400

#c# #.net #api #rest #office365

#c# #.net #API #rest #office365

Вопрос:

Я использую Office 365 Rest API, и у меня возникают проблемы при создании контакта:

Я делаю это:

 public async Task<bool> CreateContact(Contact contact)
    {
        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(_user   ":"   _password));
        request.Headers.Add("Accept", "application/json");
        request.Headers.Add("Authorization", auth);
        var createResponse = new JObject();
        createResponse["@odata.type"] = "#Microsoft.Exchange.Services.OData.Model.Contact";
        createResponse["DisplayName"] = contact.Name;
        createResponse["EmailAddress1"] = contact.Email;
        request.Content = new StringContent(JsonConvert.SerializeObject(createResponse), Encoding.UTF8, "application/json;odata.metadata=full");

        var response = await client.SendAsync(request);
        if (response.IsSuccessStatusCode)
        {
            return true;
        }
        return false;
    }
  

это дает мне

{System.FormatException: The format of value 'application/json;odata.metadata=full' is invalid.
at System.Net.Http.Headers.MediaTypeHeaderValue.CheckMediaTypeFormat(String mediaType, String parameterName)
at System.Net.Http.Headers.MediaTypeHeaderValue..ctor(String mediaType)
at System.Net.Http.StringContent..ctor(String content, Encoding encoding, String mediaType)
at SharePointPTSample.Office365.Office365Service.d__11.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at SharePointPTSample.ViewModels.EditContactViewModel.d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.b__3(Object state)}

но если я изменю значение «application / json;odata.metadata = full» на «application / json», это даст мне 400

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 0.0, Content: System.Net.Http.StreamContent, Headers:
{
Cache-Control: private
Server: Microsoft-IIS/8.0
request-id: 3679d732-ae03-4358-b256-3738cbf24030
X-CalculatedBETarget: dbxpr06mb352.eurprd06.prod.outlook.com
X-DiagInfo: DBXPR06MB352
X-BEServer: DBXPR06MB352
X-AspNet-Version: 4.0.30319
Set-Cookie: exchangecookie=daa5b4f2b05b422f8c5e99105e617429; expires=Sun, 05-Jul-2015 22:06:47 GMT; path=/; HttpOnly, X-BackEndCookie=< removed it for post>; expires=Mon, 04-Aug-2014 22:06:47 GMT; path=/ews; secure; HttpOnly
X-Powered-By: ASP.NET
X-FEServer: AMXPR05CA0040
Date: Sat, 05 Jul 2014 22:06:47 GMT
Content-Length: 567
Content-Type: application/json; odata.metadata=minimal; odata.streaming=true; IEEE754Compatible=false; charset=utf-8
}}

Я перехожу по этой ссылке

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

Чего не хватает? Я не понял :/

У меня работают Delete, Update и getContacts.

Полный исходный код находится здесь:https://github.com/saramgsilva/Office365RESTAPISample

Комментарии:

1. Сара, поскольку вы получаете неверный запрос, мне было интересно, есть ли в auth специальный символ из данных, преобразуемых в строку base64

2. but if I do Почему бы вам просто не сказать, что вы изменили, и не заставить нас прочитать весь код построчно.

3. В первом примере я использую:»application / json;odata.metadata = full», а во втором я использую «application / json»… @Ken с base64 все в порядке, я тоже получил его в fiddler … у меня он работает для удаления, обновления и получения контактов….

Ответ №1:

сарамсильва, спасибо, что попробовали API. Я попробовал ваш код и еще пару вещей. 1. Вам нужно указать заголовок ContentType как application / json. Оставьте часть odata. 2. После того, как вы укажете это, вы бы увидели следующую проблему, которая заключается в том, что требуется указать имя. Как только вы предоставите эти два, вы должны получить 201.

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

Комментарии:

1. НАКОНЕЦ-ТО!!!!!! : D ахахах, действительно здорово, на данный момент у меня есть: Create, Delete, Update и getContacts, которые работают! Действительно хорошо для того, что я хочу в своей демо-версии, и REST API больше подходит для того, что я хочу, а не для предварительного просмотра Office API …. просто обновил им свой репозиторий. Как только я смогу, я буду работать с этим примером… Я думаю, что в документации требуется более подробная информация о том, как ее использовать, больше примеров … 🙂 Также опубликую ее в примерах MSDN, но сейчас нужно закончить мою презентацию…

2. Рад, что это работает, Saramgsilva. Спасибо за отзыв о примерах.