我正在测试embed.ly,并使用连接的逗号分隔的链接字符串通过一个请求来请求多个链接的详细信息。
类似于:
http://api.embed.ly/1/oembed?key=_key_&urls=url1,url2,url3
结果包括一些关于链接的细节,如描述、标题、缩略图等。
有时没有url字段。在大多数情况下都有一个。这个字段包含url,据我所知,它与请求字符串中的url相同。
我使用这个url字段就像一个外键,我需要清楚地识别结果。
这是我用来从embed.ly加载json数据的函数。我只是在一个数组上循环,该数组包含在另一个函数中提取的一些url,并将它们内爆()为查询字符串。
收到json后,我会检查是否有错误,如果有错误,我会将链接bbcode从富html恢复到基本的链接标记。
但是,如果没有发送回数据中使用的url,我应该如何识别数据所属的链接?
private function getOPGdata(){
$linklist = array();
foreach ( $this->_extractions['ogp'] as &$v ) {
$linklist[] = urlencode( $v );
}
$apicall = $this->_embedkey . implode( ',', $linklist );
$data = $this->file_get_contents_curl( $apicall );
$data = json_decode( $data, true );
// we replace ogp tagged links if we don't get results
// and reverse them to normal links
$replace = array();
$replaceWith = array();
unset( $apicall );
unset( $linklist );
unset( $this->_extractions['ogp'] );
foreach ($data as &$v) {
// check for errors
if( isset( $v['error_code'] ) ){
$replace[] = '[ogp]'.$v['url'].'[ogp]';
$replaceWith[] = '[url]'.$v['url'].'[url]';
}
else {
$r = array(
'provider_url' => $v['provider_url'],
'provider_name' => $v['provider_name'],
'title' => $v['title'],
'description' => $v['description'],
'thumbnail_url' => $v['thumbnail_url'],
'html' => $v['html'],
'type' => $v['type']
);
$this->setOPGdata( $v['url'], $r );
}
}
// finally remove links with no results
$this->_text = str_replace( $replace, $replaceWith, $this->_text );
return true;
}
在embedly.js中,他们这样做是为了跟踪结果:
// Put everything into batches, even if these is only one.
var batches = batch(valid_urls, options.batch), self = this;
// Actually make those calls.
$.each(batches, function(i, batch){
$.ajax({
url: self.build(method, batch, options),
dataType: 'jsonp',
success: function(data){
// We zip together the urls and the data so we have the original_url
$.each(zip([batch, data]), function(i, obj){
var result = obj[1];
result.original_url = obj[0];
result.invalid = false;
keeper.notify(result);
});
}
});
});
这在PHP中意味着什么?
URL示例:
[1]=>
array(11) {
["provider_url"]=>
string(24) "http://stackoverflow.com"
["description"]=>
string(143) "I'm testing embed.ly and use a concatenated comma separated link string to request details for multiple links with one request. Something like:"
["title"]=>
string(79) "embed.ly Problems to identify results beauser somtimes the url field is missing"
["mean_alpha"]=>
float(191.25)
["thumbnail_width"]=>
int(316)
["url"]=>
string(123) "http://stackoverflow.com/questions/23095192/embed-ly-problems-to-identify-results-beauser-somtimes-the-url-field-is-missing"
["thumbnail_url"]=>
string(78) "http://cdn.sstatic.net/stackoverflow/img/apple-touch-icon@2.png?v=fde65a5a78c6"
["version"]=>
string(3) "1.0"
["provider_name"]=>
string(13) "Stackoverflow"
["type"]=>
string(4) "link"
["thumbnail_height"]=>
int(316)
}
[2]=>
array(11) {
["provider_url"]=>
string(15) "http://embed.ly"
["description"]=>
string(118) "Embedly allows developers to pull full article text for text analysis or building a read it later type applications..."
["title"]=>
string(27) "Artiicle Tutorial | Embedly"
["mean_alpha"]=>
float(32.7480314961)
["thumbnail_width"]=>
int(399)
["url"]=>
string(38) "http://embed.ly/docs/tutorials/article"
["thumbnail_url"]=>
string(58) "http://embed.ly/static/images/logos/logo_color.png?v=4b245"
["version"]=>
string(3) "1.0"
["provider_name"]=>
string(5) "Embed"
["type"]=>
string(4) "link"
["thumbnail_height"]=>
int(127)
}
}
还有一个没有网址的:
[0]=>
array(14) {
["provider_url"]=>
string(18) "https://vimeo.com/"
["description"]=>
string(316) "Writers' Block is a short film written and directed by Tom Gran and Martin Woolley and produced by WONKY Films with the support of IdeasTap. Set in a prison for criminally poor writers, it follows a gang of cons who get ahold of the script to their own lives and attempt to re-write it in order to make their escape."
["title"]=>
string(14) "Writers' Block"
["author_name"]=>
string(12) "WÖNKY Films"
["height"]=>
int(720)
["thumbnail_width"]=>
int(1280)
["width"]=>
int(1280)
["html"]=>
string(389) ""
["author_url"]=>
string(27) "http://vimeo.com/wonkyfilms"
["version"]=>
string(3) "1.0"
["provider_name"]=>
string(5) "Vimeo"
["thumbnail_url"]=>
string(46) "http://i.vimeocdn.com/video/468861310_1280.jpg"
["type"]=>
string(5) "video"
["thumbnail_height"]=>
int(720)
}
结果总是按照传入的顺序返回。您应该能够对请求URL执行for循环,并在响应数组中按索引匹配结果。您可以执行以下操作来制作请求URL到响应的映射。
$urls = array(
"http://www.google.com",
"http://www.yahoo.com"
);
$results = get_embedly_results($urls)
$resultMap = array();
for ($i = 0; $i < count($urls); ++$i) {
resultMap[$urls[$i]] = $results[$i];
}
这是未经测试的代码,我的PHP也很生疏,但它应该会给你一个大致的想法。