【悲報】Salesforce HttpRequestでPATCHメソッドがない!
見出し画像

【悲報】Salesforce HttpRequestでPATCHメソッドがない!

TL;DR;

SalesforceのHttpRequestでPATCHメソッドを使用することはできない!
対向システムがHttpRequestのオーバライドリクエストを受け付けくれている場合のみ、メソッドをパラメータに渡すか、HeaderにセットすることでPATCHメソッドを送信することができる

HttpRequestにPATCHがない!

とある業務で対向システムに対してHttpRequestを送信する要件があった。
これ自体はよくある要件ので、じゃあHttpRequestクラスを使用して送信するかねと...

対向システムの仕様書を見ると、部分更新する場合は”PATCH”を使用してね!
とREST APIの思想に則った素晴らしい設計なんだと思いつつ、じゃあ疎通も兼ねてコードを書くかと思って書いたのが以下のソース

// HTTPリクエスト情報を設定(リモートサイトの設定とかはもちろんしてるよ♪)
HttpRequest request = new HttpRequest();
String URL = 'https://xxxxx.com';
request.setEndpoint(URL);

// メソッドはPATCHを指定する
request.setMethod('PATCH');

// HTTPリクエストを対向システムに送信
Http http = new Http();
HTTPResponse res = http.send(req);

上記のソースを実行するとまさかのエラー!!

FATAL_ERROR System.CalloutException: Invalid HTTP method: PATCH


まさかのPATCHメソッドが不正扱い!!

Apex開発者ガイドの確認

困ったときのApex開発者ガイドを確認!
Apex開発者ガイド - HttpRequest クラス

setMethod(method)
HTTP 要求によって使用されるメソッドの種別を設定します。
署名
public Void setMethod(String method)
パラメータ
method
型: String
このメソッドの種別の値には、次のものがあります。
DELETE
GET
HEAD
POST
PUT
TRACE

【悲報】PATCHメソッドがない!解決法は?

タイトルにつけたけど、もう一回つけてしまうくらいのショック!!
SalesforceではPATCHメソッドが使えないんですか。。。
REST APIを作成する際のメソッドにはあるんですけどね。。。あはは
ただできないだと、要件が満たせないので解決方法を模索。
見つかった解決方法はどちらもPOSTメソッドでHttpRequestを送信し、メソッドオーバーライドでPATCHと認識してもらう必要があることが判明。
(今回は対向システムがメソッドオーバーライドに対応してました。)

メソッドオーバーライドに対応しているシステムの場合は、以下の2パターンで解決できます!

解決方法① Headerに値を設定

HttpRequestのHeaderにオーバーライドの設定を行う。
Header名(X-HTTP-Method-Override)は対向システムによって違うので確認が必要。

HttpRequest request = new HttpRequest();
String URL = 'https://xxxxx.com';
request.setEndpoint(URL);

request.setMethod('POST');
request.setHeader('X-HTTP-Method-Override', 'PATCH');

解決方法② URLパラメータに値を設定

HttpRequestのURLパラメータに値を設定する。
パラメータ名も対向システムによって違うので要確認。

HttpRequest request = new HttpRequest();
String URL = 'https://xxxxx.com' + '?_HttpMethod=PATCH';
request.setEndpoint(URL);

request.setMethod('POST');

まとめ

HttpRequestでPATCHメソッドを使用したい場合は、対向システムがメソッドオーバーライドに対応しているかどうかで解決できるかできないかが決まるということが判明!

Salesforce→SalesforceでAPI通信するような要件がある場合に、解決方法2は使用できますが、解決方法1は使用できません。
また、Salesforce社が提供しているCommerce Cloudでは、どちらにも対応しています。(ただし、上に書いたパラメータ名と違う。)

このメソッドオーバーライドにすべてのシステムが対応しているかというとそうではなく、LINE WORKSのような割と大きなサービスでも対応していないことがあります。
LINE WORKS Developers QA - HTTPメソッドの書き換えについて



この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
ワイン好きなシステムエンジニア♪ 資産運用、テクノロジー、ワインなどカテゴリに関係なく記事を書いてます 普段のお仕事はSalesforceの導入支援 趣味ではVue + nodejs (Heroku)がメイン 気軽にフォローしてもらえると嬉しいです