2017-09-14 78 views
0

我的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

請幫幫忙!

+2

爲什麼不讓API響應變成更好的格式,比如json?即使XML會更好。似乎很奇怪有一個需要手動解析的自定義響應。 –

+0

'$ rStatus' ='請求接受你的',所以它不匹配。我同意Magnus Eriksson的觀點,從您的API中創建更加健全的響應。 – aynber

+0

...更糟糕......您實際上有兩種不同的格式和自定義格式,具體取決於請求是否被接受。 –

回答

3

這不是最有效的方法,嘗試使用一些適當的格式,如JSON什麼的。總之,這裏是一個解決方案:

$success = stristr($output, "REQUEST ACCEPTED"); 

if($success) 
{ 
    $data = stristr($output, "ref"); 
    $raccepted = preg_match('/ref=([\d]+) system_reference=([\w]+)/', $data, $matches); 
    var_dump($matches); 
} 
else 
{ 
    $data = stristr($output, "errorno"); 
    $rerror = preg_match('/errorno=([\d]+);your ref=([\d]+);system_reason=([\w\s]+)/', $data, $matches); 
    var_dump($matches); 
} 
+0

謝謝,但preg_match比strstr更快 – tsv

+1

@tsv不是說這不是真的,但是你有沒有適合這種情況的聲明的任何參考? –

+1

@tsv這可能是,但檢查此https://stackoverflow.com/a/6433513/2394254 – mega6382

0

你應該改變你的正則表達式

$response = preg_match('/([\w\s]+) ([\w]+)/', $output, $res); 

$response = preg_match('/\w+ \w+/is', $output, $res); 

測試:

php > preg_match('/\w+ \w+/is', "REQUEST ACCEPTED your ref=some system_reference=some123", $res); 
php > var_dump($res); 
php shell code:1: 
array(1) { 
    [0] => 
    string(16) "REQUEST ACCEPTED" 
} 
php > preg_match('/\w+ \w+/is', "REQUEST ERROR errorno=123;your ref=SOMEref;system_reason=reason", $res); 
php > var_dump($res); 
php shell code:1: 
array(1) { 
    [0] => 
    string(13) "REQUEST ERROR" 
} 

其他建議:

  1. 在使用^和$(正常部分的開始和結束)測試正常之前修改您的響應。
  2. 使用===代替==在這種情況下
  3. 檢查存在$ res [1];在$ rstatus = $ res [1]之前;
相關問題