Я работал с API, и я обычно запускал задание cron и делал вызов API каждые 5 минут. Недавно они представили функцию, аналогичную IPP PayPal, которая публикует переменные, как только заказ получает ответ.
Я напечатал переменные поста и отправил их по почте, чтобы посмотреть, каков будет ответ. Это код, который я использовал.
$post_var = "Results: " . print_r($_POST, true);
mail('[email protected]', "Post Variables", $post_var);
и я получил это по почте.
Results: Array
(
[--------------------------918fc8da7040954f
Content-Disposition:_form-data;_name] => "ID"
1
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="TXN"
1234567890
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="Comment"
This is a test comment
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="ConnectID"
1
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="ConnectName"
Test Connect (nonexisting)
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="Status"
Unavailable
--------------------------918fc8da7040954f
Content-Disposition: form-data; name="CallbackURL"
http://www.example.com/ipn
--------------------------918fc8da7040954f--
)
Теперь мне нужны значения ID, т. Е. 1, TXN, т. Е. 1234567890 и т. Д., Я никогда не работал с такими массивами. Как мне поступить и какой ответ я получил на самом деле. Это ответ cUrl или ответ данных из нескольких частей?
Пожалуйста, объясните мне, если это возможно.
Несмотря на то, что этому вопросу 6 месяцев, я добавлю свой ответ здесь, поскольку у меня только что была именно эта проблема, и я не смог найти простой парсер в сети.
Если предположить, $response
содержит ваш составной контент:
// Match the boundary name by taking the first line with content
preg_match('/^(?<boundary>.+)$/m', $response, $matches);
// Explode the response using the previously match boundary
$parts = explode($matches['boundary'], $response);
// Create empty array to store our parsed values
$form_data = array();
foreach ($parts as $part)
{
// Now we need to parse the multi-part content. First match the 'name=' parameter,
// then skip the double new-lines, match the body and ignore the terminating new-line.
// Using 's' flag enables .'s to match new lines.
$matched = preg_match('/name="?(?<key>\w+).*?\n\n(?<value>.*?)\n$/s', $part, $matches);
// Did we get a match? Place it in our form values array
if ($matched)
{
$form_data[$matches['key']] = $matches['value'];
}
}
// Check the response...
print_r($form_data);
Я уверен, что у этого подхода есть много предостережений, поэтому ваш пробег может отличаться, но он удовлетворил мои потребности (анализ ответа фрагмента API BitBucket). Любые комментарии / предложения приветствуются.
Других решений пока нет …