Welcome to RUSaCis - эмулятор Interlude

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

REST API для управления сервером

Aztur

Бродяга
Регистрация
21 Июл 2022
Сообщения
13
Реакции
18
Баллы
3
RaCoin
20
Всем привет.

для управления telnet и xml-rpc оставим в прошлом.
для примера, хотим сделать удаленное выключение логин-сервера.
делаем так:

Код:
        // Implementing REST API //Aztur

           int RestServerPort = 8000;

           HttpServer restserver = HttpServer.create(new InetSocketAddress(RestServerPort), 0);

           restserver.createContext("/restapi", (exchange -> {

               if ("GET".equals(exchange.getRequestMethod())) {

                   Map<String, List<String>> params = splitQuery(exchange.getRequestURI().getRawQuery());

                   String NotFoundCommand = "NotACommand";

                   String command = params.getOrDefault("command", List.of(NotFoundCommand)).stream().findFirst().orElse(NotFoundCommand);

                   switch(command) {

                       case "Shutdown":

                           _log.info("Got REST API command: " + command + " Bye Bye...");

                           System.exit(0);

                       break;

                       case "Restart":

                           _log.info("Got REST API command: " + command + " Restarting...");

                           System.exit(1);

                       break;

                       default:

                       _log.info("Got unknown REST API command: " + command);

                   }

               } else {

                   exchange.sendResponseHeaders(405, -1);// 405 Method Not Allowed

               }

               exchange.close();

           }));

           restserver.setExecutor(null); // creates a default executor

           restserver.start();

           _log.info("Listening for REST API commands on localhost" + ':' + RestServerPort);

   

    }

 



    public static Map<String, List<String>> splitQuery(String query) {

        if (query == null || "".equals(query)) {

            return Collections.emptyMap();

        }



        return Pattern.compile("&").splitAsStream(query)

            .map(s -> Arrays.copyOf(s.split("="), 2))

            .collect(groupingBy(s -> decode(s[0]), mapping(s -> decode(s[1]), toList())));



    }



    private static String decode(final String encoded) {

        try {

            return encoded == null ? null : URLDecoder.decode(encoded, "UTF-8");

        } catch (final UnsupportedEncodingException e) {

            throw new RuntimeException("UTF-8 is a required encoding", e);

        }

    }


импорты для шапки:
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.URLDecoder;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.Arrays;
import java.util.Collections;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
import com.sun.net.httpserver.HttpServer;

пересобираем логин,

выключаем так:

curl localhost:8000/restapi?command=Shutdown

ну или любым другим способом (скрипт по крону, php на веб-сервере, и т.д.)

таким же макаром - выдаем донат, запускаем эвэнты, собираем статистику и т.д...
 
Последнее редактирование:

Aztur

Бродяга
Регистрация
21 Июл 2022
Сообщения
13
Реакции
18
Баллы
3
RaCoin
20
Код:
    public static Map<String, List<String>> splitQuery(String query)
    {
        if ((query == null) || "".equals(query))
        {
            return Collections.emptyMap();
        }
        
        return Pattern.compile("&").splitAsStream(query).map(s -> Arrays.copyOf(s.split("="), 2)).collect(groupingBy(s -> decode(s[0]), mapping(s -> decode(s[1]), toList())));
        
    }
    
    private static String decode(final String encoded)
    {
        try
        {
            return encoded == null ? null : URLDecoder.decode(encoded, "UTF-8");
        }
        catch (final UnsupportedEncodingException e)
        {
            throw new RuntimeException("UTF-8 is a required encoding", e);
        }
    }
 
Сверху Снизу