【问题标题】:PHP looping on cURL API callcURL API调用上的PHP循环
【发布时间】:2016-02-05 01:59:15
【问题描述】:

我是新手程序员,这是我第一次使用 PHP 和 cURL。我正在进行一个 API 调用,我已经为其设置了一个 cURL 请求,该请求让我返回一个 JSON 对象。

我现在要做的是将 cURL 调用设置为循环遍历包含多个 $payer_id 的 $payers 数组,我想一次对其进行制作和单独请求,打印出 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>';
  }
?>

【问题讨论】:

  • 这里有错误$payer_id = echo "$payer";
  • 没有必要做echo "$payer"$payer 就足够了。此外,您可以使用compact('api_key', 'payer_id', ...),而不是分配相同名称的键/值对。您应该确保为 API 请求设置正确的上下文(无论是 POST、GET、PUT[、DELETE、..])。
  • 谢谢你们...... @RamRaider 我按照您在下面帖子中的建议做了,现在它确实访问了数组,但它只返回第一个 $payer_id 的第一个 JSON。还有什么可以让它循环到数组中的下一个 payer_id 吗?还是您认为它是由于它是一个大型 JSON 对象而受到限制?

标签: php arrays json curl


【解决方案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":[]}
)

【讨论】:

  • 谢谢@RamRaider 我按照你在下面帖子中的建议做了,现在它确实访问了数组,但它只返回第一个 $payer_id 的第一个 JSON。还有什么可以让它循环到数组中的下一个 payer_id 吗?还是您认为它是由于它是一个大型 JSON 对象而受到限制? ......实际上我只是检查了API,它正在处理两个调用,但只有第一个被打印出来。你认为这可以如何打印出两个 JSON 对象?
【解决方案2】:
$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);

【讨论】:

  • 谢谢@Raz0rwire 我按照你在下面帖子中的建议做了,现在它确实访问了数组,但它只返回第一个 $payer_id 的第一个 JSON。还有什么可以让它循环到数组中的下一个 payer_id 吗?还是您认为它是由于它是一个大型 JSON 对象而受到限制?
【解决方案3】:

这是错误的:

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

echo 是一种语言结构。它不是函数,也没有返回值。它只是执行输出。代码运行如此有效

$payer_id = null;

试试

$payer_id = $payer;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多