Как сохранить результат exchange.getRequestURI (). GetQuery () в переменной и использовать его для получения кода авторизации - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь реализовать этот этап проекта - https://hyperskill.org/projects/62/stages/337/implement. Мне нужно сохранить результат String code = exchange.getRequestURI().getQuery(); в переменной и использовать его в запросе POST.

POST(HttpRequest.BodyPublishers.ofString("client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET+ "&grant_type=" + GRANT_TYPE + "&code=" + CODE + "&redirect_uri=" + REDIRECT_URI))

Но я не могу этого сделать, потому что он не сохраняется в переменная вне server.createContext . Может быть, я пытаюсь сделать что-то не так? Кто-нибудь может мне помочь?


    private static final String CLIENT_ID = "da072c60fcee469e8b0f4140aa4480d5";
    private static final String CLIENT_SECRET = "8ada13093c704487b57c3a660448884e";
    private static final String AUTHORIZE_ADDRESS = "https://accounts.spotify.com/authorize";
    private static final String RESPONSE_TYPE = "code";
    private static final String TOKEN_ADDRESS = "https://accounts.spotify.com/api/token";
    private static final String GRANT_TYPE = "authorization_code";
    private static final String CODE = "";
    private static final String REDIRECT_URI = "http://localhost:8080";
    private static final String ANSWER_DENIED_ACCESS = "Please, provide access for application.";

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        boolean successfulAccess = false;

        while (sc.hasNext()) {
            String input = sc.next();
            switch (input) {
                case "auth":
                    server();
                    request();
                    successfulAccess = true;
                    System.out.println("---SUCCESS---");
                    break;
            }
        }
    }

    private static void server() throws IOException {
        HttpServer server = HttpServer.create();
        server.bind(new InetSocketAddress(8080), 0);

        server.start();

        System.out.println("use this link to request the access code:");
        System.out.println(AUTHORIZE_ADDRESS
                + "?client_id=" + CLIENT_ID
                + "&redirect_uri=" + REDIRECT_URI
                + "&response_type=" + RESPONSE_TYPE);
        System.out.println("waiting for code...");

        server.createContext("/",
                exchange -> {
                    String code = exchange.getRequestURI().getQuery();
                    String result = "";
                    String answer = "";

                    if (code.contains("code")) {
                        result = "Got the code. Return back to your program.";
                        answer = "code received";
                    } else {
                        result = "Not found authorization code. Try again.";
                        answer = "code didn't received";
                    }

                    exchange.sendResponseHeaders(200, result.length());
                    exchange.getResponseBody().write(result.getBytes());
                    exchange.getResponseBody().close();

                    System.out.println(answer);
                }
        );

        server.stop(10);
    }

    private static void request() throws IOException, InterruptedException {

        System.out.println("making http request for access_token...");

        HttpRequest request = HttpRequest.newBuilder()
                .POST(HttpRequest.BodyPublishers.ofString(
                        "client_id=" + CLIENT_ID
                                + "&client_secret=" + CLIENT_SECRET
                                + "&grant_type=" + GRANT_TYPE
                                + "&code=" + CODE
                                + "&redirect_uri=" + REDIRECT_URI))
                .header("Content-Type", "application/x-www-form-urlencoded")
                .uri(URI.create(TOKEN_ADDRESS))
                .build();

        HttpClient client = HttpClient.newBuilder().build();
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println("response:");
        System.out.println(response.body());
    }
}```

1 Ответ

0 голосов
/ 17 апреля 2020

Мне нужно пока цикл с Thread.sleep, чем вы обычно можете хранить код в переменной. Как это:

                exchange -> {
                    String code = exchange.getRequestURI().getQuery();
                    String result = "";
                    String answer = "";

                    if (code != null && code.contains("code")) {
                        CODE = code.substring(5);
                        result = "Got the code. Return back to your program.";
                        answer = "code received";
                    } else {
                        result = "Not found authorization code. Try again.";
                        answer = "code not received";
                    }

                    exchange.sendResponseHeaders(200, result.length());
                    exchange.getResponseBody().write(result.getBytes());
                    exchange.getResponseBody().close();

                    System.out.println(answer);
                }
        );
        while (CODE.equals("")) {
            Thread.sleep(10);
        }

        server.stop(10);```
...