私の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/services.runtime.inc)
だから私はどちらが正しいURLであるのか疑問に思っています、そしてノードなしでURLを使用する必要がある場合は、この「entity_id」エラーを修正する方法が問題ですか? U
これが私のコードです:
// 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がありません」エラー(上記)が表示されます。
このスクリーンショットのように、サイトのサービス定義は、「投票」の「配列」としてパラメーターを確認します。また、必須ではない「基準」の配列。添付をご参照ください。 [] [1
解決済み:「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)
}
}