web-dev-qa-db-ja.com

外部JSON APIを使用してノードのフィールドを作成/更新する方法は?

コンテンツタイプはsiteinfoです。

このコンテンツタイプには、テキスト、エンティティ参照などの複数のフィールドがあります。

外部APIを使用して、作成されたノードの一部のフィールドを自動的に入力したいと思います。

私が使用したいAPIは次のように言っています:

APIは、一貫性のある適切に構造化されたデータをXMLおよびJSON形式で返します。返されたデータには、アプリケーションで簡単に使用できる解析済みフィールドが含まれています。これはRESTfulベースのAPIです。


そして、これはAPIの出力です:

{
    "status": 1,
    "api_query": "siteinfo",
    "whois_record": {
        "domain_name": "example.com",
        "query_time": "2016-05-05 14:01:12",
        "create_date": "1995-08-14",
        "update_date": "2015-08-14",
        "expiry_date": "2016-08-13",
        "domain_registrar": {
            "iana_id": 376,
            "registrar_name": "RESERVED-INTERNET ASSIGNED NUMBERS AUTHORITY",
            "whois_server": "whois.iana.org",
            "referral_url": "http://res-dom.iana.org"
        },
        "name_servers": [
            "a.iana-servers.net",
            "b.iana-servers.net"
        ],
    },
}

enter image description here


この外部APIを使用するにはどうすればよいですか?

2
herci

サービスの複雑な認証/要求メソッドがない場合(例 http://service.example.com/api/siteinfo/1 の単純なHTTP GET)、 の組み合わせFeedsFeeds extensible parser 、& Libraries with JMESPath library インストールされている場合、ここでうまく機能します。

Feedsモジュールには、JSON JMESPathパーサーと組み合わせて使用​​できるHTTPフェッチャーがあり、 JMESPathクエリ を入力できます解析してノードに挿入/更新する各フィールド(たとえば、パーサー設定では、「@」(ルート)をContext& "whois_record。domain_name"(オブジェクトのプロパティをノードフィールドにマップする場合)。

このソリューションでは、フィードがインポート/更新簿記を処理している間、データを解析するための正しいクエリを理解する必要があります。このパスを使用する場合、 Feeds Import Preview モジュールを使用してインポートを実行前にテストしながら、 JMESPath構文 を学習すると非常に役立ちます。

インポートごとにURLを変える必要がある場合は、 Feedsインポートのプログラムによる呼び出し を関数に組み込み、drush evalまたはその他の任意の場所にあるインポートされたURLごとに呼び出すことができます。あなたの環境で。例えば:

//$url = Is your imported feed.
//$my_feed = Your imported feed machine name 
//(i.e. the MY_FEED_MACHINE_NAME in http://example.com/import/MY_FEED_MACHINE_NAME)
function MYMODULE_import_feed($url, $my_feed) {
  $feeds_source = feeds_source($my_feed);
  $feeds_config = $feeds_source->getConfigFor($feeds_source->importer->fetcher);
  $feeds_config['source'] = $url;
  $feeds_source->setConfigFor($feeds_source->importer->fetcher, $feeds_config);
  $feeds_source->save();
  $feeds_source->startImport();
}

//Example execution 
function MYMODULE_cron() {
  $import_titles = array('title_1', 'title_2');
  foreach ($import_titles as $title) {
    MYMODULE_import_feed("http://service.example.com/api/siteinfo/$title",'MY_FEED_MACHINE_NAME');
  }
}
2
Shawn Conn

コーディングなし、クリーンハンド、ソリューション:

フィード+ フィードJSONPathパーサー

コーディング、汚れた手、解決策:

REST with Webservices を使用すると、取得してから投稿/パッチを適用できます。また、x時間ごとに実行されるようにコードをスケジュールする方法を考え出す必要があります。 (cronジョブを作成する);対照的に、フィードには既にその機能があります。

1
No Sssweat