【问题标题】:Writing json data into file using curl使用 curl 将 json 数据写入文件
【发布时间】:2017-04-15 16:24:16
【问题描述】:

我正在尝试将 url 中的 json 数据存储到一个文件中。我收到错误

“无法将 JSON 保存到“result.txt”。” 我已经写了以下代码,请帮助我

<?php

$outfile= 'result.txt';

$url='http://192.178.1.5:8888/GetUsers';

$rCURL = curl_init();

curl_setopt($rCURL, CURLOPT_URL, $url);
curl_setopt($rCURL, CURLOPT_HEADER, 0);
curl_setopt($rCURL, CURLOPT_RETURNTRANSFER, 1);

$aData = curl_exec($rCURL);

curl_close($rCURL);

$result = json_decode ( $aData );
if($result) { 
    if(file_put_contents($outfile, $result, FILE_APPEND)) {
      echo "Saved JSON fetched from “{$url}” as “{$outfile}”.";
    }
    else {
      echo "Unable to save JSON to “{$outfile}”.";
    }
}
else {
   echo "Unable to fetch JSON from “{$url}”.";
}


?>

【问题讨论】:

  • 文件是否可写?给它 chmod perm 755 我认为
  • 检查您的 php 错误日志以跟踪错误。
  • 您正在将一个对象传递给file_put_contents。这是不允许的。它不会引发任何错误,但函数会返回 false。请参阅我的答案以获取更多详细信息...

标签: php json file curl


【解决方案1】:

在没有json_decode 的情况下保存数据。虽然http://php.net/manual/en/function.file-put-contents.php 说数据可以是数组,但它让我使用数组时出错,而是将数据保存为字符串。

【讨论】:

  • 在没有 json_decode 的情况下保存数据显示“从“192.178.1.5:8888/GetUsers”获取的保存的 JSON 作为“result.txt”。但在 result.txt 文件中,我得到 {“Error”:“Method not allowed”} 为什么会这样??
  • 这就是您的 curl 响应返回的结果。你的文件工作正常,现在你必须确保你的 curl 调用是正确的。
  • curl_setopt($rCURL, CURLOPT_HTTPHEADER, [ 'Accept: application/json', 'Content-Type: application/json']); 尝试在CURLOPT_HEADER之后设置此选项
  • 我试过了,但在输出文件中仍然得到同样的东西。
  • 您的网址是否正常工作?尝试直接从浏览器浏览 url 并调试。我认为问题出在网址上。
【解决方案2】:

试试这个,使用 file_get_contents。它将写入文件以获取现有内容

$result = json_decode ( $aData );
$current = file_get_contents($outfile);
if($result) { 
    if(file_put_contents($outfile, $result)) {
      echo "Saved JSON fetched from {$url} as {$outfile}.";
    }
    else {
      echo "Unable to save JSON to {$outfile}.";
    }
}
else {
   echo "Unable to fetch JSON from {$url}.";
}

【讨论】:

  • 在我的情况下不起作用。显示无法将 JSON 保存到“result.txt”。
【解决方案3】:

根据您的代码,您必须检查您的文件是否可写:

if (!is_writable($outfile)) {
    throw new \RuntimeException("$outfile is not writable.");
}

你应该把这段代码放在file_put_contents之前。

【讨论】:

    【解决方案4】:

    我发现您的代码存在一些重大问题:

    $result = json_decode ( $aData );
    

    假设$aData 包含一个有效的JSON 对象$result 将是一个对象

    您不能将 对象 传递给 file_put_contents,因为此函数只接受字符串(或一维数组)。

    如果您尝试这样做,该函数将返回 false

    假设您使用 curl 调用检索 JSON 数据,我看不出将其解码为对象的意义。只需将 curl $aData 中的字符串写入文件即可。

    当然,除非您必须进行一些数据操作。

    在这种情况下会破坏数据,但最后,您必须在写入文件之前生成一个字符串。


    假设您解决了上述问题,让$result 成为一个字符串。

    你有:

    if( file_put_contents( $outfile, $result, FILE_APPEND ) )
    

    由于函数返回写入的字节数并假设$result 可能是一个空字符串,所以if 子句应重写为...

    if( file_put_contents( $outfile, $result, FILE_APPEND ) !== false )
    

    ...如果您将空字符串写入文件,则进入“操作成功”代码块。


    最后一点,当然,文件必须是可写的。


    编辑

    我在 cmets 中读到 curl 的响应是

    { "Error": "Method not allowed" }
    

    这是因为您没有按照目标服务器的预期执行 curl 调用。

    Method not allowed 表示,例如,您正在发出 GET 请求,而服务器期望该端点收到 POST

    【讨论】:

      猜你喜欢
      • 2018-05-26
      • 1970-01-01
      • 2021-08-22
      • 2015-12-09
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多