gör anpassade förfrågningar
hittills har vi lärt oss hur man gör enkla HTTP-förfrågningar men vi fokuserade inte för mycket på begäran anpassning som att ställa in anpassade begäran rubriker eller göra PUT
, PATCH
och DELETE
(och andra) HTTP-förfrågningar.
http.Request structure
http.Request
struct konfigurerar begäran som ska skickas., Get
, Post
och andra metoder som exponeras av *http.Client
konstruerar faktiskt http.Request
– objektet internt för att skicka begäran.
denna struktur har flera fält för att konfigurera TLS-anslutning, keep-alive-anslutning, formulärdata och andra inställningar, men följande fält är minimal konfiguration vi kan arbeta med.
Du kan läsa mer om
Request
struct härifrån.,
*http.Request
struct implementerar många metoder för att ändra objektet innan det skickas. Metoden*Request.AddCookie
lägger till en cookie i objektet request och *Request.SetBasicAuth
anger huvudrubriken basic authorization på begäran. Du kan utforska dessa metoder härifrån.
När vi konstruerar ett förfrågningsobjekt måste vi göra en förfrågan med det här förfrågningsobjektet manuellt. För det måste vi använda*Client.Do
– metoden. Eftersom Go ger http.DefaultClient
kan vi använda det för att göra en förfrågan.,
func (c *Client) Do(req *Request) (*Response, error)
In the above example, we are first creating a *url.URL
object from a URL string by using url.Parse
function. Since Request.URL
field should be an object of type *url.URL
, this step is necessary.,
begäran kroppen lagras iRequest.Body
fältet ska vara ett objekt som implementerario.ReadCloser
gränssnitt (en grupp avio.Reader
ochio.Closer
gränssnitt). strings.NewReader
returnerar ettio.Reader
– objekt ochioutil.NopCloser
– funktionen lägger tillClose()
– metoden påio.Reader
– objektet.
Close
– metoden tillagd avNopCloser
– funktionen gör ingenting, det returnerar helt enkelt ettnil
– fel., Begärandekroppen stängs för I/O via detta Close()
metodanrop när begäran skickas. I ett verkligt användningsfall bör du implementeraClose
– metoden korrekt för att inaktivera I / O på begäran.
Vi har också initierat fältetHeader
med några inledande begärande rubriker. För att skicka begäran använder viDefaultClient.Do
– metoden som returnerar nätverkssvaret och ettnon-nil
– fel om begäran misslyckas.,
🌶 go run go-http-client.go
status: 200
body: {"status":"success","data":{"name":"test","salary":"123","age":"23","id":53}}
Jag håller med, skicka en anpassad begäran verkar ganska komplicerat men vi kan använda funktionen http.NewRequest
för att konstruera *http.Request
objekt från några enkla värden som har följande syntax.
func NewRequest(method, url string, body io.Reader) (*Request, error)
den här funktionen returnerar ett*http.Request
– objekt och ettnon-nil
– fel om vissa argumentvärden inte är giltiga. Ommethod
argumentet är tomt antasGET
– begäran., We can add headers to the returned *Request
object.
The program above returns the same response as the earlier example., Även om reqBody
inte implementerar io.Closer
-gränssnittet, bör det helst implementera en giltig Close
– metod som inaktiverar I/O, annars lägger Go till en no-op-stängningsmetod på den med funktionen ioutil.NopCloser
.
http.Klientstruktur
strukturen http.Client
skapar en HTTP-klient med viss konfiguration som kan skicka HTTP-förfrågningar. http.DefaultClient
är en pekare till ett tomthttp.Client
– objekt som exponerar en standard HTTP-klient.,
var DefaultClient = &http.Client{}
som vi har sett tidigare implementerar *http.Client
Get
, Post
, PostForm
, Head
och PostForm
, Head
och metoder. Låt oss se hur http.Client
strukturtyp ser ut.
type Client struct {
// mechanism by which individual HTTP requests are made
Transport RoundTripper
// specifies the policy for handling redirects
CheckRedirect func(req *Request, via *Request) error// specifies the cookie jar
Jar CookieJar
// specifies a time limit for requests
Timeout time.Duration
}
fältetTransport
ett objekt som implementerar metodenRoundTrip
. Det här objektet är ansvarigt för att utföra en enda HTTP-begäran och returnera ett svar., Om fältvärdet är nil
används http.DefaultTransport
av typen *http.Transport
. I de flesta fall är detta standardvärde tillräckligt bra för oss.
fältetCheckRedirect
är en funktion som kontrollerar om omdirigering krävs av ett svar måste följas. Om detta värde är nil
används standardpolicyn för maximalt 10
omdirigeringar.
req
argumentet är den senaste begäran ochvia
argumentet innehåller de äldre begärandena (i gammal första ordning)., Om den här funktionen returnerar ett non-nil
– fel blockeras omdirigeringsförsöket. Kontrollera den här dokumentationen för att veta mer om hur svaret returneras och feltyperna.
fältetJar
anger en mekanism för att lägga till cookies på utgående HTTP-förfrågningar och cachecookies från inkommande svar. Denna cookie burk konsulteras för varje utgående och Omdirigerad begäran.
om värdet ärnil
skickas cookies endast om de anges på begäran (och kopieras till omdirigerade begäranden)., I händelse av en Omdirigerad begäran kan cookie jar mutera värdena för cookien. Du kan använda paketetnet/http/cookiejar
för att skapa din anpassade kakburk.
fältetTimeout
anger den tidsfrist för vilken svaret ska läsas. Om fältvärdet om0
vilket innebär att det inte finns någon timeout implementerad av HTTP-klienten. Detta värde anger tiden tills det slutliga svaret är fullständigt läst vilket inkluderar alla omdirigeringar och läsning av svaret.,
eftersom standardvärdet för fältet
Timeout
är0
kan det vara farligt i vissa scenarier där en skadlig tjänst aldrig skickar ett svar, utmattar din bandbredd och orsakar andra problem. Därför se till att lägga till lite timeout för varje begäran som kommer från din maskin.
för att kontrollera om felet returneras av*Client.Get
(eller någon annan metod) beror på timeout, bör vi kontrolleraerr.Timeout()
– värdet., Om timeout inträffar när du läser svarskroppen kommer det att returnera ett fel.
låt oss skapa en ny klient med ett litet timeout-värde och skicka en enkel HTTPGET
– förfrågan. Vi kommer att ställa in timeout-värdet 100 milliseconds
och eftersom det finns stor sannolikhet för tidsgräns för begäran, kommer vi också att kontrollera ett timeout-fel.,
In the example above, we have created an HTTP client with a timeout of 100ms
. Since Get
, Post
and other methods are implemented by the pointer of http.Client
type, the client
is a pointer.,
eftersom felet returneras av Get
– metoden (och andra metoder) alltid är av typen *url.Error
– typen måste vi extrahera detta konkreta värde från err
som är av typen error
– gränssnittet.
När felet uppstår på grund av en timeout returnerar *Error.Temporary()
– metoden true
. Och från resultatet nedan kan vi se att felet som returneras avGet
– metoden verkligen beror på en timeout.