2017-03-15 8 views
1

전자 메일 범주를 업데이트하려고 시도하고 있으며 Outlook 365 APIHttpClient의 도움으로 읽은 상태로 표시하려고합니다. 다음은 this tutorial입니다.C에서 Office 365 API 및 HttpClient로 이메일 카테고리를 업데이트하는 중에 잘못된 요청 오류가 발생했습니다.

튜토리얼에서 코드는 다음과 같이 카테고리를 업데이트하고 읽음으로 표시 할 수 있지만이 내용을 HttpClient에 첨부하여 요청해야하는 것은 아닙니다.

PATCH https://outlook.office.com/api/v2.0/me/messages/AAMkAGE0Mz8S-AAA= 
Content-Type: application/json 

{ 
"Categories": [ 
"Orange category", 
"Green category" 
], 
"IsRead": true 
} 

방법 및 HttpClient를 내가 사용은 다음과 같습니다 :

업데이트 그것은 Bad Request 오류를 던지고 1

public string UpdateCategory(AuthenticationResult result, string mediator) 
    { 
    //HTTPMethod.PATCH not available to adding it manualy. 
    var httpMethod = new HttpMethod("PATCH"); 
    HttpRequestMessage request = new HttpRequestMessage(httpMethod, mediator); 
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); 
    //JSON in a string variable for test 
    var tempJson = @"{""Categories"" : ""Checking""}"; 
    Converting string to JSON 
    var jsonData = JsonConvert.SerializeObject(tempJson); 
    //Adding the JSON to request.Content 
    request.Content =new StringContent(jsonData,Encoding.UTF8, "application/json"); 
    HttpResponseMessage response = httpClient.SendAsync(request).Result; 
    if (!response.IsSuccessStatusCode) 
    throw new WebException(response.StatusCode.ToString() + ": " + response.ReasonPhrase); 
    mediator = response.Content.ReadAsStringAsync().Result; 
    return mediator; 
    } 

.

저는 365 API를 WPF 응용 프로그램과 함께 사용하고 있습니다. 제발 조언.

답변

0

마지막으로 해결책을 얻었습니다. 여기는 나와 같은 초보자를위한 것입니다. 내가 Bad Request 오류가 발생 된 몸 PATCH와 API를 요청하면

- 오류를했습니다 무엇

.

내가 잘못하고 있었다 - 나는 테스트 전망 (365) API에 대한 this 멋진 도구를 사용하여 내 요청을 평가

, 나는이었다 오류를 알게

"error": { 
    "code": "RequestBodyRead", 
    "message": "An unexpected 'PrimitiveValue' node was found when reading from the JSON reader. A 'StartArray' node was expected." 
} 

이 오류는 I 의미 잘못된 데이터를 보냈습니다. List<string>string을 보냈습니다. 이것은 정말로 어리석은 일이다. 그러나 그것은 올바르게 일어난다? ;)

그래서 고정 된 문자열로 JSON을 전달하는 대신이 문제를 해결하려면 다음과 같이 List<string> 속성을 가진 클래스를 만들어 원하는대로 범주를 입력 할 수있는 유연성을 갖도록했습니다.

public class ChangeEmailCategory 
{ 
    public List<string> Categories { get; set; } 

} 

그리고 여기에 최종 방법이 있습니다.

//Passing parameters - AuthenticationResult, URI with authentication header, List of categories. 
public string UpdateCategory(AuthenticationResult result, string uriString,List<string> categories) 
    { 
     //HTTPMethod.PATCH not available so adding it manualy. 
     var httpMethod = new HttpMethod("PATCH"); 
     HttpRequestMessage request = new HttpRequestMessage(httpMethod, uriString); 
     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); 
     ChangeEmailCategory cec = new ChangeEmailCategory(); 
     cec.Categories = categories; 
     //Serializing class properties as JSON 
     var jsonData = JsonConvert.SerializeObject(cec); 
     //Adding JSON to request body 
     request.Content =new StringContent(jsonData,Encoding.UTF8, "application/json"); 
     HttpResponseMessage response = httpClient.SendAsync(request).Result; 
     if (!response.IsSuccessStatusCode) 
      throw new WebException(response.StatusCode.ToString() + ": " + response.ReasonPhrase); 
     return response.Content.ReadAsStringAsync().Result; 
    } 

여기는 메소드 호출입니다.

List<string> categories = new List<string>(); 
categories.Add("Checking"); 
//utility is my class containing method 
utility.UpdateCategory(result, categoryChangeUri, categories); 

그게 전부입니다! 나는 그것을 배우고 알아 내기 위해 어느 날 나를 필요로했다. Stack Overflow와 Google에 대한 모든 게시물 덕분에 언급했지만 기억하지는 않습니다.

누구든지 이에 관한 추가 정보가 필요하면 알려 주시기 바랍니다. 그냥 코멘트에 나를 언급. 나는 도우려고 노력할 것이다.