在后台编写(Linux wget)到来自Web服务的数据库JSON响应

时间:2018-03-17 09:12:24

标签: php jquery json ajax wget

我有一个大问题。我在jQuery中编写了脚本,它通过构建JSON来获取来自webservice的数据,并通过响应将web服务发送回JSON中。 代码看起来像这样:

function Product(date_from,date_to,API_KEY) {
var self = this;
self.productURI = 'https://api.xxxxxxxxxxxxxxxxxxx/DailySales?FromDate='+date_from+' 00:01  :00&ToDate='+date_to+' 00:01:00';
self.products = new Array();
self.productsDiv = "#products";

self.getAllProducts = function () {
   var req = self.pobierz_dane_ajax(self.productURI, "GET");
    req.done(function (data) {
        self.products = data;
        var dataString = JSON.stringify(data);

        $.ajax({
            type: 'POST',
            url: 'write_transactions.php',
            data: { 
                save_transaction: dataString,
                date_from: date_from
            }
        });
    });
}

self.pobierz_dane_ajax = function (uri, method, data) {
    var request = {
        url: uri,
        type: method,
        contentType: "application/json",
        accepts: "application/json",
        dataType: 'json',
        data: JSON.stringify(data),
        crossDomain: true,
        beforeSend: function (xhr) {
            xhr.setRequestHeader("Authorization", "Basic " + API_KEY);
        }
    };
    return $.ajax(request);
}

}

我这样称呼我的功能:

<script type="text/javascript">
var product = new Product('<?php echo $date_from; ?>','<?php echo $date_to; ?>','<?PHP echo $DE_API; ?>');
product.getAllProducts();

在PHP脚本中,我用PHP解析JSON并将其写入数据库。

当我通过网页(Chrome,Firefox)调用整个过程时,一切正常。当我在Linux中的crontab中调用它时,问题就出现了:

wget -O - &#39; https ............&#39; 但它只是不起作用。 我需要在后台启动这个脚本,所以我需要更好的解决方案......

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那么

  • 通过浏览器调用网页
  • 网页从JS(ajax)
  • 的外部api获取数据
  • 您解析响应并将其按POST发送到其他PHP脚本(将数据保存到数据库)

现在你用cget从cron调用网页但它不起作用

原因是,wget只是获取页面并显示HTML响应,但不运行JS脚本!

您可以使用phantomjs而不是wget。它基本上充当无头浏览器,例如可以从cron调用

另一种可能的解决方案是重写一些代码并直接在php脚本中执行所有操作

  • PHP脚本从API
  • 获取数据
  • 相同脚本将数据保存到数据库
  • cronjob regulary用wget
  • 调用php脚本

编辑 - 建议php api调用的解决方案

<?php
    $options = array(
        'http' => array(
            'method' => 'GET',
            'header' => array(
                'Authorization: Basic ' . $API_KEY,
                'Content-type: application/json'
            )
         )
    );
    $context = stream_context_create($options);
    $response = file_get_contents($API_URL, false, $context);

    //work with response / save to db      

答案 1 :(得分:0)

Helll是啊!这很容易:D

我正在为其他人发布我的解决方案:D

$remote_url = 'https://api.xxxxxxxxxxxxxx';

// Create a stream
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header' => "Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 )
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents($remote_url, false, $context);

print($file);