Ausführen benutzerdefinierter Anforderungen

Bisher haben wir gelernt, einfache HTTP-Anforderungen zu stellen, aber wir haben uns nicht zu sehr auf die Anpassung von Anforderungen konzentriert, z. B. das Festlegen benutzerdefinierter Anforderungsheader oder das Erstellen von PUT, PATCH und DELETE (und andere) HTTP-Anforderungen.

http.Anforderungsstruktur

Die http.Request – Struktur konfiguriert die zu sendende Anforderung., Die Get, Post und andere Methoden, die durch die tatsächlich konstruieren http.Request Objekt intern, um die Anfrage zu senden.

Diese Struktur verfügt über mehrere Felder zum Konfigurieren der TLS-Verbindung, der Keep-Alive-Verbindung, der Formulardaten und anderer Einstellungen.

💡 Mehr über Request struct erfahren Sie hier.,

Die *http.Request Struktur implementiert viele Methoden, um das Anforderungsobjekt vor dem Senden zu ändern. Die*Request.AddCookie – Methode fügt dem Anforderungsobjekt ein Cookie hinzu und*Request.SetBasicAuth legt den grundlegenden Autorisierungsheader für die Anforderung fest. Sie können diese Methoden von hier aus erkunden.

Sobald wir ein Anforderungsobjekt erstellt haben, müssen wir eine Anfrage mit diesem Anforderungsobjekt manuell stellen. Dazu müssen wir die Methode *Client.Do. Da Go http.DefaultClient, können wir damit eine Anfrage stellen.,

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

Der im Feld Request.Body gespeicherte Anforderungstext sollte ein Objekt sein, das die Schnittstelle io.ReadCloser implementiert (eine Gruppe vonio.Reader undio.Closer Schnittstellen). Die strings.NewReader gibt ein io.Reader Objekt und ioutil.NopCloser Funktion fügt methode auf die io.Reader objekt.

DieClose – Methode, die durch dieNopCloser – Funktion hinzugefügt wurde, führt nichts aus, sie gibt einfach einennil – Fehler zurück., Der Anforderungstext wird für E/A über diesen Methodenaufruf geschlossen, wenn die Anforderung gesendet wird. In einem realen Anwendungsfall sollten Sie die Close – Methode korrekt implementieren, um E/A im Anforderungstext zu deaktivieren.

Wir haben auch das Feld Header mit einigen anfänglichen Anforderungsheadern initialisiert. Um die Anfrage zu senden, verwenden wir dieDefaultClient.Do – Methode, die die Netzwerkantwort und einennon-nil – Fehler zurückgibt, wenn die Anfrage fehlschlägt.,

🌶 go run go-http-client.go
status: 200
body: {"status":"success","data":{"name":"test","salary":"123","age":"23","id":53}}

Ich stimme zu, das Senden einer benutzerdefinierten Anfrage scheint ziemlich kompliziert zu sein, aber wir können die http.NewRequest – Funktion verwenden, um *http.Request – Objekt aus einigen einfachen Werten zu konstruieren, die die folgende Syntax haben.

func NewRequest(method, url string, body io.Reader) (*Request, error)

Diese Funktion gibt ein *http.Request – Objekt und ein non-nil – Fehler zurück, falls einige Argumentwerte nicht gültig sind. Wenn method argument leer ist, wird GET Antrag ist angenommen., 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., Obwohl reqBody keine io.Closer-Schnittstelle implementiert, sollte idealerweise eine gültige Close – Methode implementiert werden, die E/A deaktiviert, andernfalls fügt Go eine No-op-Close-Methode mit der Funktion ioutil.NopCloser hinzu.

http.Client-Struktur

Diehttp.Client – Struktur erstellt einen HTTP-Client mit einer Konfiguration, die HTTP-Anforderungen senden kann. Die http.DefaultClient ist ein Zeiger auf ein leeres http.Client – Objekt, das einen Standard-HTTP-Client verfügbar macht.,

var DefaultClient = &http.Client{}

