Hi folks,
I have a Power App that includes functionality where a user can search a large sharepoint document library. I followed Reza Dorrani's guide on using the Office365Groups connector and the httprequest functionality, but have now learned that this is deprecated and I wish to replace this before my app breaks.
I have attempted to transition my old code across to the HTTP with Microsoft Entra ID (preauthorized) connector and I'm attempting to perform an Invoke an HTTP Action but cannot figure out why I consistently get a "badRequest - the call failed, please try again" error.
I'm hoping one of you Power Apps geniuses can cast your eyes over this code and find my mistake(s):
UpdateContext({searchPerformed: false});
// Construct the request body JSON
Set(varRequestBody, "{
""requests"": [
{
""entityTypes"": [
""driveItem""
],
""query"": {
""queryString"": ""title:\"""& txtSearchbox.Text &"\"" AND isDocument=false
path:\""https://xxxx.sharepoint.com/sites/xxxxx/Shared%20Documents/General/xxxx/xxxx\"" OR
path:\""https://xxxx.sharepoint.com/sites/xxxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxxx/Shared%20Documents/General/xxxx/xxxx\"" OR
path:\""https://xxxx.sharepoint.com/sites/xxxxx/Shared%20Documents/General/xxxx/xxxx\"" OR
path:\""https://xxxx.sharepoint.com/sites/xxxxx/Shared%20Documents/General/xxxx/xxxx\""""
},
""fields"": [
""title"",
""url""
]
}
]
}");
// Use HTTP with Microsoft Entra ID (preauthorized) connector
Set(searchResults, 'HTTPwithMicrosoftEntraID(preauthorized)'.InvokeHttp(
"POST",
"https://graph.microsoft.com/v1.0/search/query",
{
headers: Table(
{key: "Content-type", value: "application/json"}
),
body: varRequestBody
}
));
UpdateContext({searchPerformed: true});
I have tested the varRequestBody JSON inside the graph explorer and it works and returns results correctly. So I believe it has something to do with the connector.
Any help would be greatly appreciated!
Thanks for your reply. I have spent a stupid amount of time on this and still have been unable to get it to work. I can successfully perform a GET request using this connector, but even the simplest POST request fails with a body: null error.
I have been working directly with Power Apps premium support on this issue and so far they have been unable to find a solution. I hope to know more later this week.
This might be a lot to ask, but if you have a bit of time spare could you try creating a POST request using this connector in a canvas app? Something simple like this: https://learn.microsoft.com/en-us/graph/api/driveitem-post-children?view=graph-rest-1.0&tabs=http
POST https://graph.microsoft.com/v1.0/me/drive/root/children
Content-Type: application/json
{
"name": "New Folder",
"folder": { },
"@microsoft.graph.conflictBehavior": "rename"
}
And if you're able to get it to work, could you reply with the code you have used. I'm certain that once I see a working implementation of this connector then I could figure it out, but the documentation is poor and I've been unable to find any examples of this connector being used to send a POST request using Power Apps (plenty in Power Automate, but I too can get my code to work in Power Automate).
try break it down to using only one path for testing - did it succeed? Then add another path, etc etc - that way you can see if its the multiple paths or if its a specific path that is causing the issue
I've spent a bit more time on this today. I used the Power Apps monitor to take a look at what is going on under the hood and found this in the Properties > Request tab of the InvokeHttp operation:
"body": {
"method": "POST",
"url": "https://graph.microsoft.com/v1.0/search/query",
"headers": {
"Content-Type": "application/json"
},
"body": null
}
}
I'm assuming I'm getting a bad request error as the body is null. Any ideas as to why it is not passing through the body?
In case it helps, here's what is returned in Monitor for the InvokeHttp > Details tab:
{
"status": 400,
"duration": 70.29,
"dataSource": "HTTPwithMicrosoftEntraID(preauthorized)",
"responseSize": 207,
"controlName": "btnSearch",
"propertyName": "OnSelect",
"nodeId": 26,
"formulaData": {
"script": "UpdateContext({locSearchPerformed: false});\r\n\r\n// Construct the request body JSON\r\nSet(varRequestBody, \"{\r\n \"\"requests\"\": [\r\n {\r\n \"\"entityTypes\"\": [\r\n \"\"driveItem\"\"\r\n ],\r\n \"\"query\"\": {\r\n \"\"queryString\"\": \"\"title:\\\"\"\"& txtSearchbox.Text &\"\\\"\" AND isDocument=false path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\"\"\"\r\n },\r\n \"\"fields\"\": [\r\n \"\"title\"\",\r\n \"\"url\"\"\r\n ]\r\n }\r\n ]\r\n}\");\r\n\r\n// Use HTTP with Microsoft Entra ID (preauthorized) connector\r\nSet(searchResults, 'HTTPwithMicrosoftEntraID(preauthorized)'.InvokeHttp(\r\n \"POST\",\r\n \"https://graph.microsoft.com/v1.0/search/query\",\r\n {\r\n headers: Table(\r\n {key: \"Content-Type\", value: \"application/json\"}\r\n ),\r\n body: varRequestBody\r\n }\r\n));\r\n\r\nUpdateContext({locSearchPerformed: true});\r\n",
"spanStart": 1353,
"spanEnd": 1619
},
"data": {
"context": {
"entityName": "btnSearch",
"propertyName": "OnSelect",
"id": 11501,
"nodeId": 26,
"diagnosticContext": {
"span": {
"start": 1353,
"end": 1619
},
"dataOperation": {
"protocol": "rest",
"operation": "InvokeHttp",
"dataSource": "HTTPwithMicrosoftEntraID(preauthorized)"
},
"formula": "UpdateContext({locSearchPerformed: false});\r\n\r\n// Construct the request body JSON\r\nSet(varRequestBody, \"{\r\n \"\"requests\"\": [\r\n {\r\n \"\"entityTypes\"\": [\r\n \"\"driveItem\"\"\r\n ],\r\n \"\"query\"\": {\r\n \"\"queryString\"\": \"\"title:\\\"\"\"& txtSearchbox.Text &\"\\\"\" AND isDocument=false path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\" OR path:\\\"\"https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\\\"\"\"\"\r\n },\r\n \"\"fields\"\": [\r\n \"\"title\"\",\r\n \"\"url\"\"\r\n ]\r\n }\r\n ]\r\n}\");\r\n\r\n// Use HTTP with Microsoft Entra ID (preauthorized) connector\r\nSet(searchResults, 'HTTPwithMicrosoftEntraID(preauthorized)'.InvokeHttp(\r\n \"POST\",\r\n \"https://graph.microsoft.com/v1.0/search/query\",\r\n {\r\n headers: Table(\r\n {key: \"Content-Type\", value: \"application/json\"}\r\n ),\r\n body: varRequestBody\r\n }\r\n));\r\n\r\nUpdateContext({locSearchPerformed: true});\r\n"
}
},
"request": {
"url": "https://uk-001.azure-apim.net/apim/webcontents/xxxx/codeless/InvokeHttp",
"method": "POST",
"headers": {
"x-ms-user-agent": "PowerApps/3.24051.23 (Web AuthoringTool; AppName=xxxx)",
"x-ms-client-session-id": "xxxx",
"x-ms-client-request-id": "xxxx",
"x-ms-client-environment-id": "/providers/Microsoft.PowerApps/environments/xxxx",
"x-ms-client-app-id": "/providers/Microsoft.PowerApps/apps/xxxx",
"x-ms-client-tenant-id": "xxxx",
"x-ms-client-object-id": "xxxx",
"Accept-Language": "en-GB",
"Accept": "*/*",
"Cache-Control": "no-cache, no-store",
"Content-Type": "application/json",
"x-ms-request-method": "POST",
"x-ms-request-url": "/apim/webcontents/xxxx/codeless/InvokeHttp"
},
"body": {
"method": "POST",
"url": "https://graph.microsoft.com/v1.0/search/query",
"headers": {
"Content-Type": "application/json"
},
"body": null
}
},
"response": {
"duration": 70.29,
"size": 207,
"status": 400,
"headers": {
"Cache-Control": "no-store, no-cache",
"client-request-id": "xxxx",
"content-encoding": "gzip",
"Content-Type": "application/json",
"Date": "Tue, 21 May 2024 23:41:01 GMT",
"Request-Id": "xxxx",
"strict-transport-security": "max-age=31536000",
"timing-allow-origin": "*",
"x-ms-ags-diagnostic": {
"ServerInfo": {
"DataCenter": "UK South",
"Slice": "E",
"Ring": 5,
"ScaleUnit": "003",
"RoleInstance": "xxxx"
}
},
"x-ms-apihub-cached-response": true,
"x-ms-apihub-obo": true,
"x-ms-environment-id": "xxxx",
"x-ms-client-request-id": "xxxx"
},
"body": {
"error": {
"code": "BadRequest",
"message": "The call failed, please try again.",
"target": ""
},
"Instrumentation": {
"TraceId": "xxxx"
}
},
"responseType": "text"
},
"startTime": 5365934.9,
"name": "https://uk-001.azure-apim.net/invoke",
"fetchStart": 5365935.1,
"domainLookupStart": 5365935.1,
"domainLookupEnd": 5365935.1,
"connectStart": 5365935.1,
"connectEnd": 5365935.1,
"secureConnectionStart": 5365935.1,
"requestStart": 5365936.1,
"responseStart": 5366002.8,
"responseEnd": 5366003.7,
"transferSize": 470,
"nextHopProtocol": "h2"
}
}
Thanks for taking the time to reply.
I've now tried amending the JSON to remove those line feeds and carriage returns (good catch by the way). Unfortunately, it has not solved the problem, but certainly may have been 1 of multiple problems, so I appreciate it!
I'm including the updated code for reference:
UpdateContext({searchPerformed: false});
// Construct the request body JSON
Set(varRequestBody, "{
""requests"": [
{
""entityTypes"": [
""driveItem""
],
""query"": {
""queryString"": ""title:\"""& txtSearchbox.Text &"\"" AND isDocument=false path:\""https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\"" OR path:\""https://xxxx.sharepoint.com/sites/xxxx/Shared%20Documents/General/xxxx/xxxx\""""
},
""fields"": [
""title"",
""url""
]
}
]
}");
// Use HTTP with Microsoft Entra ID (preauthorized) connector
Set(searchResults, 'HTTPwithMicrosoftEntraID(preauthorized)'.InvokeHttp(
"POST",
"https://graph.microsoft.com/v1.0/search/query",
{
headers: Table(
{key: "Content-type", value: "application/json"}
),
body: varRequestBody
}
));
UpdateContext({searchPerformed: true});
Also including the error in case it helps:
Honestly I'm not sure this is it, but it looks like you've included a few line feeds / carriage returns into the querystring text - graph didn't like when I separated things with line feed / carriage return when using graph explorer
Can't see it under default font size as it looks like they are all just wrapping due to length:
But substituting the linefeeds and carriage returns makes it more visible:
WarrenBelz
146,653
Most Valuable Professional
RandyHayes
76,287
Super User 2024 Season 1
Pstork1
65,999
Most Valuable Professional