2016-02-04 81 views
0

我是一个新手编码器,这是我第一次使用PHP和cURL。我正在进行一个API调用,为此我已经设置了一个cURL请求,让我返回一个JSON对象。PHP循环cURL API调用

我现在要做的是设置cURL调用来循环$ payers数组,这个$ payers数组包含多个$ payer_id,我希望一次创建和个别请求,打印出一个PRETTY_PRINT JSON对象并从$ payers数组中创建下一个$ payer_id的下一个请求。

这是我设置的代码,显然是为了安全目的info和api url是假的,但这是我现在使用的结构。就像我之前提到的那样,如果您删除了代码的foreach部分,并手动输入$ payer_id编号到我拥有的代码中,它将起作用并返回我想要的JSON对象...但我希望能够设置代码使用$ payers数组并为我打印出JSON对象。

任何帮助,指导将不胜感激。谢谢!

<?php 

    /* API url*/ 
    $url = 'https://testapi.com/cov/all.json'; 

    $payers = array("00002", "00112"); 

    /* Assign parameter values here */ 

    foreach ($payers as $payer) { 
    $api_key = '1111122222233333'; 
    $payer_id = echo "$payer"; 
    $provider_first_name = 'laura'; 
    $provider_last_name = 'brown'; 
    $provider_npi = '444445555'; 
    $member_first_name = 'billy'; 
    $member_last_name = 'bob'; 
    $dependent_ssn = '111-22-3333'; 
    $member_dob = '1988-11-11'; 

    /* $_GET Parameters to Send */ 
    $params = array( 

    'api_key'   => $api_key, 
    'payer_id'   => $payer_id, 
    'provider_first_name' => $provider_first_name, 
    'provider_last_name' => $provider_last_name, 
    'provider_npi'  => $provider_npi, 
    'member_first_name'   => $member_first_name, 
    'member_last_name'   => $member_last_name, 
    'dependent_ssn'     => $dependent_ssn, 
    'member_dob'     => $member_dob 
); 

    /* Update URL to container Query String of Paramaters */ 
    $url .= '?' . http_build_query($params); 
    /* cURL Resource */ 
    $ch = curl_init(); 
    /* Set URL */ 
    curl_setopt($ch, CURLOPT_URL, $url); 
    /* Tell cURL to return the output */ 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    /* Execute cURL, Return Data */ 
    $curl_response = curl_exec($ch); 
    curl_close($ch); 
    $decoded = json_decode($curl_response, true); 

    echo '<pre>'; 
    echo json_encode($decoded, JSON_PRETTY_PRINT); 
    echo '</pre>'; 
    } 
?> 
+0

这里有个错误'$ payer_id = echo“$ payer”; ' – RamRaider

+0

没有必要做'echo'$ payer“'。 '$ payer'就足够了。 此外,您可以使用'compact('api_key','payer_id',...)'而不是分配相同的名称键/值对。 您应该确保为API请求设置正确的上下文(无论是POST,GET,PUT [,DELETE,..])。 – Gearloose

+0

谢谢你们[email protected]我在你的帖子下面做了你的建议,现在它访问数组,但它只返回第一个$ payer_id的第一个JSON。还有什么可以让它循环到数组中的下一个payer_id?或者你认为它是一个很大的JSON对象是有限的吗? – DanB

回答

1

正如我在上面的评论中指出的那样,在声明变量$payer时出现了一个小错误 - 回声有问题。

此外,我认为你应该能够重复使用curl句柄为数组中的各种付款人 - 在循环外声明并在每次迭代中为参数指定新的url。

[download cacert.pem from curl.haxx.se]

<?php 

    /* API url*/ 
    $baseurl = 'https://testapi.com/cov/all.json'; 

    $payers = array("00002", "00112"); 
    $data=array(); 


    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    /* when ever I have to use curl to an ssl host I always include these options */ 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla-whatever-ua-string'); 
    curl_setopt($ch, CURLOPT_CAINFO, realpath('c:/wwwroot/cacert.pem')); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 


    /* Assign parameter values here */ 
    foreach($payers as $payer) { 
     $api_key = '1111122222233333'; 
     $payer_id = $payer; 
     $provider_first_name = 'laura'; 
     $provider_last_name = 'brown'; 
     $provider_npi = '444445555'; 
     $member_first_name = 'billy'; 
     $member_last_name = 'bob'; 
     $dependent_ssn = '111-22-3333'; 
     $member_dob = '1988-11-11'; 

     /* $_GET Parameters to Send */ 
     $params = array( 
      'api_key'    => $api_key, 
      'payer_id'    => $payer_id, 
      'provider_first_name' => $provider_first_name, 
      'provider_last_name' => $provider_last_name, 
      'provider_npi'   => $provider_npi, 
      'member_first_name'  => $member_first_name, 
      'member_last_name'  => $member_last_name, 
      'dependent_ssn'   => $dependent_ssn, 
      'member_dob'   => $member_dob 
     ); 

     /* Update URL to container Query String of Paramaters */ 
     $url = $baseurl . '?' . http_build_query($params); 

     curl_setopt($ch, CURLOPT_URL, $url); 
     $curl_response = curl_exec($ch); 

     $decoded = json_decode($curl_response, true); 

     /* store all responses for later consumption */ 
     $data[]=$curl_response; 
     /* for debug, show responses */ 
     echo '<pre>',json_encode($decoded, JSON_PRETTY_PRINT),'</pre>'; 
    } 

    curl_close($ch); 

    if(!empty($data)) print_r($data); 


?> 

/* output from print_r($data) */ 
Array 
(
    [0] => {"0":{"api_key":"1111122222233333","payer_id":"00002","provider_first_name":"laura","provider_last_name":"brown","provider_npi":"444445555","member_first_name":"billy","member_last_name":"bob","dependent_ssn":"111-22-3333","member_dob":"1988-11-11","section":"curlapi"},"errors":[],"info":[]} 
    [1] => {"0":{"api_key":"1111122222233333","payer_id":"00112","provider_first_name":"laura","provider_last_name":"brown","provider_npi":"444445555","member_first_name":"billy","member_last_name":"bob","dependent_ssn":"111-22-3333","member_dob":"1988-11-11","section":"curlapi"},"errors":[],"info":[]} 
) 
+0

谢谢@RamRaider我在你的帖子下面建议了你的建议,现在它可以访问数组,但它只返回第一个$ payer_id的第一个JSON。还有什么可以让它循环到数组中的下一个payer_id?或者你认为它是一个很大的JSON对象是有限的吗? ......其实我只是检查了API,它正在处理这两个调用,但只有第一个正在打印出来。您如何认为可以打印出两个JSON对象? – DanB

0
$url = 'https://testapi.com/cov/all.json'; 

其次

$url .= '?' . http_build_query($params); 
在foreach循环

,追加新的参数字符串每次,我这样做:

$base_url = 'https://testapi.com/cov/all.json'; 

其次

$url = $base_url . '?' . http_build_query($params); 
+0

谢谢@ Raz0rwire我在你的帖子下面做了你的建议,现在它访问数组,但它只返回第一个$ payer_id的第一个JSON。还有什么可以让它循环到数组中的下一个payer_id?或者你认为它是一个很大的JSON对象是有限的吗? – DanB

0

这是错误的:

$payer_id = echo "$payer"; 
      ^^^ 

echo是一个语言结构。它不是一个函数,并且没有返回值。它只是执行输出。因此,有效的代码运行的

$payer_id = null; 

尝试

$payer_id = $payer; 

代替。请注意缺少"。如果您只是试图将值从一个变量复制到另一个变量而没有任何更改,那么它们是完全不必要的。