0

我正在测试 embed.ly 并使用连接的逗号分隔链接字符串通过一个请求请求多个链接的详细信息。

就像是:

http://api.embed.ly/1/oembed?key=_key_&urls=url1,url2,url3

结果包括有关链接的一些详细信息,例如描述、标题、缩略图等。

有时没有 url 字段。在大多数情况下,有一个。该字段包含 url,据我所知,它与请求字符串中的 url 相同。

我将此 url 字段用作外键,我需要清楚地识别结果。

这是我用来从 embed.ly 加载 json 数据的函数。我只是遍历一个数组,其中包含在另一个函数中提取的一些 url,并将它们 implode() 到一个查询字符串。

收到 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)
  }
4

1 回答 1

0

结果总是按照它们传入的顺序传回。您应该能够在请求 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 非常生锈,但它应该给你一个大致的想法。

于 2014-04-16T15:47:41.133 回答