0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Watson SDK for Javaでサービスの呼び方を調査した

Last updated at Posted at 2019-11-22

##元ネタはこれ
https://github.com/watson-developer-cloud/java-sdk

##なにがはまったのか
ぱっとみて、「はいはい、API_Keyを渡すんでしょ」っていうこのコード部分に誘導された・・

Sample.java
// letting the SDK manage the IAM token
Authenticator authenticator = new IamAuthenticator("<iam_api_key>");
Discovery service = new Discovery("2019-04-30", authenticator);

##基本的な考え方
IBM CloudにDeployするなら、VCAP変数が使えるから、Authenticatorを指定せずにサービスのインスタンスを作ればいい。
(難しいことを考えた方が負け)

##単体テストをするとき
Credential Fileをとってきて読み込ませるのが楽(VCAP変数がないけど、あるのに近い感じでできる)

Credential file (easier!)

With a credential file, you just need to put the file in the right place and the SDK will do the work of parsing it and authenticating. You can get this file by clicking the Download button for the credentials in the Manage tab of your service instance.

ここでもはまったのが、このページ(「サービス」の「管理」)で、Credentialsのペインが表示されないときがあった・・ということ。(読み込みで失敗してたのかな・・?)
nlc.png

このDownloadで、ibm-credentials.envが落とせる。
書式は、<サービス名の大文字>_<Key>=<value>

このNLCのサービスはふとみたらあったTokyoリージョンで作ったので、URLが東京リージョン向けになっている点も注意か。
ファイルの読み込みをさせる前に試行錯誤してたとき、API-Keyは渡せたけどURLが指定できてなくて、その場合https://gateway.watsonplatform.net/natural-language-classifier/api が指定され、US-Southにアクセスに行こうとして、403 Forbiddenが返ってくる。

APIを引数で指定する && US-South以外のリージョンでサービスを作った場合は、URLを設定する。

Sample.java
NaturalLanguageClassifier nlc = new NaturalLanguageClassifier("<api_key");
//サービスのリージョンのURLを指定
nlc.setURL("https://gateway-tok.watsonplatform.net/natural-language-classifier/api");

##ibm-credentials.envの読み込み場所と順番
さらっとReadmeに書いているけど、ソースをみたほうがわかりやすかった。

ファイル名は、ibm-credentials.env で固定
読み込み順序はこの通りで、上からみていって見つかったものを読み込む(それ以降は読まない)

CredentialUtils.java
  private static List<File> getFilesToCheck() {
    List<File> files = new ArrayList<>();

    String userSpecifiedPath = EnvironmentUtils.getenv("IBM_CREDENTIALS_FILE");
    String currentWorkingDirectory = System.getProperty("user.dir");
    String unixHomeDirectory = EnvironmentUtils.getenv("HOME");
    String windowsFirstHomeDirectory = EnvironmentUtils.getenv("HOMEDRIVE") + EnvironmentUtils.getenv("HOMEPATH");
    String windowsSecondHomeDirectory = EnvironmentUtils.getenv("USERPROFILE");

Apache Commons IO のバージョンも注意

別の用途でCommonsを使ってて、入ってたバージョンがちょっと古めだったけど、とりあえず、2.3以上じゃないとだめっぽい(Commons IOは2.6をSDK Coreのpomで指定している)
このメソッドがないぞエラー(NoSuchMethodError)になる。
https://commons.apache.org/proper/commons-io/javadocs/api-2.6/org/apache/commons/io/IOUtils.html#readLines-java.io.InputStream-java.nio.charset.Charset

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?