- 概要
- GraphQLエラーを検出する
- 一般的なGraphQLエラーメッセージ
- Authorization Error
- Data Integrity or Validation Error
- Internal Error
- Internal server error
- JobIdentifierInput must specify one of indeedJobKey, employerJobId, or atsApplicationIdentifier
- JobSeekerIdentifierInput must specify either indeedJobSeekerKey or emailAddress
- PartnerDispositionIdentifierInput must specify one of indeedApplyID, ittk, universalApplyId, or alternateIdentifier
- Unable to parse statusChangeDateTime
- バッチリク エストにおけるバリデーションエラー
- 変数の入力に無効な値が含まれているエラー
- 一般的なGraphQLエラーコード
- BAD_USER_INPUTエラー
- FORBIDDENエラー
- GRAPHQL_PARSE_FAILEDエラー
- HTTPステータスコード
GraphQLエラーのトラブルシューティング
GraphQLエラーをトラブルシューティングします。
概要
GraphQLエラーのトラブルシューティング方法を解説します。
GraphQLにアクセスする前に発生する可能性があるOAuthエラーのトラブルシューティングについては、OAuthエラーのトラブルシューティングをご覧ください。
GraphQLが初めての方は、Apollo Odyssey:GraphQLチュートリアルおよびGraphQL仕様のErrorsをご覧ください。
GraphQLエラーを検出する
エラーを検出するには、HTTPステータスコードと結果のerrors配列を確認します。
HTTPステータスコードが200であっても、errors配列が存在する場合はエラーが発生しています。
errors配列には、エラーを説明するmessageフィールドと、エラーcodeおよびclassificationを含むextensionsが含まれます。例:
{ "errors": [{ "message": "Description of error", "path": ["Path"], "extensions": { "code": "BAD_USER_INPUT", "classification": { "type": "ExtendedValidationError", "validatedPath": [ "patchEmployer", "input", "employerAttributes", "countrySpecificAttributes", 0, "websiteUrl" ], "constraint": "@DossierUrlConstraint" }, "serviceName": "company-data-api", "stacktrace": [ "Stack trace" ] } }], "data": { "patchEmployer": null }}各フィールドの意味は次のとおりです。
| 値 | 説明 |
|---|---|
errors.message | エラーを説明するメッセージ。 一般的なGraphQLエラーメッセージをご覧ください。 例: |
errors.path | エラーが発生したパス。 例: |
errors.extensions | デバッグ用のフィールド。 |
errors.extensions.code | エラーコード。一般的なGraphQLエラーコードをご覧ください。 |
errors.extensions.code.validatedPath | 問題を引き起こしたフィールドへのパス。 |
errors.extensions.code.constraint | エラーの原因となったスキーマの制約。 |
errors.extensions.classification | フィールド制約によるエラーの詳細。 |
一般的なGraphQLエラーメッセージ
リクエストが失敗すると、dataフィールドはnullになり、errorsフィールドにエラー内容が含まれます。
errorsフィールドには、messageとcodeフィールドのほか、いくつかのフィールドが含まれます。
一般的なエラーメッセージは次のとおりです。
- Authorization Error
- Data Integrity or Validation Error
- Internal Error
- Internal server error
JobIdentifierInputmust specify one ofindeedJobKey,employerJobId, oratsApplicationIdentifierJobSeekerIdentifierInputmust specify eitherindeedJobSeekerKeyoremailAddressPartnerDispositionIdentifierInputmust specify one ofindeedApplyID,ittk,universalApplyId, oralternateIdentifier- Unable to parse
statusChangeDateTime - バッチリクエストにおけるバリデーションエラー
- 変数の入力に無効な値が含まれているエラー
一般的なGraphQLエラーコードおよびBuilt-in error codesもご覧ください。
Authorization Error
message | Authorization Error |
|---|---|
| 概要 | さまざまな理由で発生する可能性があります。Indeedはこのエラーを注意深く監視しています。 詳細については、Indeedにお問い合わせください。 |
Data Integrity or Validation Error
message | Data Integrity or Validation Error |
|---|---|
| 概要 | APIに入力として渡されたフィールドを正常に処理できない場合に発生する可能性があります。 入力値が有効か確認してください。問題が続く場合は、Indeedにお問い合わせください。 |
Internal Error
message | Internal Error |
|---|---|
| 概要 | さまざまな理由で発生する可能性があります。 Indeedはこのエラーを注意深く監視しています。詳細については、Indeedサポートにお問い合わせください。 |
Internal server error
Indeedはサービスを100%の稼働率で運用することを目指していますが、エラーが発生してサービス呼び出しが失敗することもあります。たとえば、次のようなサービスやコンポーネントが失敗する可能性があります。
- Indeedインフラ内のバックエンドサービス
- クライアントとサーバー間のネットワーク
- その間にあるあらゆるもの
一般に、この種のエラーには基本的なリトライロジックを実装することをお勧めします。一時的なエラーであれば、再試行すると解消されることがあります。問題が続く場合は、サーバー側に実際の問題がある可能性があります。その場合はIndeedサポートにお問い合わせください。
Indeed PLUS APIを呼び出すと、5,000ミリ秒後にタイムアウトとなります。
JobIdentifierInput must specify one of indeedJobKey, employerJobId, or atsApplicationIdentifier
message | JobIdentifierInput must specify one of indeedJobKey, employerJobId, or atsApplicationIdentifier |
|---|---|
| 概要 | ディスポジションを処理できるようにするため、次の識別子のうち少なくとも1つを指定します。
|
JobSeekerIdentifierInput must specify either indeedJobSeekerKey or emailAddress
message | JobSeekerIdentifierInput must specify either indeedJobSeekerKey or emailAddress |
|---|---|
| 概要 | ディスポジションを処理できるようにするため、次の識別子のうち少なくとも1つを指定します。
|
PartnerDispositionIdentifierInput must specify one of indeedApplyID, ittk, universalApplyId, or alternateIdentifier
message | PartnerDispositionIdentifierInput must specify one of indeedApplyID, ittk, universalApplyId, or alternateIdentifier |
|---|---|
| 概要 | ディスポジションを処理できるようにするため、次の識別子のうち少なくとも1つを指定します。
|
Unable to parse statusChangeDateTime
message | Unable to parse statusChangeDateTime |
|---|---|
| 概要 | サーバーはリクエストを受信しましたが、指定された 正しい このエラーは、リクエスト内の |
バッチリクエストにおけるバリデーションエラー
複数の求人を含むバッチリクエストを送信した際に、一部の求人が成功し、他の求人が失敗していても、Job Sync APIがリクエスト全体を拒否することがあります。この動作は、GraphQLの基本動作によるものです。
バッチ呼び出しでは、APIは求人投稿を作成した順にsourcedPostingIdsの値を一覧表示します。
エラーのclassificationに応じて、Job Sync APIはバリデーションエラーを異なる方法で処理します。
| エラー分類 | Job Sync APIの動作 |
|---|---|
ExtendedValidationError | バッチリクエスト内の1つ以上の求人が失敗しても、バッチ内の他の求人の処理を続行します。 |
| バッチリクエスト内の1つ以上の求人が失敗すると、バッチリクエスト全体を拒否します。 このタイプのエラーの例については、バリデーションエラーの例をご覧ください。 |
バリデーションエラーの例
{ "errors": [{ "extensions": { "code": "BAD_USER_INPUT", "classification": "ValidationError" }, "locations": [{ "line": 1, "column": 46 }], "message": "Validation error (WrongType@[jobsIngest/createSourcedJobPostings]) : argument 'input.jobPostings[1].metadata.contacts[0].contactInfo.contactPhone' with value 'StringValue{value='***********'}' is not a valid 'PhoneNumber' - String value `10001212223` is not a valid E.164 phone number" }]}変数の入力に無効な値が含まれているエラー
message | Variable 'input' has an invalid value: String value is not a valid web URL. Relative paths are not allowed. Value must be an absolute URL. |
|---|---|
code | BAD_USER_INPUT |
| 概要 | ミューテーションやクエリに値を渡すために変数を使用し、バリデーションチェックに通らない場合、GraphQLはどの変数が原因かとその理由を特定しますが、デフォルトではミューテーションやクエリ内で変数が使用されている場所のパス情報を含めません。 つまり、アプリ固有のバリデーションはパス変数を更新しますが、型バリデーションなどGraphQLフレームワークが実行するバリデーションはパス変数を更新しません。 |
一般的なGraphQLエラーコード
Built-in error codesもご覧ください。
errors配列のcodeフィールドに表示される一般的なエラーコードは次のとおりです。
| エラー | 説明と一般的な原因 | クエリを変更せずに成功する可能性 |
|---|---|---|
BAD_REQUEST | 入力が無効または処理できません。詳細はエラーメッセージをご覧ください。 | なし |
BAD_USER_INPUT | 入力が無効または処理できません。エラーメッセージを確認し、クエリを修正してリトライします。詳細については、 | なし |
FORBIDDEN | 認証情報に十分な権限がありません。HTTP | なし |
GRAPHQL_PARSE_FAILED |
| |
INTERNAL_SERVER_ERROR | サーバーで予期しないエラーが発生し、応答しませんでした。リクエストをリトライしてください。 | あり |
QUERY_TOO_COMPLEX | クエリが許容される複雑性を超えています。クエリを修正してリトライしてください。 | なし |
QUERY_TOO_NESTED | クエリのネストが深すぎます。クエリを修正してリトライしてください。 | なし |
UNAUTHENTICATED | リクエストに認証情報がありません。HTTP | なし |
BAD_USER_INPUTエラー
message | Exception while fetching data |
|---|---|
code | BAD_USER_INPUT |
| 概要 | クライアントが有効でないデータを送信しました。 |
BAD_USER_INPUTタイプのバリデーションエラーは、クライアントが無効なデータを送信した場合に発生します。次の例はバリデーションエラーを示しています。
{ "errors": [{ "message": "Exception while fetching data (/patchEmployer) : EmployerIdentifiersInput contains invalid type or id", "path": [ "patchEmployer" ], "extensions": { "code": "BAD_USER_INPUT", "classification": { "type": "ExtendedValidationError", "validatedPath": [ "patchEmployer", "input", "employerAttributes", "countrySpecificAttributes", 0, "websiteUrl" ], "constraint": "@DossierUrlConstraint" }, "serviceName": "company-data-api", "stacktrace": [ "GraphQLError: Exception while fetching data (/patchEmployer) : EmployerIdentifiersInput contains invalid type or id" ] } }], "data": { "patchEmployer": null }}FORBIDDENエラー
message | Client is not authorized |
|---|---|
code | FORBIDDEN |
| 概要 | OAuthクライアントがIndeed APIゲートウェイに登録されていません。 |
OAuthクライアントがIndeed APIゲートウェイに登録されていない場合、FORBIDDENコードとともにClient is not authorizedメッセージを受け取ることがあります。例:
{ "data": null, "errors": [{ "extensions": { "code": "FORBIDDEN" }, "message": "Client is not authorized." }]}OAuthクライアントをIndeed APIゲートウェイに登録するには、サポートにお問い合わせください。
GRAPHQL_PARSE_FAILEDエラー
message | Syntax Error: Invalid number, expected digit but got: "a". |
|---|---|
code | GRAPHQL_PARSE_FAILED |
| 概要 | GraphQL操作文字列に構文エラーが含まれています。通常、このエラーは |
たとえば、次のペイロードはHTMLをエスケープしていません。
mutation { createSourcedJobPostings( input: { jobPostings: [{ body: { title: "Server" description: "<h4 style="text - align: left;">Responsibilities include:</h4> <ul> <li style="text-align: left;"> Customer interaction </li> <li style="text-align: left;"> Taking orders and closing checks </li> <li style="text-align: left;"> Food and drink service </li> <li style="text-align: left;"> General table and restaurant maintenance </li> <li style="text-align: left;"> Restaurant opening and closing duties </li> </ul>" location: { country: "US", cityRegionPostal: "Clio, MI 48420" } benefits: [] salary: { currency: "USD" minimumMinor: 387 maximumMinor: 387 period: "HOUR" } } metadata: { jobSource: { companyName: "Company name" sourceName: "Parent company name" sourceType: "Employer" } contacts: { contactType: "contact" contactInfo: { contactName: "Contact name" contactEmail: "contact@email.com" } } jobPostingId: "7308" datePublished: "2023-09-13T17:32Z" url: "https://companyname.com/jobs/1000/server" } applyMethod: { indeedApply: { apiToken: "e03dd8c2dd1748218c6d5cde83824606807f617dfa054b78f9192d1341a5d15d" postUrl: "https://app.companyname.com/ext/indeed/apply/" applyQuestions: "https://app.companyname.com/ext/indeed/apply/questions/1000/" resumeRequired: YES phoneRequired: YES } } }] } ) { results { jobPosting { sourcedPostingId } } }}次のエラーが発生します。
{ 'errors': [{ 'message': 'Syntax Error: Invalid number, expected digit but got: "a".', 'locations': [{ 'line': 7, 'column': 33 }], 'extensions': { 'code': 'GRAPHQL_PARSE_FAILED' } }]}この例を修正するには、descriptionフィールド内のHTMLタグをエスケープします。
クォートをエスケープします。<h4>、<ul>、<li>などのHTMLタグはそのまま使用できます。
mutation { createSourcedJobPostings( input: { jobPostings: [{ body: { title: "Server" description: "<h4 style=\"text - align: left;\">Responsibilities include:</h4> <ul> <li style=\"text-align: left;\"> Customer interaction </li> <li style=\"text-align: left;\"> Taking orders and closing checks </li> <li style=\"text-align: left;\"> Food and drink service </li> <li style=\"text-align: left;\"> General table and restaurant maintenance </li> <li style=\"text-align: left;\"> Restaurant opening and closing duties </li> </ul>" location: { country: "US", cityRegionPostal: "Clio, MI 48420" } benefits: [] salary: { currency: "USD" minimumMinor: 387 maximumMinor: 387 period: "HOUR" } } metadata: { jobSource: { companyName: "Company name" sourceName: "Parent company name" sourceType: "Employer" } contacts: { contactType: "contact" contactInfo: { contactName: "Contact name" contactEmail: "contact@email.com" } } jobPostingId: "7308" datePublished: "2023-09-13T17:32Z" url: "https://companyname.com/jobs/1000/server" } applyMethod: { indeedApply: { apiToken: "e03dd8c2dd1748218c6d5cde83824606807f617dfa054b78f9192d1341a5d15d" postUrl: "https://app.companyname.com/ext/indeed/apply/" applyQuestions: "https://app.companyname.com/ext/indeed/apply/questions/1000/" resumeRequired: YES phoneRequired: YES } } }] } ) { results { jobPosting { sourcedPostingId } } }}HTTPステータスコード
GraphQL関連のHTTPステータスコードは次のとおりです。
| HTTPステータスコード | 説明と解決方法 | |
|---|---|---|
| GraphQL操作が成功しました。 | |
| エラーが発生しました。一般的なエラーコードをご覧ください。 | |
| Apollo Serverがリクエストを有効なGraphQLドキュメントに解析できず、スキーマに対して検証できません。 この動作は 、 | |
| リクエストで無効なHTTPメソッドが使用されました。たとえば、ミューテーションに対する | |
| クライアントが一定時間内に送信したリクエストが多すぎます。レート制限を超過しました。 このエラーを回避するには、リトライ回数を減らすか、リトライの間隔を長くしてください。 詳細については、次をご覧ください。 | |
| このエラーの考えられる原因は次のとおりです。
| |
HTTPステータスコードの概要については、RFC 9110:Overview of Status Codesをご覧ください。
Apollo Serverのエラーコードについては、Apollo GraphQL Docs:Setting HTTP status code and headersをご覧ください。