今回の記事はC#でSalesforceにRestAPIを使ってデータを取得・送信する方法についてまとめた記事です。自分自身C#は使用するのですが、Salesforce初心者ですので初心者の方にもわかるようにできるだけ分かりやすく記載していきます。是非参考にしてみてください。
SalesforceにRest APIを作成
まずはSalesforce側でRestAPIアプリを作成します。
接続アプリケーションを作成
画面から設定を選択します。
移動した先の画面で、左サイドの検索窓に「アプリケーションマネージャ」→「アプリケーションマネージャ」を選択→「新規接続アプリケーション」を選択します。
次に接続先アプリケーション名、API参照名、取引先責任者メールを設定します。また、OAuth設定の有効化を選択し、選択したOAuth範囲の右側のリストにフルアクセスを追加して保存してください。
今回はアプリケーション名、API参照名はなんでもOKです。分かりやすく「RestAPI」とかでいいと思います。メールは中身が確認できるものでしたらgmailでもicloudでもなんでも良いと思います。
これでアプリケーションの作成は完了です。
OAuth認証の設定
次にこのページを開き、「Manage」を押します。「アプリケーション」の「アプリケーションマネージャ」一覧ページからも「Manage」を開くことができます。
または「アプリケーション」の「アプリケーションマネージャー」の一覧から接続アプリを選択し、「Manage」をクリックします。すると「OAuthのポリシー」の「許可されているユーザ」と「IP制限の緩和」の設定を下記のように「すべてのユーザは自己承認可能」、「IP制限の緩和」に設定します。
これをしていないと下記のようなエラーがアクセスキー取得時に起きます。
{"error":"invalid_grant","error_description":"authentication failure"}
この回避方法はgithubの方でも紹介されていましたがより分かりやすくまとめたので下記の記事を参考にしてみてください。
RestAPIで必要なキーを確認
設定した後はアプリケーションがAPIに接続する際に必要な情報を取得する方法を見ていきましょう。
必要な情報は「コンシューマの秘密」と「コンシューマ鍵」です。
先ほど登録した内容を閲覧できるリストを開き参照で開くと「コンシューマ鍵」と「コンシューマの秘密」を表示できます。
次に、APIの利用時にIDとパスワードでログインする場合の方法となりますが、ユーザーのセキュリティトークンが必要になりますので、忘れた方はリセットして新しく取得しておきましょう。
右上のログインユーザーの情報から設定を開きます。
私のセキュリティトークンのリセットを開きセキュリティトークンのリセットのボタンを押下しましょう。
リセット後ユーザーのメールアドレスに新しいセキュリティトークンが送信されます。それを確認すれば必要な情報は揃います。
C#でSalesforceからデータ取得
まずは指定のSalesforceのサービスに入るため、OAuth認証をクリアする必要があります。その為アクセストークンとインスタンスIDを取得していきます。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
class Test
{
// httpクライアント
private static HttpClient client = new HttpClient();
//メイン関数
public static async Task Main()
{
//ログイン情報作成
//こちらはアクセストークンなどを取得するための
//特別なURLで自身のSalesforceURLではありません。
string loginurl = "https://login.salesforce.com/services/oauth2/token";
//SandBoxの場合は"https://test.salesforce.com/services/oauth2/token"
var parameter = new Dictionary<string, string>()
{
{ "grant_type", "password"},
{ "client_id", "コンシューマー鍵" },
{ "client_secret", "コンシューマーの秘密" },
{ "username", "自身のSalesforceログインで使用しているメールアドレス" },
{ "password", "自身のSalesforceログインで使用しているパスワード" + "シークレットキー" },
};
var content = new FormUrlEncodedContent(parameter);
HttpResponseMessage Response;
try
{
//Post通信
Response = await client.PostAsync(loginurl, content);
}
catch
{
//通信エラー時は空文字を返す
return;
}
var response = await Response.Content.ReadAsStreamAsync();
Console.WriteLine(response);
}
}
}
レスポンスは下記のように返ってくると思います。
{
"access_token": "000A000A0a0A0!QAKAJDSKLNDLAS5215153153AD21312A.LKJHSADLKJAL2465461256151111010000254",
"instance_url": "https://app.salesforce.com",
"id": "https://login.salesforce.com/id/00D0ED/00392HJGJH00XM000000",
"token_type": "Bearer",
"issued_at": "73268",
"signature": "fkhjsakdfl/jksfdljk2/b1olCBVsdsDG+zZC76ad7889DFDJKY="
}
簡単に解説を行っていきます。
まずはHttpCliantを準備しております。Webへのアクセスの際は基本的に使うものになります。
次にPost通信に付与するフォームデータを整形しています。こちらは先ほどの章で取得してきた下記5つの要素を組み合わせます。
client_id:「コンシューマ鍵」
client_secret:「コンシューマの秘密」
username:「ユーザー名」
password:「パスワード」+「セキュリティートークン」
最後にPost通信をして返ってきたレスポンスのContentを取り出して文字列に変換しております。
こちらJson形式ですのでJson型に変換した方が扱いやすいかもしれません。下記でC#でWebリクエストに対するレスポンスをJsonとして読み込む方法に関しては下記記事を参考にしてみてください。
「【C#】WebレスポンスをJsonとして読み込む方法をご紹介。」
レスポンスとして取得したものの中で必要なのは「access_token」と「instance_url」です。
これらはデータ取得や更新などをする際に必要な値となります。
「access_token」はログインした証となるものでデータ取得などをする際に必要となります。
「instance_url」は実際にデータ取得などするときにアクセスするベースURLとなります。
インスタンスID(appの部分)は使用者によって変わると思います。
テストで必要であれば実際に取得できた値をメモっておきましょう。
この記事では、以降この結果をキーに設定したサンプルを掲載していきます。
C#でSalesforceにデータ送信
上記で得た結果をベタがきで処理を実装しております。もしも自動プログラムとして走らせる場合は取得した「access_token」と「instance_url」を変数に入れるなりして使用すればいいと思います。
ではレコードを作成します。
レコードを作成するには
「https://<インスタンスID>.salesforce.com/services/data/<APIバージョン>/sobjects/<オブジェクト名>」
にアクセスし、POSTを指定してリクエストします。登録内容はJSONデータなどで指定します。取引先のオブジェクト名はSalesforce画面の「オブジェクトマネージャー」などで確認してください。またAPIバージョンに関しては下記コードをターミナル、コマンドプロンプトで打つことで確認することができます。(2021/05でVer51.0が最新なようです。)
curl https://<インスタンスID>.salesforce.com/services/data
ではデータ送信の処理を記載していきましょう。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
class Test
{
// httpクライアント
private static HttpClient client = new HttpClient();
//メイン関数
public static async Task Main()
{
//Post先URL
//https://<インスタンスID>.salesforce.com/services/data/<APIバージョン>/sobjects/<オブジェクト名>";
//Salesforce送信用のパラメーター
string parameters = "{" +
" \"json1\" : \"test\" ," +
" \"Name\" : \"テスト\" ," +
" \"SalesforceのAPI参照名\" : \"てすと\" }";
//Postで付与するパラメータ
var content = new StringContent(parameters, Encoding.UTF8, "application/json");
//リクエストヘッダーにアクセストークン付与
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accesstoken);
//Post通信
HttpResponseMessage Response;
try
{
Response = await client.PostAsync(url,content);
}
catch
{
//通信エラー時は空文字を返す
return;
}
}
}
}
少しだけ解説を行うとJson 文字列を整形してそれをbodyとしてPostAsyncで追加付与しています。この辺りは別記事でPostAsyncの使い方を記載しているのでそちらをご参照ください。
また、先ほど取得したアクセストークンはヘッダー情報としてclientに追加しております。
今回の記事ではレコードの追加と取得を行っていますが、レコードを追加する際にレコードがあれば値を更新、なければレコード追加という便利なアップサート(Upsert)を行う方法に関しても下記記事で記載しています。是非みてみて下さい。
「C#でSalesforceにRestAPIでデータをアップサート(Upsert)」
ではこれで今回の記事を終了します。他にも多数のC#関連の記事を記載しているのでそちらも是非参考にしてみてください。
コメント
[…] 「C#でRestAPIを用いてSalesforceにデータを送信・取得する方法。」 […]