私はREST APIを構築中です。すべてのデータがJSONとして返されています。各リクエストは、HTTPステータスコードの設定、メッセージやデータの返信、ヘッダーの設定などの機能を果たす単一のファンクションを介して行われます。?fields=
パラメータを追加して、返すフィールドを指定できます(例:?fields=id,hostnames,ip_addresses
)パラメータが存在しない場合は、返されたすべてのデータを取得します。これを行う関数は、ヘッダー/データ/メッセージなどを設定する関数earlerの一部でもあります。私ができるようにしたいのは、ユーザーがドット表記を使ってフィールド名を指定できるようにして、何かからフィールドを指定できるようにすることですトップレベルのフィールド以外。したがって、たとえば、私はこのような構造を持っている:PHP - ドット表記の配列キーのリストを使用して新しい配列を作成する
{
"id": "8a2b449111b449409c465c66254c6fcc",
"hostnames": [
"webapp1-sfo",
"webapp1-sfo.example.com"
],
"ip_addresses": [
"12.26.16.10",
"ee80::ae56:2dff:fd89:7868"
],
"environment": "Production",
"data_center": "sfo",
"business_unit": "Operations",
"hardware_type": "Server",
"currently_in_maintenance": false,
"history": [
{
"id": 58,
"time_start_utc": "2013-01-27 00:40:00",
"time_end_utc": "2013-01-27 01:45:00",
"ticket_number": "CHG123456",
"reason": "January production maintenance",
"links": [
{
"rel": "self",
"link": "https://localhost/api/v1/maintenances/58"
}
]
},
{
"id": 104,
"time_start_utc": "2013-02-25 14:36:00",
"time_end_utc": "2013-02-25 18:36:00",
"ticket_number": "CHG456789",
"reason": "February production maintenance",
"links": [
{
"rel": "self",
"link": "https://localhost/api/v1/maintenances/104"
}
]
},
{
"id": 143,
"time_start_utc": "2013-03-17 00:30:00",
"time_end_utc": "2013-03-17 01:55:00",
"ticket_number": "CHG789123",
"reason": "March production maintenance",
"links": [
{
"rel": "self",
"link": "https://localhost/api/v1/maintenances/143"
}
]
}
]
}
この機能を使用するには、私はトップレベルのフィールドを引き出すことができます($mData
は、データ構造は上記であり、そして$sParams
は、ユーザによって要求されたフィールドの文字列です) :
private function removeFields($mData, $sParams){
$clone = $mData; // Clone the original data
$fields = explode(',', $sParams);
// Remove fields not requested by the user
foreach($mData as $key => $value){
if(!in_array((string)$key, $fields)){
unset($mData[$key]);
}
}
// If no fields remain, restore the original data
// Chances are the user made a typo in the fields list
if(count($mData) == 0){
$mData = $clone;
}
return $mData;
}
注:$sParams
は文字列としてで来て、使用者(彼らが見たいフィールドのカンマ区切りリスト)によって提供されるものです。
{
"hostnames": [
"webapp1-sfo",
"webapp1-sfo.example.com",
],
"history": [
{
"id": 58,
"time_start_utc": "2013-01-27 00:40:00",
"time_end_utc": "2013-01-27 01:45:00",
"ticket_number": "CHG123456",
"reason": "January production maintenance",
"links": [
{
"rel": "self",
"link": "https://localhost/api/v1/maintenances/58"
}
]
},
{
"id": 104,
"time_start_utc": "2013-02-25 14:36:00",
"time_end_utc": "2013-02-25 18:36:00",
"ticket_number": "CHG456789",
"reason": "February production maintenance",
"links": [
{
"rel": "self",
"link": "https://localhost/api/v1/maintenances/104"
}
]
},
{
"id": 143,
"time_start_utc": "2013-03-17 00:30:00",
"time_end_utc": "2013-03-17 01:55:00",
"ticket_number": "CHG789123",
"reason": "March production maintenance",
"links": [
{
"rel": "self",
"link": "https://localhost/api/v1/maintenances/143"
}
]
}
]
}
をしかし、私はhistory
から多分ちょうどticket_number
フィールドを返すようにしたい場合、私は、ユーザーが?fields=history.ticket_number
を行うことができるようにしたいか、彼らはチケット番号とリンクしたい場合、彼らは可能性:
ので?fields=hostnames,history
を返します返すことになる... ?fields=history.ticket_number,history.links.link
:これを行う
{
"history": [
{
"ticket_number": "CHG123456",
"links": [
{
"link": "https://localhost/api/v1/maintenances/58"
}
]
},
{
"ticket_number": "CHG456789",
"links": [
{
"link": "https://localhost/api/v1/maintenances/104"
}
]
},
{
"ticket_number": "CHG789123",
"links": [
{
"link": "https://localhost/api/v1/maintenances/143"
}
]
}
]
}
私は、スタックオーバーフローからのドット表記のための多くの異なるアレイアクセス方法を試してみたが、それらはすべてブレーク時に012の値は数値配列なので...例えば、私が今までオンラインで見つけたメソッドを使って、上の同じ出力を達成するためにこれを行う必要があります(明らかに良くない...特に数百レコードの)。
?fields=history.0.ticket_number,history.0.links.0.link,history.1.ticket_number,history.1.links.0.link,history.2.ticket_number,history.2.links.0.link,
私はまた、各APIエンドポイントは、例えば(異なるデータ構造を返すような動的および再帰的だった何かを探していた、コレクションが要求されたときには、連想arrays..orで満たされた数値配列を返します。 jsonの話では、オブジェクトの配列...それらのオブジェクトのいくつかは、配列(数値または連想)を持つかもしれません)。
ありがとうございます。
P.S. - コードが要求されたデータを含む新しいデータ配列を作成するか、(removeFields()関数と同じように)元のデータを直接操作するかどうかは気にしません。
更新:PHPFiddleを作成しました。これは、うまくいけば、今まで実行していた問題を示すはずです。 http://phpfiddle.org/main/code/tw1i-qu7s
明確にするには、ドット区切りレベルのある場合とそうでないGETリクエストを解析するPHPが必要です。 – amflare
はい、正しいです。ユーザはGETを介してオプションの 'fields'パラメータを提供することができ、PHPでサーバ側で処理されます。それが提供されている場合、最下位レベルのフィールド( '?fields = hostnames、data_center、history')またはドットで区切られた値のリストをコンマで区切ったリストを含むことができます。 id、history.ticket_number')または両方( '?fields = hostnames、data_centers、history.ticket_number')を指定します。基本的に、ユーザーは使用可能な配列キーの任意の組み合わせを提供することができ、各キーはコンマで区切られています。その後、配列とプロセスに分解します。 – Brad