HTTP コールアウト


フローの中でApexを使って外部システムにコールアウトさせて結果をメール送信するフローを作りましたが、機能しないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4d5aa43c-a92a-faa9-c649-5ea416f63f98.png)

:::note alert
System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out
:::

１での説明によると@InvocableMethodがコールアウトとして認識されているから？　ダメなのかな。

+ [エラー - 「You have uncommitted work pending.Please commit or rollback before calling out」 (未確定の作業が保留中です。コールアウトを実行する前に確定またはロールバックしてください)](https://help.salesforce.com/s/articleView?id=000385708&type=1)

以下に@future(callout=true)を使って回避策が提案されていましたので、分割して作ってみたら...

Future methodsは戻値が持てないらしい... あああやっぱり不可能です。

:::note alert
Future methods do not support return type of String
:::

+ [FLOW/Apex エラーのヘルプ: System.CalloutException: コミットされていない作業が保留中です。コールアウトする前にコミットまたはロールバックしてください。](https://salesforce.stackexchange.com/questions/205933/help-with-flow-apex-error-system-calloutexception-you-have-uncommitted-work-pe)




----------------------------------------


+ [1. Flow BuilderのApexアクションにおいてDMLを行っていないのにHTTPリクエストをコールアウトするとコールアウトエラーとなる。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000IQ5ajSAD)

:::note alert
An Apex error occurred: System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out
:::

:::note
@InvocableMethod自体はコールアウトとして認識してください。ブラウザーからSalesforceに繋がりますから。

[解決方法はこちらです。](https://salesforce.stackexchange.com/questions/205933/help-with-flow-apex-error-system-calloutexception-you-have-uncommitted-work-pe)要するにフローは@InvocableMethodのメソッドを実行します。@future(callout=true)にした別のメソッドはHTTPリクエストを実行します。結果として、フローは終了しますが、@futureにしたメソッドはいつか自動的に発動してくれます。
:::

+ [2. フローからApex実行し、取得した情報をChatterへ投稿したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epyQR)

:::note
実際にはApexクラスから外部のRSSサイトにアクセスしてレスポンスを取得していますか？

そうれあれば、 @InvocableMethod アノテーションを使うように変更できれば、FlowからこのApexを呼び出して結果を得ることはできると思います。

フローで Apex アクションを実行
https://help.salesforce.com/s/articleView?id=sf.flow_build_extend_apex.htm&type=5

RSSの結果に対する処理が複雑でなければ、フロー内で「HTTP コールアウト」を使うこともできると思います。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007TtIqTSAV
:::

+ [HttpCalloutMock インターフェースの実装による HTTP コールアウトのテスト](https://qiita.com/Keiji_otsubo/items/f464e090828b7b19de35)
+ [Salesforce フローを使用して ヘッダーで認証パラメーターを渡す【現状ではできない】](https://qiita.com/Keiji_otsubo/items/d8c5b1ef2b26f6e1f0f2)

+ [The HTTP callout for the PATCH method failed. Expected declared response media type application/json, but got text/html; charset=utf-8 for operation DefaultOperationName and service DefaultServiceName](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmUmT)

:::note
That prompted me to look deeper into the API service's documentation, then I found that the ArcGIS REST API supports responses in several formats. &f=json for response in a JSON object in Esri JSON format.  

•ESRI Developer ArcGIS REST APIs Output formats 

Problem solved! This was not a Salesforce problem at all.

API サービスのドキュメントを詳しく調べたところ、ArcGIS REST API が複数の形式での応答をサポートしていることがわかりました。Esri JSON 形式の JSON オブジェクトでの応答の場合は &f=json です。  

• ESRI Developer ArcGIS REST API 出力形式 

問題は解決しました。これは Salesforce の問題ではありませんでした。
:::