スポンサーリンク
Apigeeのservice calloutではcookieを扱うオプションが存在しないため、手動でヘッダを操作してあげる必要があります。今回はその方法をまとめました。
関連記事 : cookieの仕組みを理解するためにcurlでオプションを使わずcookieを設定してみる
こんな感じでポリシーが並ぶはずです
まず最初にservice calloutでリクエストを送ります。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout async="false" continueOnError="false" enabled="true" name="first_request">
<DisplayName>first_request</DisplayName>
<Properties/>
<Request clearPayload="true" variable="myRequest">
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</Request>
<Response>calloutResponse-01</Response>
<HTTPTargetConnection>
<Properties/>
<URL>https://sample_web_page.example.com</URL>
</HTTPTargetConnection>
</ServiceCallout>
(URLは適当です)
このリクエストに対するレスポンスは calloutResponse-01
に格納されます。
先程のレスポンスからcookieの情報を抜き出します。これにはPythonを使います。
Pythonポリシーの設定とPythonスクリプト両方を作成します。
Python Policyのほう
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Script async="false" continueOnError="false" enabled="true" name="restore_cookies_policy">
<DisplayName>restore_cookies_policy</DisplayName>
<Properties/>
<ResourceURL>py://restore_cookies.py</ResourceURL>
</Script>
Pythonスクリプトの中身
### restore_cookies.py
cookie_list = []
# calloutResponseから"Set-Cookie"ヘッダを取り出す。複数ある場合はlistで取得される
all_cookie = flow.getVariable("calloutResponse-01.header.Set-Cookie.values")
# 各要素は "xx=zz; Path=/; HttpOnly" という内容になっているので、 "xx=zz" だけを取り出す
for cookie in all_cookie:
l = cookie.split(';')
cookie_list.append(l[0])
# 抜き出したcookieをまとめる
# key1=value1; key2=value2; .... のように";"で区切る
cookie = '; '.join(cookie_list)
# apigeeのフローに変数"cookie"として戻す
flow.setVariable("cookie", cookie)
先程変数化したcookieを付けて再度APIコールします。
service calloutポリシー全文
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout async="false" continueOnError="false" enabled="true" name="second_request">
<DisplayName>second_request</DisplayName>
<Properties/>
<Request clearPayload="true" variable="myRequest2">
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
<Set>
<Headers>
<Header name="Cookie">{cookie}</Header>
</Headers>
</Set>
</Request>
<Response>calloutResponse-02</Response>
<HTTPTargetConnection>
<Properties/>
<URL>https://sample_web_page.example.com/login</URL>
</HTTPTargetConnection>
</ServiceCallout>
上記の中で重要なのは
<Set>
<Headers>
<Header name="Cookie">{cookie}</Header>
</Headers>
</Set>
という部分です。このパラメータをつけることによりCookieを付与してAPIコールすることになります。
スポンサーリンク