页面加载后更新用PHP完成的Web服务调用的最佳方法

时间:2019-06-20 04:05:18

标签: javascript php rest api

我有一个网页,该网页使用PHP进行REST API调用,并返回该页面稍后使用的JSON数组。该php旨在在加载时运行(是的,我了解php是在服务器端运行的),但是它会在加载页面后自动执行API默认请求。

我有一个输入组,该输入组用于更改API请求的查询参数,该参数反过来会更新稍后要操作的数组。

我认为即时更新查询参数是一件很平常的事情-但在我的情况下,我认为可以做到的唯一方法是调用php以新参数来完成。

这会带来2个问题: 1 如果我将API调用php代码放在一个函数中,并尝试使用一些ajax来调用它,它将不会在上执行默认查询加载。 2 如果api调用不在函数中,则在更新输入组中的参数后,我不知道如何再次调用它。

API调用:

    <?php

    $include = '';
    $exclude = '';

    $url = "https://api.twitter.com/1.1/tweets/search/30day/dev30.json";
        $requestMethod = "GET";
        if (isset($_GET['topic']))  {$user = preg_replace("/[^A-Za-z0-9_]/", '', $_GET['topic']);}  else {$user  = "@avaya";}
        //if (isset($_GET['count']) && is_numeric($_GET['count'])) {$count = $_GET['count'];} else {$count = 6;}


        $getfield = "?query=$user+$include+$exclude";


        $twitter = new TwitterAPIExchange($settings);
        $string = json_decode($twitter->setGetfield($getfield)
        ->buildOauth($url, $requestMethod)
        ->performRequest(),$assoc = TRUE);
        if(array_key_exists("errors", $string)) {echo "<h3>Sorry, there was a problem.</h3><p>Twitter returned the following error message:</p><p><em>".$string[errors][0]["message"]."</em></p>";exit();}


        $id_array = array();

        //Foreach loop to create divs

        foreach ($string['results'] as $tweets)
        {


          $id_array[] = $tweets['id_str'];


        }
    ?>

$id_array稍后在javascript中使用,因为它设置为         var jsarray = <?php echo json_encode($id_array); ?>;

我的输入组获取新参数的代码:

                    <div class="input-group">
                <div class="input-group-prepend"><span class="input-group-text">Exclude</span></div><input id="input-exclude" class="form-control" type="text">
                <div class="input-group-append"><button onclick="getExclude()" class="btn btn-primary" type="button">Go</button></div>
                <script>
                function getExclude()
                {
                  var toExclude = document.getElementById('input-exclude').value;
                  console.log("getExclude() has been called");
                  console.log("You requested to exclude: " + toExclude);

                  excludeString = excludeString + "&"

                  //excluded =
                }

                <?php
                  if(isset($_COOKIE['include']))
                  {
                    $include = $_COOKIE['include'];
                  }
                ?>

                </script>
            </div>

这仅用于问题的包含部分-exclude是相同的,在API方面只是不同,所以我省略了它。

在这一点上,我想用$include的更新值重新运行php位。如前所述-我尝试将所有php代码放入一个函数中,如下所示:

                           function callTwitter(){
        $url = "https://api.twitter.com/1.1/tweets/search/30day/dev30.json";
        $requestMethod = "GET";
        if (isset($_GET['topic']))  {$user = preg_replace("/[^A-Za-z0-9_]/", '', $_GET['topic']);}  else {$user  = "@avaya";}
        //if (isset($_GET['count']) && is_numeric($_GET['count'])) {$count = $_GET['count'];} else {$count = 6;}


        $getfield = "?query=$user+$include+$exclude";


        $twitter = new TwitterAPIExchange($settings);
        $string = json_decode($twitter->setGetfield($getfield)
        ->buildOauth($url, $requestMethod)
        ->performRequest(),$assoc = TRUE);
        if(array_key_exists("errors", $string)) {echo "<h3>Sorry, there was a problem.</h3><p>Twitter returned the following error message:</p><p><em>".$string[errors][0]["message"]."</em></p>";exit();}


        $id_array = array();


        foreach ($string['results'] as $tweets)
        {


          $id_array[] = $tweets['id_str'];


        }

      }

callTwitter中的代码与前面显示的相同。

为使我的问题尽可能简单,我将其分为几部分:

是否存在一种通用的解决方案,可以即时从Javascript更新php / api查询参数?

当我从Javascript调用callTwitter()时为什么不做任何事情,以及如何使默认的API调用在页面上的所有其他内容加载之前发生,就像我放置它之前所做的那样在定义的函数中?

我不确定是否有帮助,但是我正在使用Github中的文件来处理API的Oauth部分。该php文件只需与进行API调用的脚本位于同一文件夹中即可。

https://github.com/J7mbo/twitter-api-php/blob/master/TwitterAPIExchange.php

更新了callTwitter()函数,并包括了我使用API​​响应的js函数。

更新了callTwitter()

                function callTwitter(){
        $url = "https://api.twitter.com/1.1/tweets/search/30day/dev30.json";
        $requestMethod = "GET";
        if (isset($_GET['topic']))  {$user = preg_replace("/[^A-Za-z0-9_]/", '', $_GET['topic']);}  else {$user  = "beer+-wine";}
        //if (isset($_GET['count']) && is_numeric($_GET['count'])) {$count = $_GET['count'];} else {$count = 6;}


        $getfield = "?query=(beer+wine)";


        $twitter = new TwitterAPIExchange($settings);
        $string = json_decode($twitter->setGetfield($getfield)
        ->buildOauth($url, $requestMethod)
        ->performRequest(),$assoc = TRUE);
        if(array_key_exists("errors", $string)) {echo "<h3>Sorry, there was a problem.</h3><p>Twitter returned the following error message:</p><p><em>".$string[errors][0]["message"]."</em></p>";exit();}


        $id_array = array();

        //Foreach loop to create divs

        foreach ($string['results'] as $tweets)
        {


          $id_array[] = $tweets['id_str'];

        }

        return json_encode($id_array);
      }


      $ids = callTwitter();

开始使用最初存储在$id_array中的Twitter API响应的Javascript:

    var jsarray = <?php echo $ids ?>;

          function embedTweets()
          {
            console.log("the embed tweets function has been called.")


            jsarray.forEach(function(id, i)
            {
              twttr.widgets.createTweet(
                id, document.getElementById('mycontainer'),
                {
                  conversation : 'none',    // or all
                  cards        : 'hidden',  // or visible
                  linkColor    : '#' + background_color, // default is blue
                  theme        : 'light',    // or dark
                  align        : 'center'
                }
              ).then(function(el)
              {
                readId(el);
                console.log(el);
              });
            });

此实现当前不起作用。看来callTwitter仍然没有被调用。

0 个答案:

没有答案