我有点卡在这里。我试图通过JSONP和Ajax从PHP脚本获取JSON数据(来自Twitter API的推文)。类(TwitterProxy)没有问题,因为数据从PHP到达很好,我可以在使用Firefox的开发工具的响应中看到JSON但是成功方法没有加载。
Firefox(无法加载脚本)和Chrome(net :: ERR_SPDY_PROTOCOL_ERROR)也给我一个错误,除了错误函数在Chrome中给我一个404错误代码。有任何想法吗?
你可以在这里写nasa: http://diegovelserver.epizy.com/
Javascript
$(document).ready(function() {
$('.btn').click(function (){
showNSave();
});
$('.user').bind("enterKey", function (){
showNSave();
});
$('.user').keyup(function (e){
if(e.keyCode == 13) {
$(this).trigger("enterKey");
}
});
});
function showNSave () {
doRequest($('.user').val());
}
function doRequest (user){
$.ajax({
url: 'https://diegovelserver.000webhostapp.com/php/app.php',
type:'GET',
data: {data: user},
jsonp: "callback",
dataType: 'jsonp',
success: function(data){
alert("success");
$('.jsonpResult').html(data);
},
error: function (e) {
console.log(e.responseType);
console.log(e.status);
}
});
}
PHP
<?php
class TwitterProxy
{
private $config = [
'use_whitelist' => false, // Marcar false para permitir conexiones ajenas a Twitter
'base_url' => 'https://api.twitter.com/1.1/'
];
private $whitelist = [];
public function __construct($oauth_access_token, $oauth_access_token_secret, $consumer_key, $consumer_secret, $screen_name, $count = 5)
{
$this->config = array_merge($this->config, compact('oauth_access_token', 'oauth_access_token_secret', 'consumer_key', 'consumer_secret', 'user_id', 'screen_name', 'count'));
$this->whitelist['statuses/user_timeline.json?' . 'screen_name=' . $this->config['screen_name'] . '&count=' . $this->config['count']] = true;
}
private function buildBaseString($baseURI, $method, $params)
{
$r = [];
ksort($params);
foreach ($params as $key=>$value) {
$r[] = "$key=" . rawurlencode($value);
}
return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}
private function setOauthKeys(){
print_r($this->config);
}
private function buildAuthorizationHeader($oauth)
{
$r = 'Authorization: OAuth ';
$values = [];
foreach ($oauth as $key => $value) {
$values[] = "$key=\"" . rawurlencode($value) . "\"";
}
$r .= implode(', ', $values);
return $r;
}
public function get($url)
{
if (! isset($url)) {
die('No URL set');
}
if ($this->config['use_whitelist'] && ! isset($this->whitelist[$url])) {
die('URL is not authorised');
}
$url_parts = parse_url($url);
parse_str($url_parts['query'], $url_arguments);
$full_url = $this->config['base_url'] . $url;
$base_url = $this->config['base_url'] . $url_parts['path'];
$oauth = [
'oauth_consumer_key' => $this->config['consumer_key'],
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $this->config['oauth_access_token'],
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
];
$base_info = $this->buildBaseString($base_url, 'GET', array_merge($oauth, $url_arguments));
$composite_key = rawurlencode($this->config['consumer_secret']) . '&' . rawurlencode($this->config['oauth_access_token_secret']);
$oauth['oauth_signature'] = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$header = [
$this->buildAuthorizationHeader($oauth),
'Expect:'
];
$options = [
CURLOPT_HTTPHEADER => $header,
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $full_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
];
$feed = curl_init();
curl_setopt_array($feed, $options);
$result = curl_exec($feed);
$info = curl_getinfo($feed);
curl_close($feed);
if (isset($info['content_type']) && isset($info['size_download'])) {
header('Content-Type: ' . $info['content_type']);
header('Content-Length: ' . $info['size_download']);
}
return $result;
}
}
//----------------------------------------------------troubles begins here------
$user = $_GET['data'];
$twitterConexion = new TwitterProxy(
'913141342070542337-1eFZgaABcUpCIP8M4n95f2kSxdnWLtL',
'ElpTj4OvHMiNN8mlTOKplOp8RZR70ZC7cyUJqQymwumPP',
'HR9fwpQuYwqzIY7mh2ZNqM59F',
'CasF1JnHDGo9rjYlXKvUeUboeKovmzSGVEBNAYiD1JJRC4mSkb',
$user,
1);
$twitter_url = 'statuses/user_timeline.json';
$twitter_url .= '?screen_name=' . $user;
$twitter_url .= '&count=3';
$tweets = $twitterConexion->get( $twitter_url );
echo json_encode($tweets);
?>