web-dev-qa-db-ja.com

Votingapi RESTサーバー呼び出し内部サーバーエラー-「サービス例外:エンティティIDがありません」

私のiOSアプリ(xcode7、Swift2)を通じて、私のD7サイトで「fivestar」評価への投票を投稿しようとしています。私のiOS Swift votingapiに投票を投稿するためのAPI RESTサービスの投稿は、200ステータスの問題がなく、エラーも発生しません。しかし、私のDrupalサイト/データベースが投票を登録/保存しません。Drupalサービス定義で指定されたURLを使用すると、ステータス500(内部サーバーエラー)とこのログメッセージ(オン私がテストしている2つのサイト);

  ServicesException: Missing entity ID for vote tag in services_error() (line 366 of /home/example/public_html/example.com/sites/all/modules/services/includes/servi‌​ces.runtime.inc)

だから私はどちらが正しいURLであるのか疑問に思っています、そしてノードなしでURLを使用する必要がある場合は、この「entity_id」エラーを修正する方法が問題ですか? U

see screenshot of database showing vote example, entered directly on d7 site, saved correctly. It does not register my second vote through the API.

これが私のコードです:

    // submit vote

    let voteEndpoint: String = "https://www.example.com/node/7291/ios1/votingapi/set_votes"
    let newVote = ["votes":["value":40, "uid":235, "vote_id":75000, "timestamp":146882901,  "vote_source":"70.36.223.173", "entity_id":7291, "entity_type":"node", "tag":"vote", "value_type":"percent"]]
    Alamofire.request(.POST, voteEndpoint, parameters: newVote, encoding: .JSON)
        .response { request, response, data, error in
            print(request)
            print (response)
            print (error)
    }

上記のようにURLを繰り返した後、コンソールは以下を返します。

 { status code: 200, headers {
    "Cache-Control" = "no-cache, must-revalidate";
    Connection = "Keep-Alive";
    "Content-Language" = en;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Tue, 19 Jul 2016 00:09:53 GMT";
    Expires = "Sun, 19 Nov 1978 05:00:00 GMT";
    "Keep-Alive" = "timeout=10, max=200";
    Link = "</node/7291>; rel=\"shortlink\",</Never-Return-to-Venice-chapter5>; rel=\"canonical\"";
    Server = Apache;
    "Set-Cookie" = "DRUPAL_UID=0; expires=Mon, 18-Jul-2016 00:09:53 GMT; Max-Age=-86401; path=/; domain=.example.com; secure, DRUPAL_UID=-1; expires=Thu, 11-Aug-2016 03:43:13 GMT; Max-Age=1999999; path=/; domain=.example.com; secure";
    "Transfer-Encoding" = Identity;
    "X-Content-Type-Options" = nosniff;
    "X-Frame-Options" = SAMEORIGIN;
    "X-Generator" = "Drupal 7 (http://drupal.org)";
    "X-Powered-By" = "PHP/5.6.9"; } }) nil
  • drupalシステムと投票モジュールは最新です

  • キャッシュをクリアしてcronを実行しました。

  • 新しいサービスエンドポイントでテストしてみました

  • 投票モジュールに関する問題を報告するステータスレポートエラーはありません。

  • Drupalログにエラーメッセージがありません

  • 匿名のアクセス許可は、投票を許可するように設定されています。

  • 投票は、drupalサイトの直接投票で通常保存されています。

  • drupalサービスには認証がなく、投票APIが設定されています。

  • 開発者は私のSwiftコードが正しいように見えることを確認しました

  • このdrupalcontrib Webページの情報によると、私のvotingapiパラメータは正しいですか? drupalcontrib.org/api/drupal/contributions%21votingapi%21votingapi.module/class/VotingApi_Vote/7を参照してください

  • 私のデータベースは「投票」について言及していませんが、配列については、使用したこれらのパラメーターが正しいパラメーターであることを確認しています。

  • webサーフィンは、これらがパラメーターの正しい値であることを確認します。必須パラメーターは「value」、「uid」、「entity_id」、「entity_type」のみです。これらのパラメーターのみを使用してみましたが、同じ結果が得られました。

私は多数のバリエーションを試しましたが、それらすべてはステータス200を与えますが、私のdrupalデータベースでは投票しません。レートモジュール(および 'vote'の代わりにそのカスタムタグ)を試しましたが、同じ結果です。URLで.jsonを使用せずに試行しました。entity_typeの他の可能なバリエーション(「node」ではなく「article」など)を試行しました。URLにnode/xxxxを使用せずに試行しました。他のモジュール)、「投票」の代わりに「基準」。

「entity_id」にノードIDを使用しています。あれは正しいですか?

何か案は?

これで何かですか:-Drupalサービス定義リスト:SET_VOTESエンティティの投票を設定POST: https://www.example。 com/ios1/votingapi/set_votes

残りのサービスエンドポイントはios1です。 URL(ios1の前)にnode/7291を含めると、ステータス200が返されます。しかし、投票はデータベースに登録されません。サービス定義に従って(ノードなしで)URLを使用すると、ステータス500と「サービス例外:エンティティIDがありません」エラー(上記)が表示されます。

このスクリーンショットのように、サイトのサービス定義は、「投票」の「配列」としてパラメーターを確認します。また、必須ではない「基準」の配列。添付をご参照ください。 [see screenshot: drupal services defintions] [1

2
Dimitri T

解決済み:「Content-Type:application/json」のヘッダーと、配列パラメーターの周りの追加のブラケットを含む基本認証を追加しました。

この完全なコードは投票に成功しています:

     // API request

    let user = "username"
    let password = "pass"
    let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
    let base64Credentials = credentialData.base64EncodedStringWithOptions([])
    let headers = ["Content-Type : application/json"]
    let voteEndpoint: String = "https://example.site/ios1/votingapi/set_votes.json"
    let newVote = ["votes":[["value":100,"uid":32,"entity_id":1,"entity_type":"node","tag":"vote","value_type":"percent"]]]
    Alamofire.request(.POST, voteEndpoint, parameters: newVote, encoding: .JSON)
         .response { request, response, data, error in
            debugPrint(response)
            print(request)
            print (response)
            print (error)
    }


}
0
Dimitri T