我的API有兩種可能的響應。我需要從收到的文本響應中獲取數據,並需要將它們存儲爲變量。如何從PHP中的兩個可能的API文本響應的一個響應中獲取數據?
API呼叫:
$url="http://91.101.61.111:99/SendRequest/?mobile=9999999999&id=11011&reqref=501";
$request_timeout = 60;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $request_timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $request_timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$curl_error = curl_errno($ch);
curl_close($ch);
以純文本可能API響應:
REQUEST ACCEPTED your ref=<myref> system_reference=<sysref>
Or,
REQUEST ERROR errorno=<error>;your ref=<myref>;system_reason=<sysreason>
在第一個可能的響應的情況下,我需要抓住像下面的數據:
$status = "REQUEST ACCEPTED";
$myref = "501";
$sysref = "BA01562";
而在第二種可能的情況下,我需要抓取如下數據:
$status = "REQUEST ERROR";
$error = "25";
$myref = "501";
$sysreason = "Duplicate request";
我曾嘗試:
$response = preg_match('/([\w\s]+) ([\w]+)/', $output, $res);
$rstatus = $res[1];
if ($rstatus == "REQUEST ACCEPTED")
{
$raccepted = preg_match('/([\w\s]+) your ref=([\d]+) system_reference=([\w]+)/', $output, $matches);
$status = $matches[1];
$myref = $matches[2];
$sysref = $matches[3];
}
elseif ($rstatus == "REQUEST ERROR")
{
$rerror = preg_match('/([\w\s]+) errorno=([\d]+);your ref=([\d]+);system_reason=([\w\s]+)/', $output, $matches);
$status = $matches[1];
$error = $matches[2];
$myref = $matches[3];
$sysreason = $matches[4];
}
echo "Status is $status, My Ref ID is $myref";
現在,當我從API調用第一次可能的反應,我總是在最後一行中的錯誤(回聲......),如下圖所示:
(! )注意:未定義的變量:狀態
()!注意:未定義的變量:myref
狀態是,我的參考編號是
但是,沒有問題,當我收到的第2個反應。它顯示了,因爲我想:
狀態是請求錯誤,我的參考編號是501
請幫幫忙!
爲什麼不讓API響應變成更好的格式,比如json?即使XML會更好。似乎很奇怪有一個需要手動解析的自定義響應。 –
'$ rStatus' ='請求接受你的',所以它不匹配。我同意Magnus Eriksson的觀點,從您的API中創建更加健全的響應。 – aynber
...更糟糕......您實際上有兩種不同的格式和自定義格式,具體取決於請求是否被接受。 –