public class ApiRequestException extends Exception {
private int statusCode;
private String errorMessage;
public ApiRequestException(int statusCode, String errorMessage) {
super("API Request Failed with status code: " + statusCode + ", Error: " + errorMessage);
this.statusCode = statusCode;
this.errorMessage = errorMessage;
}
public int getStatusCode() {
return statusCode;
}
public String getErrorMessage() {
return errorMessage;
}
}
public class ApiClient {
// RESTful APIã¨é€šä¿¡ã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰
public void makeApiRequest() throws ApiRequestException {
// APIリクエストを実行ã—ã€ã‚¨ãƒ©ãƒ¼ãƒ¬ã‚¹ãƒãƒ³ã‚¹ãŒã‚れã°ä¾‹å¤–をスãƒãƒ¼ã™ã‚‹
int statusCode = /* APIã‹ã‚‰ã®ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰ */;
if (statusCode >= 400) {
String errorMessage = /* エラーレスãƒãƒ³ã‚¹ã‹ã‚‰å–å¾—ã—ãŸã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ */;
throw new ApiRequestException(statusCode, errorMessage);
}
// æ£å¸¸ãªå‡¦ç†ã‚’続行
System.out.println("API Request Successful");
}
}
public class Main {
public static void main(String[] args) {
ApiClient apiClient = new ApiClient();
try {
apiClient.makeApiRequest();
} catch (ApiRequestException e) {
System.out.println("API Request Failed: " + e.getStatusCode() + ", " + e.getErrorMessage());
// ä»–ã®ä¾‹å¤–処ç†ã‚„リトライãƒã‚¸ãƒƒã‚¯ãªã©ã‚’è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™
}
}
}
- ApiRequestException クラスã®ä½œæˆ:
ApiRequestExceptionã¯ã€RESTful APIリクエストä¸ã«ã‚¨ãƒ©ãƒ¼ãƒ¬ã‚¹ãƒãƒ³ã‚¹ãŒè¿”ã•れãŸå ´åˆã«ã‚¹ãƒãƒ¼ã•れるカスタム例外クラスã§ã™ã€‚- コンストラクタã§ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰ã¨ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–りã€ãれらをå«ã‚€ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’生æˆã—ã¾ã™ã€‚
- ApiClient クラス:
makeApiRequestメソッドã¯ã€RESTful APIã¨ã®é€šä¿¡ã‚’シミュレートã—ã¾ã™ã€‚- APIã‹ã‚‰ã®ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’確èªã—ã€ã‚¨ãƒ©ãƒ¼ãƒ¬ã‚¹ãƒãƒ³ã‚¹ãŒã‚れã°
ApiRequestExceptionをスãƒãƒ¼ã—ã¾ã™ã€‚
- Main クラス:
Mainクラスã§ã¯ã€ApiClientを使用ã—㦠API リクエストを実行ã—ã€ApiRequestExceptionã‚’ã‚ャッãƒã—ã¦é©åˆ‡ãªå‡¦ç†ã‚’行ã„ã¾ã™ã€‚
ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯ã€RESTful APIã‹ã‚‰ã®ã‚¨ãƒ©ãƒ¼ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã«å¯¾ã—㦠ApiRequestException を使用ã—ã¦é©åˆ‡ã«ä¾‹å¤–処ç†ã‚’行ã†ã‚‚ã®ã§ã™ã€‚
RESTful API
RESTful API(Representational State Transferful Application Programming Interface)ã¯ã€Webサービスã®è¨è¨ˆåŽŸå‰‡ã«åŸºã¥ã„ãŸAPIã®å½¢å¼ã§ã™ã€‚REST(Representational State Transfer)ã¯ã€åˆ†æ•£åž‹ãƒã‚¤ãƒ‘ーメディアシステムã®ãŸã‚ã®è»½é‡ã§æ‹¡å¼µå¯èƒ½ãªã‚½ãƒ•トウェアアーã‚テクãƒãƒ£ã‚¹ã‚¿ã‚¤ãƒ«ã§ã™ã€‚
以下ã¯ã€RESTful APIã®ä¸»ãªç‰¹å¾´ã¨åŽŸå‰‡ã§ã™ã€‚
- リソース指å‘:
- RESTful APIã§ã¯ã€ãƒªã‚½ãƒ¼ã‚¹ï¼ˆãƒ‡ãƒ¼ã‚¿ã‚„サービスã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒã‚¤ãƒ³ãƒˆï¼‰ãŒURI(Uniform Resource Identifier)ã«ã‚ˆã£ã¦è¡¨ç¾ã•れã¾ã™ã€‚例ãˆã°ã€
/usersã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒªã‚½ãƒ¼ã‚¹ã‚’表ã—ã¾ã™ã€‚
- RESTful APIã§ã¯ã€ãƒªã‚½ãƒ¼ã‚¹ï¼ˆãƒ‡ãƒ¼ã‚¿ã‚„サービスã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒã‚¤ãƒ³ãƒˆï¼‰ãŒURI(Uniform Resource Identifier)ã«ã‚ˆã£ã¦è¡¨ç¾ã•れã¾ã™ã€‚例ãˆã°ã€
- HTTPメソッド:
- HTTPメソッド(GETã€POSTã€PUTã€DELETEãªã©ï¼‰ã¯ã€æ“作ã®ç¨®é¡žã‚’表ç¾ã—ã¾ã™ã€‚
GETã¯ãƒªã‚½ãƒ¼ã‚¹ã®å–å¾—ã€POSTã¯æ–°ã—ã„リソースã®ä½œæˆã€PUTã¯æ—¢å˜ã®ãƒªã‚½ãƒ¼ã‚¹ã®æ›´æ–°ã€DELETEã¯ãƒªã‚½ãƒ¼ã‚¹ã®å‰Šé™¤ã‚’示ã—ã¾ã™ã€‚
- ステートレス:
- RESTfulサービスã¯ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¬ã‚¹ã§ã‚りã€å„リクエストã¯ä»–ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¨ç‹¬ç«‹ã—ã¦ã„ã¾ã™ã€‚サーãƒã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®çŠ¶æ…‹ã‚’ä¿æŒã—ãªã„ãŸã‚ã€ã‚·ãƒ³ãƒ—ルã‹ã¤æ‹¡å¼µå¯èƒ½ã§ã™ã€‚
- 表ç¾:
- リソースã®è¡¨ç¾ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã‚µãƒ¼ãƒé–“ã§ã‚„りå–りã•れるデータ形å¼ã‚’指ã—ã¾ã™ã€‚通常ã¯JSONã‚„XMLãŒä½¿ç”¨ã•れã¾ã™ã€‚
- 統一インターフェース:
- RESTful APIã¯çµ±ä¸€ã•れãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースをæŒã¡ã¾ã™ã€‚ã“れã«ã¯ä¸€è²«ã—ãŸURIæ§‹é€ ã€çµ±ä¸€ã•れãŸHTTPãƒ¡ã‚½ãƒƒãƒ‰ã€æ¨™æº–çš„ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆ/レスãƒãƒ³ã‚¹ãƒ•ォーマットãŒå«ã¾ã‚Œã¾ã™ã€‚
- リクエストã¨ãƒ¬ã‚¹ãƒãƒ³ã‚¹:
- クライアントãŒã‚µãƒ¼ãƒã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’行ã„ã€ã‚µãƒ¼ãƒãŒãれã«å¯¾ã™ã‚‹ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã‚’è¿”ã—ã¾ã™ã€‚レスãƒãƒ³ã‚¹ã¯æˆåŠŸã¾ãŸã¯å¤±æ•—を示ã™ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰ã¨å…±ã«ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚€ã“ã¨ãŒä¸€èˆ¬çš„ã§ã™ã€‚
- HATEOAS(Hypermedia As The Engine Of Application State):
- クライアントã¯å‹•çš„ã«ãƒªãƒ³ã‚¯ã•れãŸãƒã‚¤ãƒ‘ーメディアを介ã—ã¦ã‚¢ãƒ—リケーションã®çŠ¶æ…‹ã‚’ç†è§£ã—ã€æ“作ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
RESTful APIã¯ã€ã“れらã®åŽŸå‰‡ã«å¾“ã£ã¦ã‚·ãƒ³ãƒ—ルã§åŠ¹æžœçš„ãªWebサービスを構築ã™ã‚‹ãŸã‚ã®å¼·åŠ›ãªæ‰‹æ®µã¨ãªã£ã¦ã„ã¾ã™ã€‚
RESTful APIã¯ã€ã‚·ãƒ³ãƒ—ルã§åŠ¹æžœçš„ãªWebサービスを構築ã™ã‚‹ãŸã‚ã®åŽŸå‰‡ã¨ã—ã¦ã€ãƒªã‚½ãƒ¼ã‚¹æŒ‡å‘ã€HTTPメソッドã€ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¬ã‚¹æ€§ã€è¡¨ç¾ã€çµ±ä¸€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¨ãƒ¬ã‚¹ãƒãƒ³ã‚¹ã€HATEOASãªã©ã®ç‰¹å¾´ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ã“れらã®åŽŸå‰‡ã«åŸºã¥ã„ã¦æ§‹ç¯‰ã•れãŸAPIã¯ã€æŸ”è»Ÿæ€§ã¨æ‹¡å¼µæ€§ãŒã‚りã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã‚µãƒ¼ãƒãƒ¼ã®é–“ã§ä¸€è²«æ€§ã®ã‚るコミュニケーションをæä¾›ã—ã¾ã™ã€‚
RESTful APIã®æŽ¡ç”¨ã¯ã€ç•°ãªã‚‹ãƒ—ラットフォームやクライアントãŒäº’ã„ã«åŠ¹çŽ‡çš„ã‹ã¤ã‚·ãƒ¼ãƒ レスã«é€šä¿¡ã§ãるよã†ã«ãªã‚‹ãªã©ã€å¤šãã®åˆ©ç‚¹ã‚’ã‚‚ãŸã‚‰ã—ã¦ã„ã¾ã™ã€‚開発者ã¯ä¸€åº¦ç†è§£ã™ã‚Œã°ã€å…±é€šã®åŽŸå‰‡ã«åŸºã¥ã„ã¦ç•°ãªã‚‹ã‚µãƒ¼ãƒ“スやアプリケーションを構築ã§ãã€ä¿å®ˆæ€§ã‚„拡張性ã®å‘ä¸ŠãŒæœŸå¾…ã§ãã¾ã™ã€‚
ã“れã‹ã‚‰ã‚‚ã€RESTful APIã®åŽŸå‰‡ã¯Webサービスã®è¨è¨ˆã‚„開発ã«ãŠã„ã¦é‡è¦ãªæŒ‡é‡ã¨ã—ã¦ä½ç½®ã¥ã‘られã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆä¸Šã®æ§˜ã€…ãªã‚µãƒ¼ãƒ“スã¨ã‚¢ãƒ—リケーションã®åŸºç›¤ã¨ã—ã¦ã•らã«é€²åŒ–ã—ã¦ã„ãã“ã¨ã§ã—ょã†ã€‚
外部API通信ã®ä¾‹å¤–処ç†
外部API通信ã®ä¾‹å¤–処ç†ã¯ã€é€šä¿¡æ™‚ã«ç™ºç”Ÿã™ã‚‹æ§˜ã€…ãªå•題ã«å¯¾å‡¦ã—ã€ã‚·ã‚¹ãƒ†ãƒ ã®å®‰å®šæ€§ã‚’確ä¿ã™ã‚‹é‡è¦ãªå´é¢ã§ã™ã€‚以下ã¯ã€å¤–部API通信時ã®ä¾‹å¤–処ç†ã«é–¢ã™ã‚‹è§£èª¬ã§ã™ã€‚
- ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ã®å‡¦ç†:
- 通信時ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«é–¢é€£ã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã“れã«ã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã€æŽ¥ç¶šã®åˆ‡æ–ã€DNSã®è§£æ±ºã‚¨ãƒ©ãƒ¼ãªã©ãŒå«ã¾ã‚Œã¾ã™ã€‚
- ã“れらã®ã‚¨ãƒ©ãƒ¼ã«å¯¾å‡¦ã™ã‚‹ãŸã‚ã«ã¯ã€
java.netパッケージãªã©ã‚’使用ã—ã¦ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ã‚’ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã—ã€é©åˆ‡ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«æä¾›ã—ã¾ã™ã€‚
- HTTPステータスコードã®å‡¦ç†:
- 外部APIãŒã‚¨ãƒ©ãƒ¼ã‚’示ã™HTTPステータスコード(4xxã‚„5xx)を返ã™å ´åˆã€ã“れをã‚ャッãƒã—ã¦é©åˆ‡ãªå¯¾å¿œã‚’行ã„ã¾ã™ã€‚
- ステータスコードã«åŸºã¥ã„ã¦ãƒªãƒˆãƒ©ã‚¤ãƒã‚¸ãƒƒã‚¯ã‚’実装ã—ãŸã‚Šã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ•レンドリーãªã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãŸã‚Šã—ã¾ã™ã€‚
- サービス利用制é™ã®å‡¦ç†:
- 外部APIã«ã¯åˆ©ç”¨åˆ¶é™ãŒã‚ã‚‹å ´åˆãŒã‚りã¾ã™ã€‚ã“れã«å¯¾å‡¦ã™ã‚‹ãŸã‚ã«ã¯ã€APIã‚ãƒ¼ã®æœ‰åŠ¹æ€§ã‚’ç¢ºèªã—ã€åˆ¶é™ã«é”ã—ãŸå ´åˆã¯é©åˆ‡ãªã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æç¤ºã—ã¾ã™ã€‚
- ãƒ‡ãƒ¼ã‚¿ã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯:
- APIã‹ã‚‰å—ã‘å–ã‚‹ãƒ‡ãƒ¼ã‚¿ãŒæœŸå¾…通りã§ãªã„å ´åˆã€ä¾‹å¤–をスãƒãƒ¼ã—ã¦ç•°å¸¸ã‚’検知ã—ã‚„ã™ãã—ã¾ã™ã€‚ãŸã¨ãˆã°ã€JSONã®ãƒ‘ースエラーã€å¿…è¦ãªãƒ•ィールドãŒå˜åœ¨ã—ãªã„å ´åˆãªã©ã§ã™ã€‚
- ãƒã‚°ã®é©åˆ‡ãªåˆ©ç”¨:
- 例外ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã‚·ã‚¹ãƒ†ãƒ ã®ãƒã‚°ã«è©³ç´°ãªæƒ…å ±ã‚’æ®‹ã—ã€ãƒ‡ãƒãƒƒã‚°ã‚„トラブルシューティングをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚
外部API通信ã®ä¾‹å¤–処ç†ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ã®ãƒãƒã‚¹ãƒˆã•ï¼ˆå …ç‰¢æ€§ï¼‰ã¨ä¿¡é ¼æ€§ã‚’å‘上ã•ã›ã‚‹ãŸã‚ã«ä¸å¯æ¬ ã§ã™ã€‚利用者や開発者ãŒç™ºç”Ÿã—ãŸã‚¨ãƒ©ãƒ¼ã«å¯¾å‡¦ã§ãるよã†ã€é©åˆ‡ã‹ã¤åˆ†ã‹ã‚Šã‚„ã™ã„エラーメッセージをæä¾›ã™ã‚‹ã“ã¨ãŒé‡è¦ã§ã™ã€‚
外部API通信ã®ä¾‹å¤–処ç†ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ã®å®‰å®šæ€§ã¨ä¿¡é ¼æ€§ã‚’確ä¿ã™ã‚‹ãŸã‚ã«ä¸å¯æ¬ ã§ã™ã€‚ç•°ãªã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç’°å¢ƒã‚„サービスã®åˆ©ç”¨æ¡ä»¶ã€ãƒ‡ãƒ¼ã‚¿ã®å¤‰å‹•ã«æŸ”軟ã‹ã¤å …牢ã«å¯¾å¿œã™ã‚‹ã“ã¨ãŒæ±‚ã‚られã¾ã™ã€‚é©åˆ‡ãªã‚¨ãƒ©ãƒ¼ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã¨ãƒã‚°ã®æ´»ç”¨ã¯ã€å•é¡Œã®æ—©æœŸç™ºè¦‹ã¨è§£æ±ºã«ã¤ãªãŒã‚Šã¾ã™ã€‚
エラーãŒç™ºç”Ÿã—ãŸå ´åˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«å¯¾ã—ã¦åˆ†ã‹ã‚Šã‚„ã™ã„エラーメッセージをæä¾›ã™ã‚‹ã¨ã¨ã‚‚ã«ã€ãƒã‚°ã«è©³ç´°ãªæƒ…å ±ã‚’æ®‹ã™ã“ã¨ã§ã€ãƒ‡ãƒãƒƒã‚°ã‚„トラブルシューティングãŒå††æ»‘ã«è¡Œãˆã‚‹ã§ã—ょã†ã€‚冗長ãªé€šä¿¡ã‚„データã®ä¸æ•´åˆã‚’未然ã«é˜²ãŽã€ã‚·ã‚¹ãƒ†ãƒ 全体ã®å“質をå‘上ã•ã›ã‚‹ãŸã‚ã«ã€å¤–部API通信ã®ä¾‹å¤–処ç†ã¯æ…Žé‡ã«æ¤œè¨Žã•れるã¹ãã§ã™ã€‚
最良ã®å®Ÿè·µã§ã¯ã€å¤–部APIã®ãƒ‰ã‚ュメンテーションをé©åˆ‡ã«æŠŠæ¡ã—ã€APIã®ä»•様やエラーレスãƒãƒ³ã‚¹ã«é–¢ã™ã‚‹ç†è§£ã‚’æ·±ã‚ã‚‹ã“ã¨ãŒé‡è¦ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€äºˆæ¸¬å¯èƒ½ãªã‚¨ãƒ©ãƒ¼ã‚„å•題ã«å¯¾ã—ã¦ã‚ˆã‚ŠåŠ¹æžœçš„ã‹ã¤é©åˆ‡ãªå¯¾å‡¦ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
「019 例外ã¨ä¾‹å¤–処ç†ã€å•題集リスト
🎯 実習ã§ç†è§£ã‚’æ·±ã‚よã†
ã“ã®å†…容ã«ã¤ã„ã¦JavaDrillã§å®Ÿéš›ã«æ‰‹ã‚’å‹•ã‹ã—ã¦å¦ç¿’ã§ãã¾ã™


コメント