我有一个网页,该网页使用PHP进行REST API调用,并返回该页面稍后使用的JSON数组。该php旨在在加载时运行(是的,我了解php是在服务器端运行的),但是它会在加载页面后自动执行API默认请求。
我有一个输入组,该输入组用于更改API请求的查询参数,该参数反过来会更新稍后要操作的数组。
我认为即时更新查询参数是一件很平常的事情-但在我的情况下,我认为可以做到的唯一方法是调用php以新参数来完成。
这会带来2个问题: 1 如果我将API调用php代码放在一个函数中,并尝试使用一些ajax来调用它,它将不会在上执行默认查询加载。 2 如果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
仍然没有被调用。