Wie wir bereits gesehen haben, implementiert die Get, Post, PostForm, Head und Do Methoden. Mal sehen, wie http.Client structure type aussieht.

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
}

Das Transport – Feld ist ein Objekt, das die RoundTrip – Methode implementiert. Dieses Objekt ist dafür verantwortlich, eine einzelne HTTP-Anforderung auszuführen und eine Antwort zurückzugeben., Wenn dieser Feldwert nil ist, wird http.DefaultTransport vom Typ *http.Transport verwendet. In den meisten Fällen ist dieser Standardwert gut genug für uns.

Das Feld CheckRedirect ist eine Funktion, die prüft, ob die von einer Antwort geforderte Umleitung befolgt werden muss. Wenn dieser Wert nil ist, wird die Standardrichtlinie für maximale 10 – Weiterleitungen verwendet.

Das Argument req ist die neueste Anforderung und das Argument via enthält die älteren Anforderungen (in alter erster Reihenfolge)., Wenn diese Funktion einen non-nil – Fehler zurückgibt, wird der Umleitungsversuch blockiert. In dieser Dokumentation erfahren Sie mehr darüber, wie die Antwort zurückgegeben wird und welche Fehlertypen auftreten.

Das Feld Jar gibt einen Mechanismus zum Hinzufügen von Cookies bei ausgehenden HTTP-Anforderungen und zum Zwischenspeichern von Cookies aus den eingehenden Antworten an. Diese Cookie-JAR wird für jede ausgehende und umgeleitete Anfrage konsultiert.

Wenn dieser Wert nil ist, werden Cookies nur gesendet, wenn sie in der Anforderung angegeben (und in umgeleitete Anforderungen kopiert) werden., Im Falle einer umgeleiteten Anfrage kann Cookie jar die Werte des Cookies mutieren. Sie können das Paket net/http/cookiejar verwenden, um Ihre benutzerdefinierte Cookie-JAR zu erstellen.

Das Feld Timeout gibt das Zeitlimit an, vor dem die Antwort gelesen werden soll. Wenn das Feld Wert, wenn 0 das bedeutet, es gibt kein Zeitlimit implementiert den HTTP-client. Dieser Wert gibt die Zeit an, bis die endgültige Antwort vollständig gelesen ist, einschließlich aller Weiterleitungen und des Lesens der Antwort.,

️ ️ Da der Standardwert des Felds Timeout 0 ist, kann dies in einigen Szenarien gefährlich sein, in denen ein böswilliger Dienst niemals eine Antwort sendet, Ihre Bandbreite erschöpft und andere Probleme verursacht. Stellen Sie daher sicher, dass Sie für jede Anforderung, die von Ihrem Computer stammt, ein Timeout hinzufügen.

Um zu überprüfen, ob der von der *Client.Get (oder einer anderen Methode) zurückgegebene Fehler auf eine Zeitüberschreitung zurückzuführen ist, sollten wir den Wert err.Timeout() überprüfen., Wenn das Timeout beim Lesen des Antwortkörpers auftritt, wird ein Fehler zurückgegeben.

Erstellen wir einen neuen Client mit einem kleinen Timeout-Wert und senden eine einfache HTTP GET – Anfrage. Wir setzen den Timeout-Wert 100 milliseconds und da die Wahrscheinlichkeit eines Anforderungszeitlimits hoch ist, werden wir auch nach einem Timeout-Fehler suchen.,

(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.,

Da der von der Get – Methode (und anderen Methoden) zurückgegebene Fehler immer vom Typ *url.Error ist, müssen wir diesen konkreten Wert aus der err – Schnittstelle vom Typ error extrahieren.

Wenn der Fehler aufgrund einer Zeitüberschreitung auftritt, gibt die *Error.Temporary() Methode true. Und aus dem folgenden Ergebnis können wir sehen, dass der von der Get – Methode zurückgegebene Fehler tatsächlich auf eine Zeitüberschreitung zurückzuführen ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.