2017-09-14 14 views
0

私のAPIには2つの可能な回答があります。私は受信したテキスト応答からデータを取得する必要があり、変数としてそれらを格納する必要があります。PHPで可能な2つのAPIテキスト応答から1つの応答からデータを取得する方法は?

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"; 

2番目に可能な回答の場合、私は以下のようなデータを取得する必要があります:

$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
ステータスがあり、私は第二の応答を受信したときに、私のRef IDは

でも問題なくです。私が望むように、それは示しています

状況は私のRef IDが501

で、リクエストエラーです助けてください!

+2

jsonのように、APIレスポンスをいくつかのより良いフォーマットにしてみませんか? XMLでも良いでしょう。そのような手動の解析が必要なカスタムレスポンスを持つのは不思議です。 –

+0

'$ rStatus' = 'あなたの要求を受け入れました'ので一致しません。私はMagnus Erikssonに同意し、あなたのAPIからのより穏やかな応答を作成します。 – aynber

+0

...さらに悪い...実際には、リクエストが受け入れられたかどうかに応じて_two different_、custom、formatsがあります。 –

答えて

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]の前に。
関連する問題