Plugin Résolu Le serveur KTOR refuse la requête register de mon plugin

VG07

Massacreur de Mouton
23 Mars 2020
36
1
18
23
Bonjour,
je fais un serveur KTOR qui vise à permettre au joueur d'acheter/vendre des objets IG contre de l'argent IG. Pour cela, il faut que la personne puisse se connecter/enregistrer au site. Mais, comme j'utilise le pseudo Minecraft afin de faciliter le give d'item, il est impératif que le joueur s'enregistre via le serveur Minecraft. Or lorsque j'envoie ma requête, j'ai une erreur qui me dit que la réponse du serveur KTOR est vide (le body pour être précis). J'ai fait des tests et il se trouve, en effet, que le serveur ne fait rien lorsque j'envoie la requête. On peut également voir que quand le serveur KTOR reçoit la requête, il n'arrive pas à convertir le JOIN en l'objet voulu. J'ai voulu vérifier si le problème, vient du JSON avec postman or le serveur a répondu et a exécuté ma requête. Voici donc mon message d'erreur ainsi que ma méthode register et le log du serveur KTOR lorsqu'il reçoit ma requête et ici mon serveur KTOR sur GitHub.

Code:
[08:54:25] [Server thread/WARN]: java.lang.NullPointerException: Cannot invoke "fr.plaglefleau.inventorytojson.models.ClientRegisterReceive.isRegister()" because "clientRegisterReceive" is null
[08:54:25] [Server thread/WARN]:        at fr.plaglefleau.inventorytojson.listeners.ConnectListener$2.run(ConnectListener.java:214)
[08:54:25] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_20_R1.scheduler.CraftTask.run(CraftTask.java:82)
[08:54:25] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_20_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:415)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1257)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:388)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1198)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1015)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:304)
[08:54:25] [Server thread/WARN]:        at java.base/java.lang.Thread.run(Thread.java:833)


