Microsoft图形搜索功能Java

问题描述 投票:0回答:1

我正在尝试使用Microsoft Graph进行文件搜索。我使用此入口点:https://graph.microsoft.com/beta/search/query我的应用程序不使用用户帐户,而是使用具有应用程序密钥的守护程序(请参阅auth方法)。然后我发送一个建筑对象。

我的Java代码非常简单:

public static void main(String[] args) throws Exception{

    try {
        // Authentication result containing token
        IAuthenticationResult result = getAccessTokenByClientCredentialGrant();
        String token = result.accessToken();

        SearchDocumentResponseModel documentQuery = fileGraphs.searchDocument(token, QUERYSTRING, 0, 25);
        System.out.println("Find a document" + documentQuery.toString());

    } catch(Exception ex){
        throw ex;
    }
}

private static IAuthenticationResult getAccessTokenByClientCredentialGrant() throws Exception {
    ConfidentialClientApplication app = ConfidentialClientApplication.builder(
            CONFIDENTIAL_CLIENT_ID,
            ClientCredentialFactory.createFromSecret(CONFIDENTIAL_CLIENT_SECRET))
            .authority(TENANT_SPECIFIC_AUTHORITY)
            .build();

    ClientCredentialParameters clientCredentialParam = ClientCredentialParameters.builder(
            Collections.singleton(GRAPH_DEFAULT_SCOPE))
            .build();

    CompletableFuture<IAuthenticationResult> future = app.acquireToken(clientCredentialParam);
    return future.get();
}

SearchDocumentResponseModel只是一组POJO,它们为我构建了必须作为请求主体发送的对象。

{
  "requests":
     [{
        "entityTypes":["microsoft.graph.driveItem"],
        "query":{"query_string":{"query":"any query"}},
        "from":0,"size":25
      }]
 }

方法searchDocument在将对象发送给API之前就已经在这里用于构建对象

 public SearchDocumentResponseModel searchDocument(String accessToken, String stringSearch, int from, int size) throws IOException {
        SearchDocumentRequestModel searchRequest = new SearchDocumentRequestModel();
        // set values here
        ...
        URL url = new URL("https://graph.microsoft.com/beta/search/query");
        return requestsBuilder.buildPostRequest(accessToken, searchRequest, url)
  }

现在我想将Json发送到服务器并期望得到答案:

public SearchDocumentResponseModel buildPostRequest(String accessToken, SearchDocumentRequestModel searchRequest, URL url) throws IOException {
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    conn.setRequestProperty("Authorization", "Bearer " + accessToken);
    conn.setRequestProperty("Accept","application/json");
    conn.setRequestProperty("Content-Type","application/json; utf-8");
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    // write the input json in a string
    String jsonInputString = new Gson().toJson(searchRequest);
    try(OutputStream os = conn.getOutputStream()) {
        byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
        os.write(input, 0, input.length);
    }

    int httpResponseCode = conn.getResponseCode();
    String httpResponseMessage = conn.getResponseMessage();
    // reading the response
    try(BufferedReader br = new BufferedReader(
            new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
        StringBuilder response = new StringBuilder();
        String responseLine = null;
        while ((responseLine = br.readLine()) != null) {
            response.append(responseLine.trim());
        }
        String outputResponse = response.toString();
        return new Gson().fromJson(outputResponse, SearchDocumentResponseModel.class);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

我认为我正确设置了属性。是来自我的代码还是来自Microsoft Graph?谢谢 !

java azure-ad-graph-api
1个回答
0
投票

首先,您应该检查访问令牌是否有效,可以使用邮递员发送请求。

enter image description here

enter image description here

如果令牌有效,我认为应该是您的jsonInputString的问题。以下代码可以正常工作。

URL url = new URL("https://graph.microsoft.com/beta/search/query");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Authorization", "access_token" );
            conn.setRequestProperty("Accept","application/json");
            conn.setRequestProperty("Content-Type","application/json; utf-8");
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            String str = "";
            str += "{";
            str += "  \"requests\": [";
            str += "    {";
            str += "      \"entityTypes\": [";
            str += "        \"microsoft.graph.driveItem\"";
            str += "      ],";
            str += "      \"query\": {";
            str += "        \"query_string\": {";
            str += "          \"query\": \"contoso\"";
            str += "        }";
            str += "      },";
            str += "      \"from\": 0,";
            str += "      \"size\": 25";
            str += "    }";
            str += "  ]";
            str += "}";
            OutputStream os = conn.getOutputStream();
            byte[] input = str.getBytes("UTF-8");
            os.write(input, 0, input.length);
            System.out.println(conn.getResponseCode()); 
© www.soinside.com 2019 - 2024. All rights reserved.