#author("2023-10-01T00:03:03+09:00","","")
#author("2023-10-01T00:03:29+09:00","","")
[[FrontPage]]

&size(24){リクエストAPI/食品情報提供};

* API情報 [#q6190828]

|~名称|食品情報提供|
|~APIバージョン|2|
|~認証タイプ|アプリケーションキーペア|
|~URL|https://(ホスト名)/requests/api2/(accode)/food/regist/|
|~URL|https://(サーバー名)/requests/api2/(accode)/food/regist/|
|~Method|POST|

* 概要 [#jfe13a2c]

食品情報を提供する。提供された情報は食品登録候補として保存される。食品として登録された場合にはメール等で通知される。


** 使用方法 [#c62c913f]

*** 画像情報を含まない場合 [#ve1ab728]
画像情報がない場合、リクエストボディにJSONデータをセットして送信する。


*** 画像情報を含む場合 [#wad6a3a9]
画像情報がある場合、リクエストボディにマルチパート形式でJSONデータ及び画像データをセットして送信する。
画像情報がない場合でもマルチパート形式での送信は利用可能(updataのみ送信する)。

|name|value(partの中身)|h
|updata|登録するJSONデータ|
|(JSONデータ内で指定)|画像データ|


** リクエスト [#l9016c71]

*** 登録情報 [#l9016c71]
登録する情報は以下の通り。

食品リクエストの場合
- 食品名・商品名 食品の名前や商品の名前等 (必須)

修正リクエストの場合
- 修正対象の食品オブジェクトID (必須)

共通
- メーカー名 商品等の場合、製造メーカー、店名など (任意)
- 備考 参考となる情報など (任意)
- 画像 参考となる画像 (任意)
- コールバック情報 リクエスト処理後にコールバックするための情報 (任意)

*** レート制限 [#ea6a4043]

本APIは、以下のレート制限を行う。
直近1分以内に登録数5以内、且つ直近60分以内に登録数30以内。


*** JSONデータ書式 [#o8fa0685]

 リクエスト本体
 {
    'type' : 'request',
    'ver' : 1,
    'appkey' : (割り当てられたアプリケーションキー),
    'nonce' : (毎回異なる16バイト以上のランダムに生成されたASCII文字列),
    'secret' : (アプリケーションシークレット+nonceのSHA256値),
    'objects' : [
      (登録する食品/修正リクエストオブジェクト),
      (登録する食品/修正リクエストオブジェクト),
    ],
    'dryrun' : (テストの時true,実際には登録されない)
  }

|key|必須|項目|内容|h
|type|必須|タイプ|固定値 request|
|ver|必須|バージョン|固定値 1|
|appkey|必須|アプリケーションキー|アクセスを識別する、割り当てられたアプリケーションキー|
|nonce|必須|ナンス|ランダム文字列。半角英数で構成し、16バイト以上、アクセス毎に異なること|
|secret|必須|認証文字列|アプリケーションシークレット+nonceのSHA256値|
|objects|必須|食品リクエストオブジェクト|登録する食品リクエストオブジェクトの配列|
|dryrun|任意|テスト実行|trueを指定すると実際には登録されない|


 食品リクエストオブジェクト
 {
   'type' : 'food',
   'ver' : 1,
   'name' : (食品名・商品名),
   'maker' : (メーカー名),
   'optinfo' : (備考),
   'pictids' : [
     (画像のformid),
     (画像のformid)
   ],
   'callback' : (コールバックオブジェクト),
   'state' : (任意の文字列),
 }

 修正リクエストオブジェクト
 {
   'type' : 'correct',
   'ver' : 1,
   'objectid' : (修正対象の食品オブジェクトID),
   'maker' : (メーカー名等),
   'optinfo' : (修正に関する情報),
   'pictids' : [
     (画像のformid),
     (画像のformid)
   ],
   'callback' : (コールバックオブジェクト),
   'state' : (任意の文字列),
 }

|key|制限|項目|内容|h
|type|必須|タイプ|固定値 食品リクエストオブジェクト=food 修正リクエストオブジェクト=correct|
|ver|必須|バージョン|固定値 1|
|name|食品リクエスト時必須/最大256byte|食品名・商品名|食品の名前や商品の名前等|
|objectid|修正リクエスト時必須/最大32byte|オブジェクトID|修正対象の食品オブジェクトID|
|maker|任意/最大256byte|メーカー名|商品等の場合、製造メーカー、店名など|
|optinfo|任意/最大1024byte|備考|参考となる情報など|
|pictids|任意|画像|参考となる画像(jpeg形式、1枚あたり最大2Mbyte、1オブジェクトに対して最大2枚まで)のformidの配列|
|callback|任意|コールバック情報|リクエスト処理後にコールバックするための情報を示すコールバックオブジェクト|
|state|任意/最大512byte|ステート情報|オブジェクトに付属する任意の文字列|


 コールバックオブジェクト
 メールの場合
 {
   'type' : 'mail',
   'ver' : 1,
   'mailaddr' : (メールアドレス),
 }
 
 HTTPの場合
 {
   'type' : 'url',
   'ver' : 1,
   'url' : (URL),
   'method' : (GET/POST),
   'body' : (コールバックのリクエストボディ)
 }

|key|必須|項目|内容|h
|type|必須|タイプ|メール=mail/HTTP=url|
|ver|必須|バージョン|固定値 1|
|mailaddr|type=mailの時必須|メールアドレス|送付先メールアドレス,宛先のドメイン制限を行う場合がある|
|url|type=urlの時必須/最大4096byte|URL|アクセス先URL,httpsであること,ドメイン制限を行う場合がある|
|method|任意|httpメソッド|コールバックアクセスのメソッド GET/POST|
|body|任意/最大512byte|リクエストボディ|コールバックアクセスのリクエストボディ|


*** データ制限 [#v5086aca]

1回のリクエスト処理について、登録するオブジェクトの最大数は5まで。
1回のリクエスト処理について、リクエストボディの最大サイズは20Mまで。

** コールバック処理 [#f1e5a4fb]

コールバックオブジェクトが設定されたリクエストが処理された場合、指定に従ってコールバック処理を行う。
コールバックには、以下の情報を含む。

|name|内容|h
|action|処理の種別。registed=食品が登録された/rejected=食品は登録されなかった/test=コールバックのテスト|
|regid|結果オブジェクトに含まれていた登録結果ID|
|state|食品リクエストオブジェクトにstateが存在した場合その値|


*** メールによるコールバック [#r3485a80]

指定されたメールアドレスにメールが送信される。
メールの本文に、結果オブジェクトのregid及び食品リクエストオブジェクトのstateを含むjsonが記述される。

 メールコールバック本文
 {
   'type' : 'callback',
   'ver' : 1,
   'action' : registed/rejected/test,
   'regid' : (登録結果ID),
   'state' : (食品リクエストボディオブジェクトにstateが存在すればその値)
 }


*** URLによるコールバック [#m4b50ff6]

指定されたURLにアクセスを行う。
methodがGET,POSTどちらであっても、アクセス先URLに querystring として以下が追加される。

 action=(処理内容)&regid=(登録結果ID)&state=(食品リクエストボディオブジェクトにstateが存在すればその値)

methodがPOSTの場合、リクエストボディは設定された内容となる。


*** リクエスト例 [#i994a280]

#html{{
<pre class="brush:xml;">
{
    &quot;type&quot;: &quot;request&quot;,
    &quot;ver&quot;: 1,
    &quot;appkey&quot;: &quot;f37dX1DZdSAV3s9v&quot;,
    &quot;nonce&quot;: &quot;6b785fce3a643ec4&quot;,
    &quot;secret&quot;: &quot;ef7128c7001e63b1f89e3f9317b173dd567b0fead891e196127eef62c9f1fe19&quot;,
    &quot;objects&quot;: [
        {
            &quot;type&quot;: &quot;food&quot;,
            &quot;ver&quot;: 1,
            &quot;name&quot;: &quot;\u590f\u91ce\u83dc\u306e\u30ab\u30ec\u30fc\u30aa\u30e0\u305d\u3070&quot;,
            &quot;maker&quot;: &quot;IMD\u98df\u5802&quot;,
            &quot;optinfo&quot;: &quot;\u671f\u9593\u9650\u5b9a\u30e1\u30cb\u30e5\u30fc\u3067\u3059\u3002&quot;,
            &quot;pictids&quot;: [
                &quot;UploadPictFile000&quot;
            ],
            &quot;callback&quot;: {
                &quot;type&quot;: &quot;url&quot;,
                &quot;ver&quot;: 1,
                &quot;url&quot;: &quot;https:\/\/callback.my.server\/?test=1234\u0026code=5678&quot;,
                &quot;method&quot;: &quot;POST&quot;,
                &quot;body&quot;: &quot;request=body\u0026command=hogehoge&quot;
            },
            &quot;state&quot;: &quot;mystate_1234567890&quot;
        }
    ]
}</pre>
}}


** レスポンス [#b7e56e30]

成功時、レスポンスコードは200を返す。
失敗時、レスポンスコードは400を返す。
レスポンスはjson形式である。

 {
   'result' : true/false,
   'reason' : (resultがfalseの時: 失敗事由),
   'registed' : [
      (結果オブジェクト),
      (結果オブジェクト),
   ]

 結果オブジェクト
 {
   'type' : 'registration',
   'ver' : 1,
   'result' : true/false,
   'reason' : (resultがfalseの時: 失敗事由),
   'regid' : (登録結果ID),
   'state' : (登録するオブジェクトにstateが存在すればその値)
 }

|key|項目|内容|h
|type|タイプ|固定値 registration|
|ver|バージョン|固定値 1|
|regid|登録結果ID|result=trueの時、登録されたオブジェクトを識別するID|
|state|ステート情報|登録するオブジェクトに設定されているstate値|
|result|処理結果|成功時true|
|reason|エラー情報|result=falseの時、エラー情報を格納|


*** レスポンス例 [#i994a280]

#html{{
<pre class="brush:xml;">
{
    "result": true,
    "registed": [
        {
            "type": "registration",
            "ver": 1,
            "regid":"20230819154859-JVyL2OxHIhFcKX7fjOPIpf2UfEv0e7kP4FNgajAyLGxKDlRBf",
            "state": "mystate_1234567890",
            "result": true
        }
    ]
}</pre>
}}

* サンプルソース [#ne721aef]

** 写真なしの場合 [#x1a7079c]

&linkr(../requestapi/htmlinsert/sample_eapirequest_food.php){ダウンロード:sample_eapirequest_food.php};

#html{{
 <pre class="brush:php;">
}}
#htmlinsert(sample_eapirequest_food.php)
#html{{
 </pre>
}}


** 写真ありの場合 [#v541fd0e]

&linkr(../requestapi/htmlinsert/sample_eapirequest_foodpict.php){ダウンロード:sample_eapirequest_foodpict.php};

#html{{
 <pre class="brush:php;">
}}
#htmlinsert(sample_eapirequest_foodpict.php)
#html{{
 </pre>
}}

* 仕様変更履歴 [#t05ebefa]

2023/08/10 作成

このドキュメントのバージョン情報
|Version|2|
|Revision|1|
|Editor|IMD|

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS