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 omRequest struct härifrån.,

*http.Request struct implementerar många metoder för att ändra objektet innan det skickas. Metoden*Request.AddCookielä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)

(https://play.golang.org/p/1NIYkq4Tc7P)

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.NewRequestfö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.

(https://play.golang.org/p/USbFc0D0cW0)

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ältetTimeout ä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.,

(https://play.golang.org/p/2qXkBOjqK8C)

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 errsom ä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.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *