PEARのライブラリに、MIMEのマルチパートメールをデコードするMail_MimeDecodeがあるので、これを流用することにする。
マルチパートレスポンスと言っても、メールのマルチパートと構造はほぼ一緒で、バウンダリを含むContent-typeがレスポンスヘッダにあるので、ヘッダのContent-typeとレスポンスボディをくっつけて、Mail_mimeDecode::decodeに渡してやればいいわけだ。PEAR の HTTP_Client で取れば、HTTP_Client::currentResponse の返値に ['headers']['content-type'] があるので、これをそのまま使える。
というわけで、こんな関数を用意して
require_once("Mail/mime.php");HTTP_Clientで取ってきたデータをくべてやる。
function decode_multipart_httpresp($contenttype, $body)
{
$data['include_bodies'] = true;
$data['input'] = "Content-type: ".$contenttype."\r\n\r\n".$body;
$res = Mail_mimeDecode::decode($data);
$ret = array();
foreach( $res->parts as $i => $obj){
$ret[ $obj->d_parameters['name'] ] = $obj->body;
}
return $ret;
}
require_once("HTTP/Client.php");HTTPサーバが返却したマルチパートレスポンスがこんな感じだったとすると
$client = new HTTP_Client();
$rcode = $client->get('http://usouso.hogehoge/xxx/');
$resp = $client->currentResponse();
$ret = decode_multipart_httpresp($resp['headers']['content-type'], $resp['body']);
var_dump($ret);
HTTP/1.1 200 OKデコードしたらこうなる。
Date: Fri, 13 Feb 2011 06:51:44 GMT
Content-Type: multipart/mixed; boundary=HoNgErAbOuNdArY
Connection: close
--HoNgErAbOuNdArY
Content-Disposition: form-data; name="param01"
Content-Type: text/html; charset=utf-8
HTMLデータ....
--HoNgErAbOuNdArY
Content-Disposition: form-data; name="param02"
Content-Type: image/jpeg
JPEGデータ...
--HoNgErAbOuNdArY
Content-Disposition: form-data; name="param03"
Content-Type: application/json; charset=utf-8
{
"JSON":"データ"
}
--HoNgErAbOuNdArY--
Arrayただ、細かいところは、状況に応じて変える必要はある。マルチパートじゃないレスポンスが来たときとか、マルチパートの中身を更にデコードするとか、パート毎のcontenttypeを取るとか。
(
[param01] => HTMLデータ....
[param02] => JPEGデータ...
[param03] => {
"JSON":"データ"
}
)
▼レンタルサーバー・VPS比較表を見る▼