3
votes

I am newer to Go and Google App Engine and I'm trying to build a simple middleware API that queries an external API.

Because I am using the standard env on Google App Engine I have to use urlfetch to create a http request. With Google's documentation, I can't figure out how to add in headers to my GET request - though the documentation clearly states I can add in headers.

https://cloud.google.com/appengine/docs/standard/go/outbound-requests

This is the code I am trying to modify to include a custom request header:

import (
    "fmt"
    "net/http"

    "google.golang.org/appengine"
    "google.golang.org/appengine/urlfetch"
)

func handler(w http.ResponseWriter, r *http.Request) {
        ctx := appengine.NewContext(r)
        client := urlfetch.Client(ctx)
        resp, err := client.Get("https://www.google.com/")
        if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
        }
        fmt.Fprintf(w, "HTTP GET returned status %v", resp.Status)
}

Any help would be much appreciated.

1
urfletch.Client returns an http.Client, so you should be able to use http.NewRequest to create your requests, add headers as you would in any other go application and then execute the request using the Do method of the client returned by urlfetch.Client. How to set headers on the request object is answered in this question.Leon

1 Answers

3
votes

Here is a working solution that uses http.NewRequest to add in a header.

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    client := urlfetch.Client(ctx)

    req, err := http.NewRequest("GET", "https://www.google.com/", nil)
    req.Header.Add("CUSTOM-HEADER", "VALUE")
    if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
    }

    resp, err := client.Do(req)
    if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
    }

    fmt.Fprintf(w, "HTTP GET returned status %v", resp.Status)
}