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?

Salesforce記録⑤:salesforce RestAPI作成について(202406)

Last updated at Posted at 2024-08-07

1.Salesforce Oauth の設定

①:インテグレーション用プロファイルでシステム管理者権限の「API の有効化」が有効になっているのを確認します。

image.png

➁:[設定] - [アプリケーション] - [新規接続アプリケーション]をクリックします。

image.png

callback urlは使わないので、デファクトで良い。使う場合は別時間で紹介する
default:https://test.salesforce.com/services/oauth2/success
or https://login.salesforce.com/services/oauth2/success

③:保存すると、接続アプリケーションの定義の詳細ページが表示されます。ここのコンシューマ鍵とコンシューマの秘密は認証を行う際に必要になります。(このページは [設定] - [オブジェクトマネージャ] から対象の接続アプリケーションの▼ボタンから[参照]をクリックすることで表示できます)

image.png

④:セキュリティトークンの取得

インテグレーションユーサでログインし、[右上のユーザアイコン] - [設定] - [私の個人情報] - [私のセキュリティトークンのリセット]2 の[セキュリティトークンのリセット]をクリックします。※[セキュリティトークンのリセット]が表示されない場合、セキュリティトークンの取得は必要ありません。

image.png

ユーザーtoken取得(profileにIPの制限cancel)

image.png

ユーザ名パスワード OAuth 認証

リクエストを新規で作成し下記のように設定を行います
METHOD: POST
パス: 適切なSalesforce トークン要求エンドポイント
(例: https://login.salesforce.com/services/oauth2/token)
HEADERS
Content-Type: application/x-www-form-urlencoded
BODYにFormを選択し次のパラメータを設定します
grant_type=password
client_id=[接続アプリケーションのコンシューマ鍵]
client_secret=[接続アプリケーションのコンシューマの秘密]
username=[インテグレーション用ユーザのSalesforceユーザ名]
password=[インテグレーション用ユーザのSalesforceログインパスワード+セキュリティトークン]

⑤:OAuth および OpenID Connect 設定

image.png

⑥:RESTリクエストを送信するときにレスポンスボディのaccess_tokenを使用し、Apex関数にアクセスする。

image.png

2.Front側の作成例(JS)

//Token GET

// token GET
function getToken() {
  return request
    .post(url.resolve(salesforceApi.endPoint, "/services/oauth2/token"))
    .set("Content-Type", "application/x-www-form-urlencoded")
    .send({
      grant_type: "password",
      client_id: salesforceApi.clientId,
      client_secret: salesforceApi.clientSecret,
      username: salesforceApi.username,
      password: salesforceApi.password ,
      //password: salesforceApi.password + userToken,
    })
    .then(function (res) {
      token = res.body.access_token;
      instanceUrl = res.body.instance_url;
      return {
        token,
        instanceUrl,
      };
    })
    .catch(function (e) {
      return Promise.reject(e);
    });
}

// Token Use ①普通


function getApexThings(req, res, next) {
  var reqUrl = url.resolve(
    instanceUrl, //getToken()取得したURL
    `/services/apexrest/application/`
  );
  return request
    .post(reqUrl)
    .set("Authorization", `Bearer ${token}`)//getToken()取得したToken
    .set('Accept', 'application/json')
    .then(function (data) {
      return res.status(200).send(data.body);
    })
    .catch(function (e) {
      if (e.status === 401) {
        if (req.body.isRetry) {
          return res.status(401).send('初期化失敗');
        }

        req.body.isRetry = true
        return getToken().then(function () {
          return getApexThings(req, res, next);
        });
      }

      if (e.status === 404) {
        return res.status(404).send('初期化失敗');
      }

      return res.status(e.status).send('初期化失敗');
    });
}

// Token Use ➁ Image blob

handleImage() {
      // Salesforce REST API エンドポイント
      const apiUrl = '{instanceUrl}/services/apexrest/application/';

      // Fetch API を使用して POST リクエストを送信
      fetch(apiUrl, {
          method: 'POST',
          headers: {
              'Authorization': 'Bearer  XXXXXXXX',
              'Content-Type': 'image/jpeg'
          },
          body: this.fileBLOB//this.blobdata
      })
      .then(response => {
          if (!response.ok) {
              throw new Error('Network response was not ok');
          }
          return response.json();
      })
      .then(data => {
          console.log('Response data:', data);
      })
      .catch(error => {
          console.error('There was a problem with the request:', error);
          console.error('catch1:'+error+'\n'+' message: '+error.message+'\n'+' stack: '+error.stack);
      });
  }

3.backend側の作成例(APEX)

①普通

@RestResource(urlMapping='/application/*')
global with sharing class RestApi {
  @HttpPost
    global static String post() {
        System.debug(' HttpPost');
        //各ロジック処理
        return 'OK';
	}
}

➁Image upload 処理

@RestResource(urlMapping='/application/*')
global with sharing class RestApi {
    
    @HttpPost
    global static String post() {
        //image blobを画像に変更する
        Blob fileContent = RestContext.request.requestBody;
        ContentVersion contentVersionRecord = new ContentVersion();
        contentVersionRecord.VersionData = fileContent;
        contentVersionRecord.Title = '123';
        contentVersionRecord.PathOnClient = '1123.jpeg';
         //  【ファイル】の下に XXXImagesフォルダがある
        ContentWorkspace cw =  [SELECT Id, Name FROM ContentWorkspace WHERE Name = 'XXXImages']; 
        //画像の場所を設定する
        contentVersionRecord.FirstPublishLocationId = cw.Id;
        insert contentVersionRecord;

        return 'OK';
	}
}

4.アクセス失敗の場合はどうする

ログイン履歴をチェックする

image.png

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?