简体   繁体   中英

What is the correct shape of a curl POST request to a gqlgen GraphQL API?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM