I built a simple GraphQL API extremely similar to gqlgen's "Getting Started" tutorial. I can query it successfully with curl. But I can't get the curl request for mutation right.
schema.graphql:
type Screenshot {
  id: ID!
  url: String!
  filename: String!
  username: String!
  description: String
}
input NewScreenshot {
  id: ID!
  url: String!
  filename: String!
  username: String!
  description: String
}
type Mutation {
  createScreenshot(input: NewScreenshot!): Screenshot!
  deleteScreenshot(id: ID!): String!
}
type Query {
  screenShots(username: String!): [Screenshot!]!
}
models_gen.go:
type NewScreenshot struct {
    ID          string  `json:"id"`
    URL         string  `json:"url"`
    Filename    string  `json:"filename"`
    Username    string  `json:"username"`
    Description *string `json:"description"`
}
type Screenshot struct {
    ID          string  `json:"id"`
    URL         string  `json:"url"`
    Filename    string  `json:"filename"`
    Username    string  `json:"username"`
    Description *string `json:"description"`
}
resolver.go:
func (r *mutationResolver) CreateScreenshot(ctx context.Context, input NewScreenshot) (Screenshot, error) {
    id, err := uuid.NewV4()
    shot := Screenshot{
        ID:          id.String(),
        Description: input.Description,
        URL:         input.URL,
        Filename:    input.Filename,
        Username:    input.Username,
    }
    return shot, nil
}
I've tried:
Going through the gqlgen documentation, the GraphQL schema, How to GraphQL, and several examples like this and this. And 1.5 days' worth of googling.
Permutating through a lot, a lot of different shapes in my curl request. This one seems the closest:
curl -v http://localhost:8080/query
-H "Content-Type: application/json"
-d '{ "query":
    { "createScreenshot":
        {"username": "Odour",
         "url": "google.com",
         "description": "just another screenshot",
         "filename": "testimage"
        }
    }
}'
But it fails with:
* timeout on name lookup is not supported
*   Trying ::1...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to localhost (::1) port 8080 (#0)
> POST /query HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.47.1
> Accept: */*
> Content-Type: application/json
> Content-Length: 146
>
} [146 bytes data]
* upload completely sent off: 146 out of 146 bytes
< HTTP/1.1 400 Bad Request
< Date: Sat, 19 Jan 2019 21:00:15 GMT
< Content-Length: 149
< Content-Type: text/plain; charset=utf-8
<
{ [149 bytes data]
100   295  100   149  100   146    149    146  0:00:01 --:--:--  0:00:01  145k{"errors":[{"message":"json body could not be decoded: json: cannot unmarshal object into Go struct field params.query of type string"}],"data":null}
* Connection #0 to host localhost left intact
Help?
The value of query in the JSON payload needs to be a string containing the GraphQL query, not an object like you are using, for example:
$ curl \
  -H "Content-Type: application/json" \
  -d '{ "query": "mutation { createScreenshot(input: { username: \"Odour\" }) { id } }" }' \
  http://localhost:8080/query
Note that you need to escape the double quotes within the query string.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With