Programming language: Go
License: Apache License 2.0
Tags: Utilities    
Latest version: v0.10

grequests alternatives and similar packages

Based on the "Utilities" category.
Alternatively, view grequests alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of grequests or a related project?

Add another 'Utilities' Package



A Go "clone" of the great and famous Requests library

Build Status GoDoc Coverage Status Join the chat at https://gitter.im/levigross/grequests


GRequests is licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for the full license text


  • Responses can be serialized into JSON and XML
  • Easy file uploads
  • Easy file downloads
  • Support for the following HTTP verbs GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS


go get -u github.com/levigross/grequests


import "github.com/levigross/grequests"

Basic Examples

Basic GET request:

resp, err := grequests.Get("http://httpbin.org/get", nil)
// You can modify the request by passing an optional RequestOptions struct

if err != nil {
    log.Fatalln("Unable to make request: ", err)

// {
//   "args": {},
//   "headers": {
//     "Accept": "*/*",
//     "Host": "httpbin.org",

If an error occurs all of the other properties and methods of a Response will be nil


Request Quirks

When passing parameters to be added to a URL, if the URL has existing parameters that contradict with what has been passed within Params โ€“ Params will be the "source of authority" and overwrite the contradicting URL parameter.

Lets see how it works...

ro := &RequestOptions{
    Params: map[string]string{"Hello": "Goodbye"},
Get("http://httpbin.org/get?Hello=World", ro)
// The URL is now http://httpbin.org/get?Hello=Goodbye

Response Quirks

Order matters! This is because grequests.Response is implemented as an io.ReadCloser which proxies the http.Response.Body io.ReadCloser interface. It also includes an internal buffer for use in Response.String() and Response.Bytes().

Here are a list of methods that consume the http.Response.Body io.ReadCloser interface.

  • Response.JSON
  • Response.XML
  • Response.DownloadToFile
  • Response.Close
  • Response.Read

The following methods make use of an internal byte buffer

  • Response.String
  • Response.Bytes

In the code below, once the file is downloaded โ€“ the Response struct no longer has access to the request bytes

response := Get("http://some-wonderful-file.txt", nil)

if err := response.DownloadToFile("randomFile"); err != nil {
    log.Println("Unable to download file: ", err)

// At this point the .String and .Bytes method will return empty responses

response.Bytes() == nil // true
response.String() == "" // true

But if we were to call response.Bytes() or response.String() first, every operation will succeed until the internal buffer is cleared:

response := Get("http://some-wonderful-file.txt", nil)

// This call to .Bytes caches the request bytes in an internal byte buffer โ€“ which can be used again and again until it is cleared
response.Bytes() == `file-bytes`
response.String() == "file-string"

// This will work because it will use the internal byte buffer
if err := resp.DownloadToFile("randomFile"); err != nil {
    log.Println("Unable to download file: ", err)

// Now if we clear the internal buffer....

// At this point the .String and .Bytes method will return empty responses

response.Bytes() == nil // true
response.String() == "" // true

*Note that all licence references and agreements mentioned in the grequests README section above are relevant to that project's source code only.