How to complete the challenge QUERY /todos JSONPath (200)

QUERY is a safe read method that can send query content in the request body. For this challenge, use a JSONPath expression to request todos where doneStatus=true.

QUERY /todos JSONPath (200)

Issue a QUERY request on the /todos end point with JSONPath query content to get only todos which are done. There must exist both done and not done todos to pass this challenge.

  • Use the QUERY method with /todos.
  • Add Content-Type: application/jsonpath.
  • Add Accept: application/json so you can inspect the response.
  • Send $.todos[?(@.doneStatus == true)] in the request body.
  • Make sure your challenger data has at least one todo with "doneStatus": true and at least one with "doneStatus": false.

Basic Instructions

  • Issue a QUERY request to:
    • https://apichallenges.com/todos
  • The request should have an X-CHALLENGER header so the challenge is tracked.
  • The request body should be a JSONPath expression:
$.todos[?(@.doneStatus == true)]

Try it now

If you need fixture data, create one done todo and one not-done todo first. See the solution.

POST /todos to create a done todo fixture
POST /todos to create a not-done comparison todo

Issue the QUERY request with the JSONPath filter in the body:

QUERY /todos with a JSONPath doneStatus filter

Example Request

> QUERY /todos HTTP/1.1
> Host: apichallenges.com
> User-Agent: rest-client
> X-CHALLENGER: x-challenger-guid
> Content-Type: application/jsonpath
> Accept: application/json
>
> $.todos[?(@.doneStatus == true)]

Example Response

< HTTP/1.1 200 OK
< Content-Type: application/json
< Accept-Query: application/x-www-form-urlencoded, application/jsonpath
< X-Challenger: x-challenger-guid

Returned body:

{
  "todos": [
    {
      "id": 42,
      "title": "done todo for JSONPath query",
      "doneStatus": true,
      "description": "created for query challenge"
    }
  ]
}

Lessons Learned

  • QUERY /todos can use Content-Type: application/jsonpath when the request body is a JSONPath expression.
  • JSONPath starts from $, uses @ for the current item in a filter, and can select matching objects from the collection.
  • API Challenges expects the JSONPath expression to select complete todo objects, not isolated fields such as titles.
  • The Accept-Query response header lists both supported QUERY body media types.

Suggested Experiments

  • Send $.todos to return every todo and compare it with GET /todos.
  • Send $.todos[?(@.doneStatus == false)] to return todos that are not done.
  • Send $.todos[?(@.description != '')] after creating a todo with a description.
  • Try $.todos[*].title and observe that selecting only field values is rejected.
  • Use the method reference for extra QUERY experiments and details on application/jsonpath.
Experiment with this endpoint