/crm/v3/objects/contacts/searchにてInvalid input JSON発生

お世話になっております。

LIG吉田です。

英語サイトにおいても「Invalid input JSON」について記事の存在は確認しました。

しかし、PHPのコードについての記事については見つけられず。

ご助力をお願いしたいです。

ご質問内容は以下のスクショの通りで、PHPコードが通らないのはなぜか?になります。

よろしくお願いします。

空配列の"values"=[]がフィルターに入ってしまっています。
テスター、たまに入力していないパラメータが空で入り込んでしまいます。
下記、成功SearchリクエストBodyの一例です。

 "filterGroups": [
 {
 "filters": [
 {
 "value": "true",
 "operator": "EQ",
 "propertyName": "support_service_subscribed_customer"
 }
 ]
 }
 ]

室田様

ご連絡ありがとうございます。

ご指摘箇所に問題があるのはわかりつつ・・・投稿した次第です。

上記のWebページでAPIを試せるのですが、「“values”=[] 」を、

同画面から消せないのはなぜだろう?というのが一つあります。

また上記ページ上で、「PHP」を選択し「Copy All」をし、

自Laravelプロジェクト内にペースト(use xxx等々調整しますが)後、

さらに「“values”=[] 」は取り除いた状態ですと、vscodeになりますが、

文法エラーが発生するようです。

use HubSpot\Factory;use HubSpot\Client\Crm\Contacts\ApiException;。。。$client = Factory::createWithAccessToken("pat-na1-2bf25c1d-2f5d-4103-af29-xxxxxxxx");$PublicObjectSearchRequest = new PublicObjectSearchRequest(['filter_groups' => [{"filters":[{"value":"seiichi115@gmail.com","propertyName":"email","operator":"EQ"}]}], 'sorts' => ["email"], 'properties' => ["email"], 'limit' => 1, 'after' => 0]);try {$apiResponse = $client->crm()->contacts()->searchApi()->doSearch($PublicObjectSearchRequest);var_dump($apiResponse);} catch (ApiException $e) {echo "Exception when calling search_api->do_search: ", $e->getMessage();}

エラーを次のように回避(ググった記事を参考にしました)

$client = \HubSpot\Factory::createWithAccessToken("pat-na1-2bf25c1d-2f5d-4103-af29-9938eefa632c"); $filters = array( 'filters' => array( array( 'value' => 'seiichi115@gmail.com', 'propertyName' => 'email', 'operator' => 'EQ', ), ), ); $PublicObjectSearchRequest = new PublicObjectSearchRequest( [ 'filter_groups' => json_encode($filters), 'sorts' => ["email"], 'properties' => ["email"], 'limit' => 1 ] ); try { $apiResponse = $client->crm()->contacts()->searchApi()->doSearch($PublicObjectSearchRequest); var_dump($apiResponse); } catch (ApiException $e) { echo "Exception when calling search_api->do_search: ", $e->getMessage(); }

上記コードを実行すると・・・

Exception when calling search_api->do_search: [400] Client error: POST https://api.hubapi.com/crm/v3/objects/contacts/search` resulted in a 400 Bad Request response: {“status”:“error”,“message”:"Invalid input JSON on line 1, column 17: Cannot deserialize value of type java.util.HashSe (truncated...)

うーん・・・

という状態です。

json形式が良くないっぽいのですが、そもそもの「Copy All」コードが動かないのはなぜなのか?

という状態です。

何かアドバイスありましたら、よろしくお願いします。

@吉田成一

前提として、API ドキュメント内のAPIを実行できる箇所はあまり信用しない方が多いです。バグが多く、またAPI自体のアップデートに追いついていないことも多いので……。(現にまだ非公開アプリに対応できていません)

本題ですが、上記コメントの

> エラーを次のように回避(ググった記事を参考にしました)

のコードを確認しました。ざっと見るに、sortの書き方が違うように思います。

一度削除してみるか、もしくは下記の形式で記述してみるといかがでしょうか?

"sorts": [
 {
 "propertyName": "createdate",
 "direction": "DESCENDING"
 }
]

searchエンドポイントの書式については、下記のドキュメントページが詳しいです。

余談ですが、私がAPIを試す際はドキュメントを見つつ、Postmanにてリクエストボディを書いてテストすることが多いです。使いこなせばかなり便利で、APIドキュメント上での実行よりもお勧めです。

@assi @吉田成一

  1. “sorts”:[“email”] でもリクエストは通ります(タイプミスがあっても通りますが)。デフォルトではASCENDINGなので、

"direction"

はDESCENDINGにしたい場合に利用するイメージだと思っています。

  • すでにご覧になっていると思いますが、海外CommunityでもPHPライブラリのエラーが報告されていますね。PHPは全く知らないのですが、[]のCollectionとArrayの区別がライブラリがうまくつけられていないようです。解決策も結局「curlのwrapperを使った」というのが最終的なようです。
    https://community.hubspot.com/t5/APIs-Integrations/Api-search-contact-by-email-in-php-invalid-json/td-p/496462
    https://community.hubspot.com/t5/APIs-Integrations/Problem-with-API-contacts-search-using-php-client-library/m-p/575002
    コミュニティの報告にも関わらず放置されているところを見ると、ライブラリを諦めて、httpクライアントを使用した方がいい気がします。
    ちなみに、curlとPythonでは、「空プロパティが時々入り込む」という以外は今のところバグに当たったことはないので、JavaScriptとPythonの方が力が入っているのでしょうか??と勘ぐってしまいます。

  • もしSearchの値がテストでemailにしているだけでなく本当にemailなのであれば、V1で

    Get a contact by email address

    というエンドポイントがあります。
    https://legacydocs.hubspot.com/docs/methods/contacts/get_contact_by_email
    SearchのRate Limitは4 Req/Secなので、こちらの方がお勧めです。

  • 余談ですが、VS Codeお使いであれば、Thunder ClientRapid API Clientというaddonがいいですよ!
    - PostManのようにリクエストを設定でき、
    - PostManのWorkspace=>新しいタブを開く=>TEXT->Raw->JSONを選択
    というのが若干邪魔くさかったのが省略され
    - リクエストを各言語に変換できます。
    過去のリクエスト履歴も勝手に残していってくれるので再利用しやすいです。

皆様

色々と情報ありがとうございました。

curlを叩くようにしました・・・(いいのかな・・・)

$url = 'https://api.hubapi.com/crm/v3/objects/contacts/search'; $headers = array(); $headers[] = 'Content-Type: application/json'; $headers[] = 'authorization: Bearer pat-na1-xxxxxxxx'; $payload = '{"filterGroups": [{"filters": [{"value": '; $payload .= '"' . $email . '"'; $payload .= ',"propertyName": "email","operator": "EQ"}]}],"properties": ["email"]}'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = json_decode(curl_exec($ch)); curl_close($ch);

HubSpot大変だなぁ・・・

@assiさん @KMurota さん

ナレッジシェアありがとうございます〜!私はAPIはさっぱりなので、、このようなナレッジをコミュニティーで共有いただけるの助かります><

@吉田成一 さんもこちらの投稿ありがとうございます。このような開発関連のリソースが増えるのありがたいです!

参考程度でお伺いしますが、日本国内の社員さんエンジニアの方は、

本コミュニティご覧になっていないのでしょうかね・・・

@吉田成一 さん

はい、HubSpotの社員もコミュニティー投稿を拝見しておりますが、今回のようにご質問内容に知見の深いコミュニティーメンバーの方が回答をしてくださる例も多くございます。ぜひ今後もHubSpotコミュニティーをご利用ください^^