Une histoire de prise d'une trace HTTP à l'aide de Charles pour savoir quelles demandes la bibliothèque Java fait à Slack

Aperçu

Les applications Java héritées utilisaient slack-api pour notifier, mais début mars 2020, la notification a échoué. Pour dépanner sur mon Mac, je voulais voir quelle était la charge utile d'une demande qui n'a pas été notifiée. J'ai essayé de prendre une trace en utilisant Fiddler, mais cela ne s'est pas produit, donc [Charles](https: //www.charlesproxy. Pour utiliser com /). Dans curl, en vous référant à here, si vous spécifiez le proxy de localhost: 8888 avec -x, vous pouvez obtenir le journal avec Chales. ..

.sh


curl -x localhost:8888 -X POST --data-urlencode "payload={\"channel\": \"#general\", \"username\": \"gpedro Bot\", \"text\": \"c'est#Publié en général.\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/<YOUR>/<TOKEN>

Je n'étais pas sûr de savoir comment prendre une trace Http avec Charles dans une application Java, alors j'ai décidé de l'examiner.

manière

Mon application a utilisé cette bibliothèque. Il est resté intact pendant longtemps, et cela semble mineur, donc je pense que les personnes qui lisent cet article n'utilisent certainement pas cette bibliothèque. Cependant, en implémentant la classe Proxy ou des paramètres équivalents, une forme Je soupçonne qu'il existe un moyen d'envoyer des requêtes HTTP via Proxy dans n'importe quelle bibliothèque. [^ 1] Même lors de l'utilisation de cette bibliothèque, au lieu de créer une instance qui appelle l'API par défaut, Proxy class J'ai pu créer une instance en spécifiant (/reflect/Proxy.html). Lorsque j'ai créé une instance de cette façon, j'ai pu utiliser Charles pour prendre une trace HTTP des requêtes pour cette bibliothèque. Si vous souhaitez dépanner la bibliothèque, j'espère que cela vous sera utile.

Installer Charles

Installez en vous référant à cet article. Faites confiance au certificat Charles Proxy .... dans le trousseau.

Exporter le certificat Charles

Dans le trousseau, cliquez avec le bouton droit sur le certificat Charles Proxy ... et sélectionnez Export-> Export Charles Proxy CA pour exporter le certificat. Le nom du certificat contient beaucoup de caractères d'échappement, alors changez le nom en quelque chose de simple si nécessaire.

Importer le certificat dans la bibliothèque JDK

Importez selon cet article. Dans mon cas, j'utilisais AWS Corretto 8, je l'ai donc importé ci-dessous. Le mot de passe était comme dans l'article ci-dessus.

.sh


sudo keytool -import -trustcacerts -file ~/Documents/charles_proxy.cer  -keystore /Library/Java/JavaVirtualMachines/amazon-corretto-8.jdk/Contents/Home/jre/lib/security/cacerts -alias ca

Demande en spécifiant un proxy

Comme pour curl, spécifiez le port Charles 8888 à demander. Dans cette bibliothèque

import net.gpedro.integrations.slack.SlackApi;
import net.gpedro.integrations.slack.SlackMessage;

import java.net.InetSocketAddress;
import java.net.Proxy;

public class SlackExecute {

    public static void main(String[] args) {

        SlackMessage slackMessage = new SlackMessage(
                "#genearal",
                "gpedro Bot",
                "Puis-je faire une demande Slack avec gpedro?"
        );
        slackMessage.setIcon(":ghost:");
        SlackApi api = new SlackApi(
                "https://hooks.slack.com/services/<SOME>/<TOKEN>", 
                new Proxy(
                    Proxy.Type.HTTP,
                    new InetSocketAddress("localhost", 8888)
                )
         );
        api.call(slackMessage);
    }
}

Lancez Charles et exécutez l'application

Maintenant, dans le volet gauche de Charles, https://hooks.slack.com apparaîtra et vous pourrez retracer le contenu.

.json


{
    "channel": "#genearal",
    "username": "gpedro Bot",
    "icon_emoji": ":ghost:",
    "unfurl_media": false,
    "unfurl_links": false,
    "link_names": false,
    "text": "Puis-je demander avec gpedro"
}

[^ 1]: Par exemple, faites une demande à Spring 5 [WebClient Interface](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/function/client/ WebClient.html) et spécifiez le proxy dans cet article Comment le faire est décrit. Pour cette classe, la [méthode WebClient.Builder # clientConnector](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.Builder. Il existe le code html # clientConnector-org.springframework.http.client.reactive.ClientHttpConnector-). L'argument de cette méthode peut être la classe ClientHttpConnector (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/reactive/ClientHttpConnector.html). .. [Constructeur](https: /) de [ReactorClientHttpConnector](https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/reactive/ReactorClientHttpConnector class.html) de cette classe d'implémentation /docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/reactive/ReactorClientHttpConnector.html#ReactorClientHttpConnector-reactor.netty.http.client.HttpClient) Vous pouvez spécifier (https://projectreactor.io/docs/netty/release/api/reactor/netty/http/client/HttpClient.html). Méthode TcpConfiguration de HttpClient release / api / reacteur / netty / http / client / HttpClient.html # tcpConfiguration-java.util.function.Function-) est la [classe TcpClient](https://projectreactor.io/docs/netty/release/api/ Classe TcpClient avec une fonction qui prend reacteur / netty / tcp / TcpClient.html) comme argument La méthode proxy est ProxyProvider.TypeSpec. prend une fonction comme argument. Méthode de type d'interface ProxyProvider.TypeSpec, Définissez le type de proxy sur [Méthode de type d'interface ProxyProvider.TypeSpec](https://projectreactor.io/docs/netty/release/api/reactor/netty/tcp/ProxyProvider.TypeSpec.html#type-reactor. Dans l'implémentation de ProxyProvider.AddressSpec de la valeur de retour de netty.tcp.ProxyProvider.Proxy-) , Host ou InetSocketAddress class peut être spécifié. Il n'utilise pas la classe Proxy (https://docs.oracle.com/javase/jp/8/docs/api/java/lang/reflect/Proxy.html), mais il fait la même chose.

Recommended Posts

Une histoire de prise d'une trace HTTP à l'aide de Charles pour savoir quelles demandes la bibliothèque Java fait à Slack
Une histoire sur la fabrication d'une calculatrice pour calculer le taux de monticule d'obus
Comment savoir quelle version Java d'un fichier de classe a été compilée
[Petite histoire Java] Surveiller lorsqu'une valeur est ajoutée à la liste
Essayez d'ajouter du texte à une image avec Scala en utilisant la bibliothèque standard de Java
Androd: Que faire à propos de "Le Royaume est déjà dans une transaction d'écriture dans"
Une histoire sur le JDK à l'ère de Java 11
Une histoire sur la création d'un Builder qui hérite du Builder
Histoire d'essayer de faire fonctionner le fichier JAVA
J'ai essayé de découvrir ce qui avait changé dans Java 9
Je veux savoir quelle version de java le fichier jar que j'ai est disponible
De quoi avez-vous besoin à la fin pour créer une application Web en utilisant Java? Expliquer le mécanisme et ce qui est nécessaire pour apprendre