web-dev-qa-db-ja.com

カスタムサービスが「401(不正:必要な引数merchant_idがありません)」を返します

カスタムサービスモジュールを呼び出そうとしていますが、401と表示されています。

資源:

$resources =  array(
    'get_contacts' => array(
      'operations' => array(
        'index' => array(
          'help' => 'Get customers and their contacts',
          'file' => array('type' => 'inc', 'module' => 'sync_contacts', 'name' => 'resources/sync_contacts.resource'),
          'callback' => '_get_customer_contacts',
          'args' => array(
            array(
              'name' => 'merchant_id',
              'type' => 'int',
              'description' => t('Get customers and their contacts by merchant_id.'),
              'source' => array('data' => 'merchant_id'),
              'optional' => FALSE,              
            ),
          ),
          'access callback file' => array(
            'type' => 'inc',
            'module' => 'drupalgap',
            'name' => 'drupalgap.resource',
          ),
          'access callback' => '_sync_contacts_access',
          'access arguments' => array('view'),
          'access arguments append' => TRUE,
        ),
      ),
    ),
  );

サービス機能:

function sync_contacts_get_customers_list(options) {
  try { 
    options.method = 'GET'; 
    options.path = 'get_contacts.json';//'.json' removed and tested also
    options.service = 'sync_contacts';
    options.resource = 'get_contacts';

    Drupal.services.call(options);
  }
  catch (error) {
    console.log( error);
  }
}

サービス関数呼び出し:

try {
    var my_args = {
        merchant_id: 1
    };
    sync_contacts_get_customers_list({
      data: JSON.stringify(my_args),
      success: function(result) {           
        drupalgap_alert("SUCCESSSS");
        $("#contactList").append(JSON.stringify(result, null, 2));    
      }
    });
  } catch (error) { console.log(error); }

ポストマン:

POSTMAN Screenshot これがカスタムサービスの使用方法です。実行すると、「401(Unauthorized:Missing required argument merchant_id)」と表示されます。

この問題を解決するにはどうすればよいですか?

SOLUTION:以下の回答でタイラーのリソースを使用し、サービスコールを以下のように変更しました(GETをPOSTに変更し、それに応じてパスを変更しました)。

Note:テストするには、POSTMANでもPOSTを使用して呼び出し、merchant_id as Rawすなわち。 {"merchant_id": 1}

function sync_contacts_get_customers_list(options) {    
   try {    
     options.method = 'POST';   
     options.path = 'sync_contacts_resources/get_contacts';
     options.service = 'sync_contacts';
     options.resource = 'get_contacts';

     Drupal.services.call(options);
  }
  catch (error) {
    console.log( error);
  }
}
1
San

sync_contacts_get_customers_list関数でPOSTメソッドを使用する必要があります。

options.method = 'POST';

これがないと、Drupalサービスまでは何も「投稿」しないので、Drupalのリソースはmerchant_idに配信されません。

GETリクエストを使用する場合は、ビューのJSON( Views datasource )とコンテキストフィルターを使用することをお勧めします。それ以外の場合、サービスのカスタムリソースは常にPOST[〜#〜] afaik [〜#〜](エンティティのCRUDインターフェイスを構築している場合を除く)(例- Services Entity API )。

また、Drupalでカスタムリソースを定義する方法は正しくありません。代わりにactionsを使用してください。

  $resources = array(
    'sync_contacts_resources' => array(
      'actions' => array(
        'get_contacts' => array(
          'help' => 'Get customers and their contacts',
          'file' => array('type' => 'inc', 'module' => 'sync_contacts', 'name' => 'resources/sync_contacts.resource'),
          'callback' => '_get_customer_contacts',
          'args' => array(
            array(
              'name' => 'merchant_id',
              'type' => 'int',
              'description' => t('Get customers and their contacts by merchant_id.'),
              'source' => array('data' => 'merchant_id'),
              'optional' => FALSE,              
            ),
          ),
          'access callback file' => array(
            'type' => 'inc',
            'module' => 'drupalgap',
            'name' => 'drupalgap.resource',
          ),
          'access callback' => '_sync_contacts_access',
          'access arguments' => array('view'),
          'access arguments append' => TRUE,
        ),
      ),
    ),
  );
1