SlackAPI 問い合わせを Java HTTPS通信して実行する

証明書認証をスキップするような空証明書での HTTPS 通信を Java で書いて、
サンプルを試す先=相手側は、なかなか見つからないものです。
Slack API というのが、HTTPS でした。これなら比較的自由に試せます。。
まずは、常套手段である誰もが以下のような X509証明を勝手にしたことにするクラスを用意します。

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;

public class NonAuthentication implements X509TrustManager{
   /* @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String) */
   @Override
   public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException{
   }
   /* @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String) */
   @Override
   public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException{
   }
   /* @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() */
   @Override
   public X509Certificate[] getAcceptedIssuers(){
      return null;
   }
}

これを使い、SSLSocketFactory からSSL通信します。
URL Slacack APIの途中までは、固定なはずなので、固定にしてます。
通信のタイムアウトを60秒にします。
今回は、プロキシを間に指定しません。
結果の受け取りは、文字列です。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * Slack APIへ問い合わせ、 application/x-www-form-urlencoded 
 */
public class SlackQuery{
   Logger logger = LoggerFactory.getLogger(this.getClass());
   private String token;

   public SlackQuery(String token){
      this.token = token;
   }
   public String query(String apiname, String method, Map<String, String> params) throws IOException{
      String result = null;
      try{
         SSLContext ctx = SSLContext.getInstance("SSL");
         ctx.init(null, new X509TrustManager[]{ new NonAuthentication() }, null);
         SSLSocketFactory factory = ctx.getSocketFactory();
         URL url = new URL("https://slack.com/api/" + apiname);
         HttpsURLConnection uc = (HttpsURLConnection)url.openConnection();
         uc.setSSLSocketFactory(factory);
         /* HTTPリクエストヘッダの設定 */
         uc.setDoOutput(true);                  // こちらからのデータ送信を可能とする
         uc.setReadTimeout(60 * 1000);             // 読み取りタイムアウト値
         uc.setRequestMethod(method);              // URL 要求メソッドを設定

         Map<String, String> parameters = new HashMap<>();
         parameters.put("token", token);
         params.entrySet().stream().forEach(e->{
            try{
               parameters.put(e.getKey(), URLEncoder.encode(e.getValue(), "UTF-8"));
            }catch(Exception ex){
               logger.warn(ex.getMessage(), ex);
            }
         });
         String sendstring = parameters.entrySet().stream().map(e->e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&"));
         uc.setRequestProperty("Content-Length", Integer.toString(sendstring.getBytes("utf8").length));
         // コネクション確立→送信
         uc.connect();
         OutputStreamWriter osw = new OutputStreamWriter(uc.getOutputStream(), "utf8");
         osw.write(sendstring);
         osw.flush();
         int httpresponsecode = uc.getResponseCode();
         logger.debug("# HTTP response code : " + httpresponsecode );

         // 戻り値取得
         uc.getHeaderFields().entrySet().stream().forEach(e->{
            logger.debug("# "+ e.getKey() + " → " + e.getValue() );
         });
         // 応答読込
         try(BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "utf8"))){
            StringBuilder out = new StringBuilder();
            char[] buf = new char[1024];
            int n;
            while((n = in.read(buf)) >= 0){
               out.append(buf, 0, n);
            }
            result = out.toString();
         }catch(IOException e){
            throw new RuntimeException(e);
         }
      }catch(NoSuchAlgorithmException | KeyManagementException| MalformedURLException ex){
         logger.error(ex.getMessage(), ex);
      }
      return result;
   }
}

Slack の管理ページから、問い合わせ対象のチームの トークンを取得しておきます。
取得したトークンで実行します

SlackQuery sq = new SlackQuery("xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXX");

String res = sq.query("groups.list", "GET",  new HashMap<>());

結果は、JSON文字列になります。