2017-10-04 4 views
2

Je tente d'ajouter des membres à un groupe. Je peux lister tous les groupes dans mon organisation, obtenir l'utilisateur par email, obtenir tous les utilisateurs et Je peux même enlever un membre d'un groupe mais je ne peux pas ajouter un - L'erreur retournée est 400 Bad Request.Graph REST AddMember to Group - Demande incorrecte

Voici la fonction qui est la même signature de la fonction que ceux qui travaillent: (j'ai le accesstoken, id groupe valide et un identifiant de membre valide)

Je confirme les données du corps semble correct au moins aussi autant que je peux voir à partir du example in the docs.

Je ne sais pas ce que je peux ajouter à rendre les choses plus claires, demander et je vais mettre à jour

public async Task<string> AddGroupMember(string accessToken, string groupId, string memberId) 
{ 
    var status = string.Empty; 
    string endpoint = $"https://graph.microsoft.com/v1.0/groups/{groupId}/members/$ref"; 
    string queryParameter = ""; 

    // pass body data 
    var keyOdataId = "@odata.id"; 
    var valueODataId = $"https://graph.microsoft.com/v1.0/directoryObjects/{memberId}"; 

    var values = new List<KeyValuePair<string, string>> 
     { 
      new KeyValuePair<string, string>(keyOdataId, valueODataId) 
     }; 
    var body = new FormUrlEncodedContent(values); 

    try 
    { 
     using(var client = new HttpClient()) 
     { 
      using(var request = new HttpRequestMessage(HttpMethod.Post, endpoint + queryParameter)) 
      { 
       request.Content = body; 
       request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
       request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 

       using(var response = await client.SendAsync(request)) 
       { 
        if (response.StatusCode == HttpStatusCode.NoContent) 
         status = "Member added to Group"; 
        else 
         status = $"Unable to add Member to Group: {response.StatusCode}"; 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     status = $"Error adding Member to Group: {ex.Message}"; 
    } 

    return status; 
} 

Merci pour toute aide que tout le monde peut offrir - c'est le dernier appel que je dois faire puis la maison sans

+0

ajoute que la question pour tous ceux qui se soucient de savoir pour l'avenir: corps var = new FormUrl ... code est incorrect , ce qui est nécessaire est une simple chaîne JSON changé à ceci: corps var = new StringContent ("{\" "+ keyOdataId + "\": \ "" + valueODataId + "\"}", l'encodage. UTF8, "application/json"); un peu maladroit mais fonctionne – Tab

Répondre

2

trouvé le problème pour tous ceux qui se soucient de savoir pour l'avenir:

var body = new FormUrl... mon code est incorrect, ce qui est nécessaire est un simple js sur la chaîne a changé à cette MISE À JOUR:

var jsonData = [email protected]"{{ ""{keyOdataId}"": ""{valueODataId}"" }}"; var body = new StringContent(jsonData, Encoding.UTF8, "application/json");

Je mettriez normalement les valeurs dans une classe, mais cela est une preuve de concept et les besoins clé JSON pour ressembler exactement à ce @odata.id

2

Clarifier ce qui se passe ici:

Le corps de la demande pour cet appel doit être codé en JSON (application/json). La méthode FormUrlEncodedContent renvoie votre dictionnaire en tant que formulaire codé (application/x-www-form-urlencoded).

Vous pouvez écrire le JSON à la main (comme vous l'avez fait jusqu'à présent) mais une meilleure solution serait de tirer parti de Json.NET. Cela vous permettra de encode the dictionary de la même façon que vous étiez avec FormUrlEncodedContent:

var values = new Dictionary<string, string> 
    { 
     { keyOdataId, valueODataId} 
    }; 
var body = JsonConvert.SerializeObject(values); 

Si vous allez faire beaucoup de travail avec Microsoft Graph, je recommande vivement de passer à l'Microsoft Graph .NET SDK.

vous êtes ici méthode serait beaucoup plus simple à l'aide du SDK:

public async Task<string> AddGroupMember(string groupId, string memberId) 
{ 
    GraphServiceClient graphClient = AuthenticationHelper.GetAuthenticatedClient(); 
    User userToAdd = new User { Id = memberId }; 
    await graphClient.Groups[groupId].Members.References.Request().AddAsync(userToAdd); 
} 
+0

Je vais faire la conversion de json.net - Je fais une preuve de concept pour une future application pour voir comment tout fonctionne. Le SDK semble plus facile, merci pour le conseil et merci d'avoir répondu, cela me donne quelque chose à regarder quand nous faisons la vraie affaire. – Tab

+0

simplement en convertissant le var 'values' comme vous l'avez décrit n'est pas un gagnant: '[" "Key": "@ odata.id", "Value": "https://graph.microsoft.com/v1.0/directoryObjects/ee32df9c-6acc-453c-abb2-afb4380e364d "}]' devrait ressembler à ceci: '{ "@ odata.id":" https://graph.microsoft.com/v1.0/ directoryObjects/{id} " }' 2ème, vous ne pouvez pas sérialiser une collection dans le 'body' car le corps requiert un type de StringContent et pas seulement une chaîne – Tab

+0

Désolé, copiez et collez la mauvaise ligne. Vous devriez utiliser un Dictionary au lieu d'un List ). –