Java:
public void register(Player player, String message) {
        String[] register = message.replace(">","").replace("<","").split(";");
        String json = new Gson().toJson(
                new Register(
                        player.getName(),
                        register[0],
                        register[1]
                )
        );
        System.out.println(ConsoleColor.YELLOW + json + ConsoleColor.RESET);
        new BukkitRunnable() {
            public void run() {
                URI uri = URI.create("http://127.0.0.1/api/client/register");
                HttpClient client = HttpClient.newHttpClient();
                HttpRequest request = HttpRequest.newBuilder(uri)
                        .POST(HttpRequest.BodyPublishers.ofString(json))
                        .header("Authorization", "Bearer " + Token.TOKEN)
                        .build();
                try {
                    //send and get the response
                    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
                    System.out.println(ConsoleColor.YELLOW + response.body() + ConsoleColor.RESET);
                    if(response.body().isBlank()) {
                        System.out.println(ConsoleColor.YELLOW + "The body is Blank" + ConsoleColor.RESET);
                    }
                    ClientRegisterReceive clientRegisterReceive = new Gson().fromJson(response.body(), ClientRegisterReceive.class);
                    if(clientRegisterReceive.isRegister()) {
                        player.sendMessage(ChatColor.GREEN + clientRegisterReceive.getMessage() + "\nWelcome " + player.getName() + ChatColor.RESET);
                        registerPlayers.remove(player.getUniqueId());
                        players.remove(player.getUniqueId());
                    } else {
                        player.sendMessage(ChatColor.DARK_RED + clientRegisterReceive.getMessage() + ChatColor.RESET);
                        player.sendMessage(ChatColor.YELLOW + "Please type your password and email like this : <password>;<email>" + ChatColor.RESET);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.runTask(this.plugin);
    }

Code:
2023-07-09 09:07:52.911 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.sessions.Sessions - Sessions found for /api/client/register: connect
2023-07-09 09:07:52.966 [eventLoopGroupProxy-4-1] TRACE io.ktor.routing.Routing - Trace for [api, client, register]
/, segment:0 -> SUCCESS @ /
  /, segment:0 -> SUCCESS @ /
    /(method:GET), segment:0 -> FAILURE "Selector didn't match" @ /(method:GET)
    /connect, segment:0 -> FAILURE "Selector didn't match" @ /connect
    /register, segment:0 -> FAILURE "Selector didn't match" @ /register
    /(authenticate user-session), segment:0 -> SUCCESS @ /(authenticate user-session)
      /(authenticate user-session)/profile, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/profile
      /(authenticate user-session)/stores, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/stores
      /(authenticate user-session)/editUser, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editUser
      /(authenticate user-session)/editSalary, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editSalary
      /(authenticate user-session)/editMember, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editMember
      /(authenticate user-session)/editStock, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editStock
      /(authenticate user-session)/bailoutStock, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/bailoutStock
      /(authenticate user-session)/addStock, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/addStock
      /(authenticate user-session)/ajouterUnMembre, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/ajouterUnMembre
      /(authenticate user-session)/createShop, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/createShop
      /(authenticate user-session)/removeMember, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/removeMember
      /(authenticate user-session)/disconnect, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/disconnect
  /assets, segment:0 -> FAILURE "Selector didn't match" @ /assets
  /(authenticate api-bearer), segment:0 -> SUCCESS @ /(authenticate api-bearer)
    /(authenticate api-bearer)/api, segment:1 -> SUCCESS @ /(authenticate api-bearer)/api
      /(authenticate api-bearer)/api/, segment:1 -> SUCCESS @ /(authenticate api-bearer)/api/
        /(authenticate api-bearer)/api/client, segment:2 -> SUCCESS @ /(authenticate api-bearer)/api/client
          /(authenticate api-bearer)/api/client/, segment:2 -> SUCCESS @ /(authenticate api-bearer)/api/client/
            /(authenticate api-bearer)/api/client/connect, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/connect
            /(authenticate api-bearer)/api/client/inventory, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/inventory
            /(authenticate api-bearer)/api/client/register, segment:3 -> SUCCESS @ /(authenticate api-bearer)/api/client/register
              /(authenticate api-bearer)/api/client/register/(method:POST), segment:3 -> SUCCESS @ /(authenticate api-bearer)/api/client/register/(method:POST)
            /(authenticate api-bearer)/api/client/debit, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/debit
            /(authenticate api-bearer)/api/client/credit, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/credit
            /(authenticate api-bearer)/api/client/pay, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/pay
            /(authenticate api-bearer)/api/client/updateInventory, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/updateInventory
        /(authenticate api-bearer)/api/store, segment:1 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/store
Matched routes:
  "" -> "(authenticate api-bearer)" -> "api" -> "<slash>" -> "client" -> "<slash>" -> "register" -> "(method:POST)"
Route resolve result:
  SUCCESS @ /(authenticate api-bearer)/api/client/register/(method:POST)
2023-07-09 09:07:52.985 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.auth.Authentication - Trying to authenticate /api/client/register with api-bearer
2023-07-09 09:07:53.008 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.auth.Authentication - Authentication succeeded for /api/client/register with provider io.ktor.server.auth.BearerAuthenticationProvider@5adad75b
2023-07-09 09:07:53.084 [eventLoopGroupProxy-4-1] TRACE i.k.server.engine.DefaultTransform - No Default Transformations found for class io.ktor.utils.io.ByteBufferChannel and expected type TypeInfo(type=class fr.plaglefleau.models.api.client.receive.RegisterReceive, reifiedType=class fr.plaglefleau.models.api.client.receive.RegisterReceive, kotlinType=fr.plaglefleau.models.api.client.receive.RegisterReceive) for call /api/client/register
2023-07-09 09:07:53.121 [eventLoopGroupProxy-4-1] TRACE i.k.s.p.c.ContentNegotiation - Skipping content converter for request type class fr.plaglefleau.models.api.client.receive.RegisterReceive because content type */* does not match application/json
2023-07-09 09:07:53.121 [eventLoopGroupProxy-4-1] TRACE i.k.s.p.c.ContentNegotiation - No suitable content converter found for request type class fr.plaglefleau.models.api.client.receive.RegisterReceive
2023-07-09 09:07:53.138 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.sessions.Sessions - Sending session data for /api/client/register: connect
2023-07-09 09:07:53.141 [eventLoopGroupProxy-4-1] TRACE i.k.s.p.c.ContentNegotiation - Skipping response body transformation from HttpStatusCode to OutgoingContent for the POST /api/client/register request because the HttpStatusCode type is ignored. See [ContentNegotiationConfig::ignoreType].

Edit: le serveur répond avec le code 415
 
Dernière édition:

VG07

Massacreur de Mouton
23 Mars 2020
36
1
18
23
Bonjour,
je fais un serveur KTOR qui vise à permettre au joueur d'acheter/vendre des objets IG contre de l'argent IG. Pour cela, il faut que la personne puisse se connecter/enregistrer au site. Mais, comme j'utilise le pseudo Minecraft afin de faciliter le give d'item, il est impératif que le joueur s'enregistre via le serveur Minecraft. Or lorsque j'envoie ma requête, j'ai une erreur qui me dit que la réponse du serveur KTOR est vide (le body pour être précis). J'ai fait des tests et il se trouve, en effet, que le serveur ne fait rien lorsque j'envoie la requête. On peut également voir que quand le serveur KTOR reçoit la requête, il n'arrive pas à convertir le JOIN en l'objet voulu. J'ai voulu vérifier si le problème, vient du JSON avec postman or le serveur a répondu et a exécuté ma requête. Voici donc mon message d'erreur ainsi que ma méthode register et le log du serveur KTOR lorsqu'il reçoit ma requête et ici mon serveur KTOR sur GitHub.

Code:
[08:54:25] [Server thread/WARN]: java.lang.NullPointerException: Cannot invoke "fr.plaglefleau.inventorytojson.models.ClientRegisterReceive.isRegister()" because "clientRegisterReceive" is null
[08:54:25] [Server thread/WARN]:        at fr.plaglefleau.inventorytojson.listeners.ConnectListener$2.run(ConnectListener.java:214)
[08:54:25] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_20_R1.scheduler.CraftTask.run(CraftTask.java:82)
[08:54:25] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_20_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:415)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1257)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:388)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1198)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1015)
[08:54:25] [Server thread/WARN]:        at net.minecraft.server.MinecraftServer.lambda$0(MinecraftServer.java:304)
[08:54:25] [Server thread/WARN]:        at java.base/java.lang.Thread.run(Thread.java:833)


Java:
public void register(Player player, String message) {
        String[] register = message.replace(">","").replace("<","").split(";");
        String json = new Gson().toJson(
                new Register(
                        player.getName(),
                        register[0],
                        register[1]
                )
        );
        System.out.println(ConsoleColor.YELLOW + json + ConsoleColor.RESET);
        new BukkitRunnable() {
            public void run() {
                URI uri = URI.create("http://127.0.0.1/api/client/register");
                HttpClient client = HttpClient.newHttpClient();
                HttpRequest request = HttpRequest.newBuilder(uri)
                        .POST(HttpRequest.BodyPublishers.ofString(json))
                        .header("Authorization", "Bearer " + Token.TOKEN)
                        .build();
                try {
                    //send and get the response
                    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
                    System.out.println(ConsoleColor.YELLOW + response.body() + ConsoleColor.RESET);
                    if(response.body().isBlank()) {
                        System.out.println(ConsoleColor.YELLOW + "The body is Blank" + ConsoleColor.RESET);
                    }
                    ClientRegisterReceive clientRegisterReceive = new Gson().fromJson(response.body(), ClientRegisterReceive.class);
                    if(clientRegisterReceive.isRegister()) {
                        player.sendMessage(ChatColor.GREEN + clientRegisterReceive.getMessage() + "\nWelcome " + player.getName() + ChatColor.RESET);
                        registerPlayers.remove(player.getUniqueId());
                        players.remove(player.getUniqueId());
                    } else {
                        player.sendMessage(ChatColor.DARK_RED + clientRegisterReceive.getMessage() + ChatColor.RESET);
                        player.sendMessage(ChatColor.YELLOW + "Please type your password and email like this : <password>;<email>" + ChatColor.RESET);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.runTask(this.plugin);
    }

Code:
2023-07-09 09:07:52.911 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.sessions.Sessions - Sessions found for /api/client/register: connect
2023-07-09 09:07:52.966 [eventLoopGroupProxy-4-1] TRACE io.ktor.routing.Routing - Trace for [api, client, register]
/, segment:0 -> SUCCESS @ /
  /, segment:0 -> SUCCESS @ /
    /(method:GET), segment:0 -> FAILURE "Selector didn't match" @ /(method:GET)
    /connect, segment:0 -> FAILURE "Selector didn't match" @ /connect
    /register, segment:0 -> FAILURE "Selector didn't match" @ /register
    /(authenticate user-session), segment:0 -> SUCCESS @ /(authenticate user-session)
      /(authenticate user-session)/profile, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/profile
      /(authenticate user-session)/stores, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/stores
      /(authenticate user-session)/editUser, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editUser
      /(authenticate user-session)/editSalary, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editSalary
      /(authenticate user-session)/editMember, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editMember
      /(authenticate user-session)/editStock, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/editStock
      /(authenticate user-session)/bailoutStock, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/bailoutStock
      /(authenticate user-session)/addStock, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/addStock
      /(authenticate user-session)/ajouterUnMembre, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/ajouterUnMembre
      /(authenticate user-session)/createShop, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/createShop
      /(authenticate user-session)/removeMember, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/removeMember
      /(authenticate user-session)/disconnect, segment:0 -> FAILURE "Selector didn't match" @ /(authenticate user-session)/disconnect
  /assets, segment:0 -> FAILURE "Selector didn't match" @ /assets
  /(authenticate api-bearer), segment:0 -> SUCCESS @ /(authenticate api-bearer)
    /(authenticate api-bearer)/api, segment:1 -> SUCCESS @ /(authenticate api-bearer)/api
      /(authenticate api-bearer)/api/, segment:1 -> SUCCESS @ /(authenticate api-bearer)/api/
        /(authenticate api-bearer)/api/client, segment:2 -> SUCCESS @ /(authenticate api-bearer)/api/client
          /(authenticate api-bearer)/api/client/, segment:2 -> SUCCESS @ /(authenticate api-bearer)/api/client/
            /(authenticate api-bearer)/api/client/connect, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/connect
            /(authenticate api-bearer)/api/client/inventory, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/inventory
            /(authenticate api-bearer)/api/client/register, segment:3 -> SUCCESS @ /(authenticate api-bearer)/api/client/register
              /(authenticate api-bearer)/api/client/register/(method:POST), segment:3 -> SUCCESS @ /(authenticate api-bearer)/api/client/register/(method:POST)
            /(authenticate api-bearer)/api/client/debit, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/debit
            /(authenticate api-bearer)/api/client/credit, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/credit
            /(authenticate api-bearer)/api/client/pay, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/pay
            /(authenticate api-bearer)/api/client/updateInventory, segment:2 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/client/updateInventory
        /(authenticate api-bearer)/api/store, segment:1 -> FAILURE "Selector didn't match" @ /(authenticate api-bearer)/api/store
Matched routes:
  "" -> "(authenticate api-bearer)" -> "api" -> "<slash>" -> "client" -> "<slash>" -> "register" -> "(method:POST)"
Route resolve result:
  SUCCESS @ /(authenticate api-bearer)/api/client/register/(method:POST)
2023-07-09 09:07:52.985 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.auth.Authentication - Trying to authenticate /api/client/register with api-bearer
2023-07-09 09:07:53.008 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.auth.Authentication - Authentication succeeded for /api/client/register with provider io.ktor.server.auth.BearerAuthenticationProvider@5adad75b
2023-07-09 09:07:53.084 [eventLoopGroupProxy-4-1] TRACE i.k.server.engine.DefaultTransform - No Default Transformations found for class io.ktor.utils.io.ByteBufferChannel and expected type TypeInfo(type=class fr.plaglefleau.models.api.client.receive.RegisterReceive, reifiedType=class fr.plaglefleau.models.api.client.receive.RegisterReceive, kotlinType=fr.plaglefleau.models.api.client.receive.RegisterReceive) for call /api/client/register
2023-07-09 09:07:53.121 [eventLoopGroupProxy-4-1] TRACE i.k.s.p.c.ContentNegotiation - Skipping content converter for request type class fr.plaglefleau.models.api.client.receive.RegisterReceive because content type */* does not match application/json
2023-07-09 09:07:53.121 [eventLoopGroupProxy-4-1] TRACE i.k.s.p.c.ContentNegotiation - No suitable content converter found for request type class fr.plaglefleau.models.api.client.receive.RegisterReceive
2023-07-09 09:07:53.138 [eventLoopGroupProxy-4-1] TRACE io.ktor.server.sessions.Sessions - Sending session data for /api/client/register: connect
2023-07-09 09:07:53.141 [eventLoopGroupProxy-4-1] TRACE i.k.s.p.c.ContentNegotiation - Skipping response body transformation from HttpStatusCode to OutgoingContent for the POST /api/client/register request because the HttpStatusCode type is ignored. See [ContentNegotiationConfig::ignoreType].

Edit: le serveur répond avec le code 415
J'ai trouvé d'où vient le problème en réalité quand j'envoie la requête. Je ne dis pas au serveur que le contenu de la requête, c'est un JSON, donc pour ça je dois rajouter à
Java:
HttpRequest request = HttpRequest.newBuilder(uri)
                        .POST(HttpRequest.BodyPublishers.ofString(json))
                        .header("Authorization", "Bearer " + Token.TOKEN)
                        .build();
un
Java:
.header("Content-Type", "application/json")
ce qui donne ceci
Java:
HttpRequest request = HttpRequest.newBuilder(uri)
.POST(HttpRequest.BodyPublishers.ofString(json))
.header("Authorization", "Bearer " + Token.TOKEN)
.header("Content-Type", "application/json")
.build();
 
Dernière édition: