Функция поиска в графике Microsoft Java - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь использовать 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? Спасибо !

1 Ответ

1 голос
/ 02 марта 2020

Прежде всего, вы должны проверить, является ли токен доступа действительным, вы можете отправить запрос с помощью почтальона.

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()); 

Обновление:

Запрос API не поддерживает поток учетных данных клиента.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...