Luis Martins
Luis Martins

Reputation: 23

How to do a POST batch request in Miscrosoft Graph .NET SDK

I'm trying to do a batch request using MS Graph .NET SDK as shown here: https://learn.microsoft.com/en-us/graph/sdks/batch-requests?tabs=csharp The only problem is that when I run the code, nothing happens. I'm trying to move a set of emails (stored in a list) to another mail folder. Am I missing anything? The move request is here https://learn.microsoft.com/en-us/graph/api/message-move?view=graph-rest-1.0&tabs=http When used in a single query it works, but not when batching. Below you will find the code, in this case I'm looping to 20 just to test as 20 is the maximum queries per batch. Thanks in advance.

            for (int i = 0; i < 20; i++)
            {
                var mail = invalidMessages[i];

                var userRequest = client.Me.Messages[mail.Id]
                                            .Move(failureFolderID)
                                            .Request();

            requestID = batchRequestContent.AddBatchRequestStep(userRequest);
            }
            var returnedResponse = await client.Batch.Request().PostAsync(batchRequestContent);

EDIT: I tried to change the method to POST

userRequest.Method = System.Net.Http.HttpMethod.Post;

but I get a ServiceException: 'Code: BadRequest Message: Write request id : fe23b1c1-663d-4499-829a-291d04a12b48 does not contain Content-Type header or body.'

Upvotes: 2

Views: 1582

Answers (1)

Oluwakayode Dagbo
Oluwakayode Dagbo

Reputation: 191

The Microsoft Graph message-move API call you are attempting to use is a POST request

The Microsoft Batch API handles POST requests differently than the other API methods. As per https://learn.microsoft.com/en-us/graph/sdks/batch-requests?tabs=csharp

POST requests are handled a bit differently. The SDK request builders generate GET requests, so you must get the HttpRequestMessage and convert to a POST

To have a successful post with the batch API you need to

  1. Create an HttpRequestMessage
  2. provide a value for the HttpRequestMessage's Content property which houses the POST requests payload

So if I applied this to your code I would first create a class to represent the POST payload for the message-move API. As per https://learn.microsoft.com/en-us/graph/api/message-move?view=graph-rest-1.0&tabs=http

the POST API has one property called destinationId

destinationId - The destination folder ID, or a well-known folder name. For a list of supported well-known folder names, see mailFolder resource type.

     public class MailMovePayload
     {
       public string  destinationId { get; set; }
     }

then I would use an instance of this class in this modified version of you code

       string str = events.Content.ReadAsStringAsync().Result;
            events.Method = HttpMethod.Post;

            for (int i = 0; i < 20; i++)
            {
                var mail = invalidMessages[i];

                //get the request message object from your request
                var userRequestMessage = client.Me.Messages[mail.Id]
                                            .Move(failureFolderID)
                                            .GetHttpRequestMessage();
                //set the message API method  
                userRequestMessage.Method = HttpMethod.Post;
 
                //create the payload, I am assuming failureFolderID is
                //the name of the folder where the mail will be moved to
                var payloadData = new MailMovePayload { destinationId = failureFolderID };

                //make the JSON payload for the request message 
                userRequestMessage.Content = new StringContent(JsonConvert.SerializeObject(payloadData), Encoding.UTF8, "application/json")

                requestID = batchRequestContent.AddBatchRequestStep(userRequestMessage);
            }

            var returnedResponse = await client.Batch.Request().PostAsync(batchRequestContent);


            return httpRequestMessage;
        }

Upvotes: 3

Related Questions