解决来自Microsoft Graph API的响应

时间:2020-02-04 13:00:22

标签: json powershell rest graph microsoft-graph-api

我有点困,所以基本上我打电话给图public static ApiResponse postRequest(String url, String apiId, Token token, Product product, String data, Object type) throws JsonParseException, JsonMappingException, UnsupportedOperationException, IOException { ObjectMapper mapper = new ObjectMapper(); PolicyResponse mResponse = null; apiError apiError = null; ApiResponse apiResponse = new ApiResponse(); InputStream responseStream = null; try { HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.set("User-Agent", "MY Framework"+new Date() + new Random().nextDouble()); headers.set("Content-Type", "application/json"); if(token != null) { headers.set(HttpHeaders.AUTHORIZATION, "Bearer " + token.getAccessToken()); } headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); headers.setCacheControl("no-cache"); HttpEntity request = new HttpEntity<>(data,headers); logger.info("Headers " + headers); if(token != null) { logger.info("Token " + token.getAccessToken()); } logger.info("PolicyURL :: " + url); logger.info("API ID :: " + apiId); logger.info("Request Data :: " + data); RestTemplate restTemplate = new RestTemplate(); ResponseEntity <JsonNode>response = restTemplate.exchange(url, HttpMethod.POST, request, JsonNode.class); logger.debug("Response Data :: " + response.getBody()); mapper.configure(Feature.AUTO_CLOSE_SOURCE, true); if (null != response) { apiResponse.setApiId(apiId); if (response.getStatusCode() == HttpStatus.OK || response.getStatusCode() == HttpStatus.CREATED) { apiResponse.setHttpResponse(response.getBody().toString()); apiResponse.setJsonNode(response.getBody()); logger.debug(response.getBody().toString()); } else { logger.debug("Error Response " + response.getBody()); apiError apiError = mapper.readValue(response.getBody().toString(), new TypeReference<apiError>() { }); apiResponse.setHttpResponse(response.getBody().toString()); apiResponse.setHttpResponseMessage(apiError.getMessage()); } } apiResponse.setHttpStatusCode(String.valueOf(response.getStatusCode())); } catch(HttpClientErrorException hcee) { logger.error(hcee.getCause()); logger.error(hcee.getResponseBodyAsString()); apiResponse.setHttpStatusCode(String.valueOf(hcee.getRawStatusCode())); apiResponse.setHttpResponse(hcee.getResponseBodyAsString()); apiResponse.setHttpResponseMessage(hcee.getMessage()); } finally { if(responseStream != null) { responseStream.close(); } } return apiResponse; }

api/resources/plannertaskdetails

我得到了答复,像这样:

$apiUrl = $('https://graph.microsoft.com/v1.0/planner/tasks/' + $taskId +'/details')
$response = Invoke-RestMethod -Headers @{Authorization = "Bearer $($token.access_token)"} -Uri $apiUrl -Method Get

引用和清单是列表(https://docs.microsoft.com/en-us/graph/api/resources/plannertaskdetails?view=graph-rest-1.0

因此,当我执行$ response.checklist时,会看到@ {18907 =; 35669 =; 41911 =}(代表列表项)

例如,当我做@{@odata.context=xxxx/details/$entity; description=value 1; previewType=automatic; id=bxxxxm; references=; checklist=} 我看到$response.checklist.18907

现在我的问题是,如何才能轻松访问其中的那些列表对象。

要做类似的事情

@{@odata.type=#microsoft.graph.plannerChecklistItem; isChecked=True; title=Step 1; orderHint=; lastModifiedDateTime=; lastModifiedBy=}

在这个$ response中,我可以得到例如描述foreach($option in $response.checklist) { $option.Title= ....; } ,但清单和参考没有。

否则,如果我尝试| | | | ConvertFrom-Json,出现错误无效的JSON原语等。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为这应该可行:

foreach($checklistId in $response.checklist.Keys)
{
    $response.checklist[$checklistId].title= ....;
}

AFAIK,Invoke-WebRequest通过解析JSON输出在PowerShell中返回解析字典结构。