--- title: "関数ディレクトリの設定" url: https://docs.catalyst.zoho.com/ja/tutorials/leadmanager/java/configure-functions-directory/ description: "Catalystコネクタを使用してZoho CRMアカウントに接続し、リードモジュールから直接リードの表示、作成、更新、削除を行えるLead Managerアプリケーションを構築します" last_updated: 2026-03-05T06:13:24Z service: All Services type: tutorial related_links: - name: "Advanced I/O Functions" url: /ja/serverless/help/functions/advanced-io/ - name: "Functionsディレクトリ構造" url: /ja/cli/v1/project-directory-structure/functions-directory --- # 関数ディレクトリの設定 ここからAdvanced I/O関数を設定して、Lead Managerアプリケーションのコーディングを開始します。 関数ディレクトリ[](https://docs.catalyst.zoho.com/ja/cli/v1/project-directory-structure/functions-directory) `functions/crmCRUD`には以下が含まれています: * `CRMCRUD.java`メイン関数ファイル * `catalyst-config.json`設定ファイル * `lib`フォルダ内のJavaライブラリファイル * `.classpath`および`.project`依存関係ファイル `CRMCRUD.java`にコードを追加します。 任意のIDEを使用して関数を設定できます。 > **Note:** このセクションのコードを十分に理解してください。関数とクライアントコードについては、クライアントの設定後に説明します。 以下のコードをコピーして、`functions/crmCRUD`ディレクトリにある`CRMCRUD.java`に貼り付けてファイルを保存してください。 **CRMCRUD.java** ```java import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.logging.Level; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.catalyst.advanced.CatalystAdvancedIOHandler; import com.zc.auth.connectors.ZCConnection; import com.zc.component.ZCUserDetail; import com.zc.component.object.ZCObject; import com.zc.component.object.ZCRowObject; import com.zc.component.object.ZCTable; import com.zc.component.users.ZCUser; import com.zc.component.zcql.ZCQL; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import okhttp3.HttpUrl; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; public class CRMCRUD implements CatalystAdvancedIOHandler { private static final Logger LOGGER = Logger.getLogger(CRMCRUD.class.getName()); private String apiUrl = "https://www.zohoapis.com/crm/v2/Leads"; private String GET = "GET"; private String POST = "POST"; private String PUT = "PUT"; private String DELETE = "DELETE"; private String CLIENT_ID = "{{YOUR_CLIENT_ID}}"; //クライアントIDを追加してください private String CLIENT_SECRET = "{{YOUR_CLIENT_SECRET}}"; //クライアントシークレットを追加してください OkHttpClient client = new OkHttpClient(); @Override @SuppressWarnings("unchecked") public void runner(HttpServletRequest request, HttpServletResponse response) throws Exception { try { LOGGER.info("STARTED!!!"); String url = request.getRequestURI(); String method = request.getMethod(); String responseData = ""; String recordID = ""; Pattern p = Pattern.compile("([0-9]+)"); MediaType mediaType = MediaType.parse("application/json"); JSONParser jsonParser = new JSONParser(); JSONObject data = new JSONObject(); org.json.simple.JSONArray reqData = new org.json.simple.JSONArray(); //getRefreshToken()関数を呼び出してリフレッシュトークンを取得し、userIDとともにTokenテーブルに挿入します if (Pattern.matches("/generateToken", url) && method.equals(GET)) { LOGGER.info("generateToken!!!"); String code = request.getParameter("code"); String domain = (request.getHeader("host").contains("localhost") ? ("http://" + request.getHeader("host")) : ("https://") + request.getHeader("host").split(":")[0]); LOGGER.info("Domain: "+domain); LOGGER.info("Code: "+code); ZCUserDetail details = ZCUser.getInstance().getCurrentUser(); ZCObject object = ZCObject.getInstance(); ZCRowObject row = ZCRowObject.getInstance(); row.set("refresh_token", getRefreshToken(code, domain)); row.set("userId", details.getUserId()); ZCTable tab = object.getTable(1824000000686079L); //テーブルのTable IDに置き換えてください tab.insertRow(row); response.setStatus(200); response.sendRedirect(domain + "/app/index.html"); //getUserDetails()関数を呼び出してユーザー情報を取得します } else if (Pattern.matches("/getUserDetails", url) && method.equals(GET)) { ArrayList<ZCRowObject> user = getUserDetails(); JSONObject resp = new JSONObject(); if (user.isEmpty()) { resp.put("userId", null); response.setContentType("application/json"); response.getWriter().write(resp.toJSONString()); response.setStatus(200); } else { resp.put("userId", user.get(0).get("Token", "userId")); response.setContentType("application/json"); response.getWriter().write(resp.toJSONString()); response.setStatus(200); } //CRMのリードにアクセス、追加、変更するための各種APIを実行します //すべてのリードを取得します } else if (Pattern.matches("/crmData", url) && method.equals(GET)) { responseData = getResponse(GET, null); //特定のリードを取得します } else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(GET)) { Matcher m = p.matcher(url); if (m.find()) { recordID = m.group(1); } apiUrl = apiUrl + "/" + recordID; responseData = getResponse(GET, null); //新しいリードを追加します } else if (Pattern.matches("/crmData", url) && method.equals(POST)) { ServletInputStream requestBody = request.getInputStream(); JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8")); reqData.add(jsonObject); data.put("data", reqData); RequestBody body = RequestBody.create(mediaType, data.toString()); responseData = getResponse(POST, body); //リードを削除します } else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(DELETE)) { Matcher m = p.matcher(url); if (m.find()) { recordID = m.group(1); } apiUrl = apiUrl + "/" + recordID; responseData = getResponse(DELETE, null); //リードを編集します } else if (Pattern.matches("/crmData/([0-9]+)", url) && method.equals(PUT)) { Matcher m = p.matcher(url); if (m.find()) { recordID = m.group(1); } apiUrl = apiUrl + "/" + recordID; ServletInputStream requestBody = request.getInputStream(); JSONObject jsonObject = (JSONObject) jsonParser.parse(new InputStreamReader(requestBody, "UTF-8")); reqData.add(jsonObject); data.put("data", reqData); RequestBody body = RequestBody.create(mediaType, data.toJSONString()); responseData = getResponse(PUT, body); } else { LOGGER.log(Level.SEVERE, "Error. Invalid Request"); //アクションはログに記録されます。CatalystからログをE確認できます response.setStatus(404); responseData = "Error. Invalid Request"; response.getWriter().write(responseData); } response.setContentType("application/json"); response.getWriter().write(responseData); response.setStatus(200); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Exception in CRM Function ", e); response.setStatus(500); response.getWriter().write(e.toString()); } } @SuppressWarnings("unchecked") //リフレッシュトークンを使用してアクセストークンを取得します public String getAccessToken(Long userId) throws Exception { JSONObject authJson = new JSONObject(); JSONObject connectorJson = new JSONObject(); String query = "SELECT refresh_token FROM Token where UserId=" + userId; if (rowList.isEmpty()) { throw new RuntimeException("No token found for userId: " + userId); } Object refreshTokenObj = rowList.get(0).get("Token", "refresh_token"); if (refreshTokenObj == null) { throw new RuntimeException("Refresh token is null for userId: " + userId); } authJson.put("refresh_token", refreshTokenObj.toString()); ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query); authJson.put("client_id", CLIENT_ID); authJson.put("client_secret", CLIENT_SECRET); authJson.put("auth_url", "https://accounts.zoho.com/oauth/v2/token"); authJson.put("refresh_url", "https://accounts.zoho.com/oauth/v2/token"); authJson.put("refresh_token", rowList.get(0).get("Token", "refresh_token")); connectorJson.put(userId.toString(), authJson); return ZCConnection.getInstance(connectorJson).getConnector(userId.toString()).getAccessToken(); } //必要な情報を渡してリフレッシュトークンを取得します public String getRefreshToken(String code, String domain) throws Exception { HttpUrl.Builder urlBuilder = HttpUrl.parse("https://accounts.zoho.com/oauth/v2/token").newBuilder(); urlBuilder.addQueryParameter("code", code); urlBuilder.addQueryParameter("client_id", CLIENT_ID); urlBuilder.addQueryParameter("client_secret", CLIENT_SECRET); urlBuilder.addQueryParameter("grant_type", "authorization_code"); urlBuilder.addQueryParameter("redirect_uri", domain + "/server/crmcrud/generateToken"); String URL = urlBuilder.build().toString(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = RequestBody.create(mediaType, ""); Request getResponse = new Request.Builder().url(URL).method(POST, body).build(); JSONParser jsonParser = new JSONParser(); JSONObject data = (JSONObject) jsonParser.parse(client.newCall(getResponse).execute().body().string()); return data.get("refresh_token").toString(); } //取得したアクセストークンを渡して、CRMモジュールでの各アクションに必要な認可を取得します public String getResponse(String METHOD, RequestBody body) throws Exception { Long userId = ZCUser.getInstance().getCurrentUser().getUserId(); String accessToken = getAccessToken(userId); Request getResponse = new Request.Builder().url(apiUrl).method(METHOD, body) .addHeader("Authorization", "Zoho-oauthtoken " + accessToken).build(); return client.newCall(getResponse).execute().body().string(); } //userIDを渡してリフレッシュトークンを含むTokenテーブルのレコードを取得します public ArrayList<ZCRowObject> getUserDetails() throws Exception { Long userId = ZCUser.getInstance().getCurrentUser().getUserId(); String query = "SELECT * FROM Token where UserId=" + userId; ArrayList<ZCRowObject> rowList = ZCQL.getInstance().executeQuery(query); return rowList; } } ``` > **Note:** このコードを関数ファイルにコピー・貼り付けした後、以下の値を必ず置き換えてください: * 32行目の[Client ID](https://docs.catalyst.zoho.com/ja/tutorials/leadmanager/java/register-client) * 33行目の[Client Secret](https://docs.catalyst.zoho.com/ja/tutorials/leadmanager/java/register-client) * 61行目の[Table ID](https://docs.catalyst.zoho.com/ja/tutorials/leadmanager/java/create-table) これで関数ディレクトリの設定が完了しました。関数とクライアントコードについては、クライアントの設定後に説明します。