今回の記事はC#でRestAPIを用いてSalesforceにデータをアップサート(Upsert)する方法に関してご紹介します。アップサートとはデータをインサートすることと、仮にデータがある場合は値を更新する操作をまとめた複合語です。簡単に解説していきます。
また、以前の記事でC#でSalesforceの認証を経てログイン、アクセストークンの取得をRestAPIで行った記事を記載しているのでそちらも併せてご確認ください。
「C#でRestAPIを用いてSalesforceにデータを送信・取得する方法。」
アクセストークンなど必要情報の取得
こちらに関しては上記の記事を参考にさくっと取得して下さい。念の為コードも置いておきますが、詳しくは上記のリンク記事をご確認ください。
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="
}
ではこのアクセストークンを使ってアップサート(Upsert)を実際に行ってみましょう。
C#でRestAPIを使ってSalesforceにデータをアップサート(Upsert)
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using AngleSharp;
using AngleSharp.Html.Dom;
namespace test
{
class Program
{
static async Task Main(string[] args)
{
//SalesforceのAPI URL
//https://<インスタンスID>.salesforce.com/services/data/<APIバージョン>/sobjects/<オブジェクト名>
//Patch処理時はURLが変更(元+/<外部ID API>/<外部ID>)
string url = $"インスタンスID/services/data/v51.0/sobjects/カスタムオブジェクト/外部ID";
string parameters = "{" +
$" \"test\" : \"test\" ," +
$" \"test2\" : \"test2\" " +
" }";
//パラメーターをバイト配列に変換
byte[] data = Encoding.UTF8.GetBytes(parameters);
//Salesforce処理実行
string accessToken = "アクセストークン";
string method = "PATCH";
//WebRequestの作成
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
//アクセストークンの指定
if (accessToken != null) req.Headers["Authorization"] = "Bearer " + accessToken;
//メソッドの指定
req.Method = method;
//コンテントタイプの指定
req.ContentType = "application/json";
//POST送信するデータの長さを指定
if (data != null) req.GetRequestStream().Write(data, 0, data.Length);
//サーバーからの応答を受信するためのWebResponseを取得
WebResponse res = null;
try
{
res = await req.GetResponseAsync();
}
catch (WebException e)
{
res = e.Response;
}
//応答データを受信するためのStreamを取得
using (MemoryStream mem = new MemoryStream())
using (Stream resStream = res.GetResponseStream())
{
byte[] buf = new byte[4096];
int r;
while ((r = resStream.Read(buf, 0, buf.Length)) > 0)
{
mem.Write(buf, 0, r);
}
string str = Encoding.UTF8.GetString(mem.ToArray());
Console.WriteLine(str);
}
}
}
}
上記の外部IDで指定したレコードのみUpsert処理を実装できます。その為Salesforce側でも外部IDを設定するなどの設定は必要です。カスタム項目の設定で可能になると思います。詳しくは公式ページでも確認できるのでそちらもみて下さい。
また、上記のhttp通信でもし、「Patch権限がありません」みたいなエラーが発生した場合はカスタムオブジェクトの階層が微妙に違っていることもあります。注意して下さい。
では今回の記事は以上です。他にも多数のC#関連の記事を記載しているので是非興味があればサイト内を見ていってください。
コメント
[…] 「C#でSalesforceにRestAPIでデータをアップサート(Upsert)」 […]