将标头传递给file_get_contents()以获取json请求

时间:2013-03-19 11:44:55

标签: php json http-headers httpwebrequest file-get-contents

我需要将这些标头传递到$context变量中,我尝试将值放入数组然后将其传递到stream_context_create()函数,但我从file_getcontents获取http警告功能

$prod_id = 4322;
$tnxRef = "RT45635276GHF76783AC";
$mackey =  "ADECNH576748GH638NHJ7393MKDSFE73903673";
$agent = $_SERVER['HTTP_USER_AGENT'];
$hash = hash('SHA512', $prod_id.$txnRef.$mackey);

$headers = array(
    'http'=>(
        'method'=>'GET',
        'header'=>'Content: type=application/json \r\n'.
            '$agent \r\n'.
            '$hash'
        )
    )
stream_context_create($headers)

$url_returns = file_get_contents("https://test_server.com/test_paydirect/api/v1/gettransaction.json?productid=$prod_id&transactionreference=$txnRef&amount=$amount", false, $context);  

$json = json_decode($url_returns, true);

错误:

  

[function.file-get-contents]:无法打开流:HTTP请求失败! HTTP / 1.1 400错误请求`

这就是我得到的错误,有人可以帮助一个明确的例子。

1 个答案:

答案 0 :(得分:2)

您的代码中有多处错误。

服务器返回400 Bad Request,因为您的代码会导致此错误的HTTP请求:

GET /test_paydirect/api/v1/gettransaction.json?productid=4322&transactionreference=RT45635276GHF76783AC&amount= HTTP/1.1
Host: test_server.com
Content: type=application/json
$agent
$hash

错误是:

  1. 不会在单引号
  2. 中评估变量表达式 您的代码示例中未设置
  3. $amount
  4. 标题为Content-Type:,而非Content: type=
  5. 所有标头(代理,哈希)必须具有相应的名称
  6. 以下是应该工作的示例:

    $context = stream_context_create(array(
      'http' => array(
        'method' => 'GET',
        'agent'  => $agent,
        'header' => "Content-Type: type=application/json\r\n"
            . "X-Api-Signature: $hash"
        )
      )
    );
    

    请注意: X-Api-Signature只是一个示例 - 它取决于您使用的API如何命名API密钥标头以及如何计算哈希值。您应该在API的文档中找到此信息!