{"id":13413655,"url":"https://github.com/imroc/req","last_synced_at":"2025-05-06T15:19:35.164Z","repository":{"id":37431940,"uuid":"83145406","full_name":"imroc/req","owner":"imroc","description":"Simple Go HTTP client with Black Magic","archived":false,"fork":false,"pushed_at":"2025-04-25T03:58:30.000Z","size":2211,"stargazers_count":4476,"open_issues_count":65,"forks_count":365,"subscribers_count":62,"default_branch":"master","last_synced_at":"2025-04-25T14:51:03.808Z","etag":null,"topics":["go","golang","http","http-client"],"latest_commit_sha":null,"homepage":"https://req.cool","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imroc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-02-25T16:32:26.000Z","updated_at":"2025-04-25T09:01:08.000Z","dependencies_parsed_at":"2023-02-17T14:01:06.213Z","dependency_job_id":"3cd8823b-8aaf-48e5-9d61-032f04a117f3","html_url":"https://github.com/imroc/req","commit_stats":{"total_commits":817,"total_committers":28,"mean_commits":"29.178571428571427","dds":0.219094247246022,"last_synced_commit":"7a7eada8c72d39f847158b6047a6d83dd42a631c"},"previous_names":[],"tags_count":198,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imroc%2Freq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imroc%2Freq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imroc%2Freq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imroc%2Freq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imroc","download_url":"https://codeload.github.com/imroc/req/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252712116,"owners_count":21792265,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","http","http-client"],"created_at":"2024-07-30T20:01:45.557Z","updated_at":"2025-05-06T15:19:35.156Z","avatar_url":"https://github.com/imroc.png","language":"Go","readme":"# req\n\n\u003cp align=\"center\"\u003e\n    \u003cp align=\"center\"\u003e\u003cimg src=\"https://req.cool/images/req.png\"\u003e\u003c/p\u003e\n    \u003cp align=\"center\"\u003e\u003cstrong\u003eSimple Go HTTP client with Black Magic\u003c/strong\u003e\u003c/p\u003e\n    \u003cp align=\"center\"\u003e\n        \u003ca href=\"https://github.com/imroc/req/actions/workflows/ci.yml?query=branch%3Amaster\"\u003e\u003cimg src=\"https://github.com/imroc/req/actions/workflows/ci.yml/badge.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://goreportcard.com/report/github.com/imroc/req/v3\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/imroc/req/v3\" alt=\"Go Report Card\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://pkg.go.dev/github.com/imroc/req/v3\"\u003e\u003cimg src=\"https://pkg.go.dev/badge/github.com/imroc/req/v3.svg\"\u003e\u003c/a\u003e\n        \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/imroc/req.svg\" alt=\"License\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://github.com/imroc/req/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/imroc/req?display_name=tag\u0026sort=semver\" alt=\"GitHub Releases\"\u003e\u003c/a\u003e\n        \u003ca href=\"https://github.com/avelino/awesome-go\"\u003e\u003cimg src=\"https://awesome.re/mentioned-badge.svg\" alt=\"Mentioned in Awesome Go\"\u003e\u003c/a\u003e\n    \u003c/p\u003e \n\u003c/p\u003e\n\n## Documentation\n\nFull documentation is available on the official website: https://req.cool.\n\n## \u003ca name=\"Features\"\u003eFeatures\u003c/a\u003e\n\n* **Simple and Powerful**: Simple and easy to use, providing rich client-level and request-level settings, all of which are intuitive and chainable methods.\n* **Easy Debugging**: Powerful and convenient debug utilities, including debug logs, performance traces, and even dump the complete request and response content (see [Debugging](https://req.cool/docs/tutorial/debugging/)).\n* **Easy API Testing**: API testing can be done with minimal code, no need to explicitly create any Request or Client, or even to handle errors (See [Quick HTTP Test](https://req.cool/docs/tutorial/quick-test/))\n* **Smart by Default**: Detect and decode to utf-8 automatically if possible to avoid garbled characters (See [Auto Decode](https://req.cool/docs/tutorial/auto-decode/)), marshal request body and unmarshal response body automatically according to the Content-Type.\n* **Support Multiple HTTP Versions**: Support `HTTP/1.1`, `HTTP/2`, and `HTTP/3`, and can automatically detect the server side and select the optimal HTTP version for requests, you can also force the protocol if you want (See [Force HTTP version](https://req.cool/docs/tutorial/force-http-version/)).\n* **Support Retry**: Support automatic request retry and is fully customizable (See [Retry](https://req.cool/docs/tutorial/retry/)).\n* **HTTP Fingerprinting**: Support http fingerprint impersonation, so that we can access websites that prohibit crawler programs by identifying http fingerprints (See [HTTP Fingerprint](https://req.cool/docs/tutorial/http-fingerprint/)).\n* **Multiple Authentication Methods**: You can use HTTP Basic Auth, Bearer Auth Token and Digest Auth out of box (see [Authentication](https://req.cool/docs/tutorial/authentication/)).\n* **Easy Download and Upload**: You can download and upload files with simple request settings, and even set a callback to show real-time progress (See [Download](https://req.cool/docs/tutorial/download/) and [Upload](https://req.cool/docs/tutorial/upload/)).\n* **Exportable**: `req.Transport` is exportable. Compared with `http.Transport`, it also supports HTTP3, dump content, middleware, etc. It can directly replace the Transport of `http.Client` in existing projects, and obtain more powerful functions with minimal code change.\n* **Extensible**: Support Middleware for Request, Response, Client and Transport (See [Request and Response Middleware](https://req.cool/docs/tutorial/middleware-for-request-and-response/)) and [Client and Transport Middleware](https://req.cool/docs/tutorial/middleware-for-client-and-transport/)).\n\n## \u003ca name=\"Get-Started\"\u003eGet Started\u003c/a\u003e\n\n**Install**\n\nYou first need [Go](https://go.dev/) installed (version 1.23+ is required), then you can use the below Go command to install req:\n\n``` sh\ngo get github.com/imroc/req/v3\n```\n\n**Import**\n\nImport req to your code:\n\n```go\nimport \"github.com/imroc/req/v3\"\n```\n\n**Basic Usage**\n\n```bash\n# assume the following codes in main.go file\n$ cat main.go\n```\n\n```go\npackage main\n\nimport (\n    \"github.com/imroc/req/v3\"\n)\n\nfunc main() {\n    req.DevMode() // Treat the package name as a Client, enable development mode\n    req.MustGet(\"https://httpbin.org/uuid\") // Treat the package name as a Request, send GET request.\n\n    req.EnableForceHTTP1() // Force using HTTP/1.1\n    req.MustGet(\"https://httpbin.org/uuid\")\n}\n```\n\n```bash\n$ go run main.go\n2022/05/19 10:05:07.920113 DEBUG [req] HTTP/2 GET https://httpbin.org/uuid\n:authority: httpbin.org\n:method: GET\n:path: /uuid\n:scheme: https\nuser-agent: req/v3 (https://github.com/imroc/req/v3)\naccept-encoding: gzip\n\n:status: 200\ndate: Thu, 19 May 2022 02:05:08 GMT\ncontent-type: application/json\ncontent-length: 53\nserver: gunicorn/19.9.0\naccess-control-allow-origin: *\naccess-control-allow-credentials: true\n\n{\n  \"uuid\": \"bd519208-35d1-4483-ad9f-e1555ae108ba\"\n}\n\n2022/05/19 10:05:09.340974 DEBUG [req] HTTP/1.1 GET https://httpbin.org/uuid\nGET /uuid HTTP/1.1\nHost: httpbin.org\nUser-Agent: req/v3 (https://github.com/imroc/req/v3)\nAccept-Encoding: gzip\n\nHTTP/1.1 200 OK\nDate: Thu, 19 May 2022 02:05:09 GMT\nContent-Type: application/json\nContent-Length: 53\nConnection: keep-alive\nServer: gunicorn/19.9.0\nAccess-Control-Allow-Origin: *\nAccess-Control-Allow-Credentials: true\n\n{\n  \"uuid\": \"49b7f916-c6f3-49d4-a6d4-22ae93b71969\"\n}\n```\n\nThe sample code above is good for quick testing purposes, which use `DevMode()` to see request details, and send requests using global wrapper methods that use the default client behind the scenes to initiate the request.\n\nIn production, it is recommended to explicitly create a client, and then use the same client to send all requests, please see other examples below.\n\n**Videos**\n\nThe following is a series of video tutorials for req:\n\n* [Youtube Play List](https://www.youtube.com/watch?v=Dy8iph8JWw0\u0026list=PLnW6i9cc0XqlhUgOJJp5Yf1FHXlANYMhF\u0026index=2)\n* [BiliBili 播放列表](https://www.bilibili.com/video/BV14t4y1J7cm) (Chinese)\n\n**More**\n\nCheck more introduction, tutorials, examples, best practices and API references on the [official website](https://req.cool/).\n\n## \u003ca name=\"Simple-Get\"\u003eSimple GET\u003c/a\u003e\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/imroc/req/v3\"\n\t\"log\"\n)\n\nfunc main() {\n\tclient := req.C() // Use C() to create a client.\n\tresp, err := client.R(). // Use R() to create a request.\n\t\tGet(\"https://httpbin.org/uuid\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\tfmt.Println(resp)\n}\n```\n\n```txt\n{\n  \"uuid\": \"a4d4430d-0e5f-412f-88f5-722d84bc2a62\"\n}\n```\n\n## \u003ca name=\"Advanced-Get\"\u003eAdvanced GET\u003c/a\u003e\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"github.com/imroc/req/v3\"\n  \"log\"\n  \"time\"\n)\n\ntype ErrorMessage struct {\n  Message string `json:\"message\"`\n}\n\ntype UserInfo struct {\n  Name string `json:\"name\"`\n  Blog string `json:\"blog\"`\n}\n\nfunc main() {\n  client := req.C().\n    SetUserAgent(\"my-custom-client\"). // Chainable client settings.\n    SetTimeout(5 * time.Second)\n\n  var userInfo UserInfo\n  var errMsg ErrorMessage\n  resp, err := client.R().\n    SetHeader(\"Accept\", \"application/vnd.github.v3+json\"). // Chainable request settings.\n    SetPathParam(\"username\", \"imroc\"). // Replace path variable in url.\n    SetSuccessResult(\u0026userInfo). // Unmarshal response body into userInfo automatically if status code is between 200 and 299.\n    SetErrorResult(\u0026errMsg). // Unmarshal response body into errMsg automatically if status code \u003e= 400.\n    EnableDump(). // Enable dump at request level, only print dump content if there is an error or some unknown situation occurs to help troubleshoot.\n    Get(\"https://api.github.com/users/{username}\")\n\n  if err != nil { // Error handling.\n    log.Println(\"error:\", err)\n    log.Println(\"raw content:\")\n    log.Println(resp.Dump()) // Record raw content when error occurs.\n    return\n  }\n\n  if resp.IsErrorState() { // Status code \u003e= 400.\n    fmt.Println(errMsg.Message) // Record error message returned.\n    return\n  }\n\n  if resp.IsSuccessState() { // Status code is between 200 and 299.\n    fmt.Printf(\"%s (%s)\\n\", userInfo.Name, userInfo.Blog)\n    return\n  }\n\n  // Unknown status code.\n  log.Println(\"unknown status\", resp.Status)\n  log.Println(\"raw content:\")\n  log.Println(resp.Dump()) // Record raw content when server returned unknown status code.\n}\n```\n\nNormally it will output (SuccessState):\n\n```txt\nroc (https://imroc.cc)\n```\n\n## \u003ca name=\"More-Advanced-Get\"\u003eMore Advanced GET\u003c/a\u003e\n\nYou can set up a unified logic for error handling on the client, so that each time you send a request you only need to focus on the success situation, reducing duplicate code.\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/imroc/req/v3\"\n\t\"log\"\n\t\"time\"\n)\n\ntype ErrorMessage struct {\n\tMessage string `json:\"message\"`\n}\n\nfunc (msg *ErrorMessage) Error() string {\n\treturn fmt.Sprintf(\"API Error: %s\", msg.Message)\n}\n\ntype UserInfo struct {\n\tName string `json:\"name\"`\n\tBlog string `json:\"blog\"`\n}\n\nvar client = req.C().\n\tSetUserAgent(\"my-custom-client\"). // Chainable client settings.\n\tSetTimeout(5 * time.Second).\n\tEnableDumpEachRequest().\n\tSetCommonErrorResult(\u0026ErrorMessage{}).\n\tOnAfterResponse(func(client *req.Client, resp *req.Response) error {\n\t\tif resp.Err != nil { // There is an underlying error, e.g. network error or unmarshal error.\n\t\t\treturn nil\n\t\t}\n\t\tif errMsg, ok := resp.ErrorResult().(*ErrorMessage); ok {\n\t\t\tresp.Err = errMsg // Convert api error into go error\n\t\t\treturn nil\n\t\t}\n\t\tif !resp.IsSuccessState() {\n\t\t\t// Neither a success response nor a error response, record details to help troubleshooting\n\t\t\tresp.Err = fmt.Errorf(\"bad status: %s\\nraw content:\\n%s\", resp.Status, resp.Dump())\n\t\t}\n\t\treturn nil\n\t})\n\nfunc main() {\n\tvar userInfo UserInfo\n\tresp, err := client.R().\n\t\tSetHeader(\"Accept\", \"application/vnd.github.v3+json\"). // Chainable request settings\n\t\tSetPathParam(\"username\", \"imroc\").\n\t\tSetSuccessResult(\u0026userInfo). // Unmarshal response body into userInfo automatically if status code is between 200 and 299.\n\t\tGet(\"https://api.github.com/users/{username}\")\n\n\tif err != nil { // Error handling.\n\t\tlog.Println(\"error:\", err)\n\t\treturn\n\t}\n\n\tif resp.IsSuccessState() { // Status code is between 200 and 299.\n\t\tfmt.Printf(\"%s (%s)\\n\", userInfo.Name, userInfo.Blog)\n\t}\n}\n```\n\n## \u003ca name=\"Simple-Post\"\u003eSimple POST\u003c/a\u003e\n\n```go\npackage main\n\nimport (\n  \"fmt\"\n  \"github.com/imroc/req/v3\"\n  \"log\"\n)\n\ntype Repo struct {\n  Name string `json:\"name\"`\n  Url  string `json:\"url\"`\n}\n\ntype Result struct {\n  Data string `json:\"data\"`\n}\n\nfunc main() {\n  client := req.C().DevMode()\n  var result Result\n\n  resp, err := client.R().\n    SetBody(\u0026Repo{Name: \"req\", Url: \"https://github.com/imroc/req\"}).\n    SetSuccessResult(\u0026result).\n    Post(\"https://httpbin.org/post\")\n  if err != nil {\n    log.Fatal(err)\n  }\n\n  if !resp.IsSuccessState() {\n    fmt.Println(\"bad response status:\", resp.Status)\n    return\n  }\n  fmt.Println(\"++++++++++++++++++++++++++++++++++++++++++++++++\")\n  fmt.Println(\"data:\", result.Data)\n  fmt.Println(\"++++++++++++++++++++++++++++++++++++++++++++++++\")\n}\n```\n\n```txt\n2022/05/19 20:11:00.151171 DEBUG [req] HTTP/2 POST https://httpbin.org/post\n:authority: httpbin.org\n:method: POST\n:path: /post\n:scheme: https\nuser-agent: req/v3 (https://github.com/imroc/req/v3)\ncontent-type: application/json; charset=utf-8\ncontent-length: 55\naccept-encoding: gzip\n\n{\"name\":\"req\",\"website\":\"https://github.com/imroc/req\"}\n\n:status: 200\ndate: Thu, 19 May 2022 12:11:00 GMT\ncontent-type: application/json\ncontent-length: 651\nserver: gunicorn/19.9.0\naccess-control-allow-origin: *\naccess-control-allow-credentials: true\n\n{\n  \"args\": {},\n  \"data\": \"{\\\"name\\\":\\\"req\\\",\\\"website\\\":\\\"https://github.com/imroc/req\\\"}\",\n  \"files\": {},\n  \"form\": {},\n  \"headers\": {\n    \"Accept-Encoding\": \"gzip\",\n    \"Content-Length\": \"55\",\n    \"Content-Type\": \"application/json; charset=utf-8\",\n    \"Host\": \"httpbin.org\",\n    \"User-Agent\": \"req/v3 (https://github.com/imroc/req/v3)\",\n    \"X-Amzn-Trace-Id\": \"Root=1-628633d4-7559d633152b4307288ead2e\"\n  },\n  \"json\": {\n    \"name\": \"req\",\n    \"website\": \"https://github.com/imroc/req\"\n  },\n  \"origin\": \"103.7.29.30\",\n  \"url\": \"https://httpbin.org/post\"\n}\n\n++++++++++++++++++++++++++++++++++++++++++++++++\ndata: {\"name\":\"req\",\"url\":\"https://github.com/imroc/req\"}\n++++++++++++++++++++++++++++++++++++++++++++++++\n```\n\n## \u003ca name=\"Do-API-Style\"\u003eDo API Style\u003c/a\u003e\n\nIf you like, you can also use a Do API style like the following to make requests:\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/imroc/req/v3\"\n)\n\ntype APIResponse struct {\n\tOrigin string `json:\"origin\"`\n\tUrl    string `json:\"url\"`\n}\n\nfunc main() {\n\tvar resp APIResponse\n\tc := req.C().SetBaseURL(\"https://httpbin.org/post\")\n\terr := c.Post().\n\t\tSetBody(\"hello\").\n\t\tDo().\n\t\tInto(\u0026resp)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tfmt.Println(\"My IP is\", resp.Origin)\n}\n```\n\n```txt\nMy IP is 182.138.155.113\n```\n\n* The order of chain calls is more intuitive: first call Client to create a request with a specified Method, then use chain calls to set the request, then use `Do()` to fire the request, return Response, and finally call `Response.Into` to unmarshal response body into specified object.\n* `Response.Into` will return an error if an error occurs during sending the request or during unmarshalling.\n* The url of some APIs is fixed, and different types of requests are implemented by passing different bodies. In this scenario, `Client.SetBaseURL` can be used to set a unified url, and there is no need to set the url for each request when initiating a request. Of course, you can also call `Request.SetURL` to set it if you need it.\n\n## \u003ca name=\"Build-SDK-With-Req\"\u003eBuild SDK With Req\u003c/a\u003e\n\nHere is an example of building GitHub's SDK with req, using two styles (`GetUserProfile_Style1`, `GetUserProfile_Style2`).\n\n```go\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/imroc/req/v3\"\n)\n\ntype ErrorMessage struct {\n\tMessage string `json:\"message\"`\n}\n\n// Error implements go error interface.\nfunc (msg *ErrorMessage) Error() string {\n\treturn fmt.Sprintf(\"API Error: %s\", msg.Message)\n}\n\ntype GithubClient struct {\n\t*req.Client\n}\n\nfunc NewGithubClient() *GithubClient {\n\treturn \u0026GithubClient{\n\t\tClient: req.C().\n\t\t\tSetBaseURL(\"https://api.github.com\").\n\t\t\tSetCommonErrorResult(\u0026ErrorMessage{}).\n\t\t\tEnableDumpEachRequest().\n\t\t\tOnAfterResponse(func(client *req.Client, resp *req.Response) error {\n\t\t\t\tif resp.Err != nil { // There is an underlying error, e.g. network error or unmarshal error.\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tif errMsg, ok := resp.ErrorResult().(*ErrorMessage); ok {\n\t\t\t\t\tresp.Err = errMsg // Convert api error into go error\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tif !resp.IsSuccessState() {\n\t\t\t\t\t// Neither a success response nor a error response, record details to help troubleshooting\n\t\t\t\t\tresp.Err = fmt.Errorf(\"bad status: %s\\nraw content:\\n%s\", resp.Status, resp.Dump())\n\t\t\t\t}\n\t\t\t\treturn nil\n\t\t\t}),\n\t}\n}\n\ntype UserProfile struct {\n\tName string `json:\"name\"`\n\tBlog string `json:\"blog\"`\n}\n\n// GetUserProfile_Style1 returns the user profile for the specified user.\n// Github API doc: https://docs.github.com/en/rest/users/users#get-a-user\nfunc (c *GithubClient) GetUserProfile_Style1(ctx context.Context, username string) (user *UserProfile, err error) {\n\t_, err = c.R().\n\t\tSetContext(ctx).\n\t\tSetPathParam(\"username\", username).\n\t\tSetSuccessResult(\u0026user).\n\t\tGet(\"/users/{username}\")\n\treturn\n}\n\n// GetUserProfile_Style2 returns the user profile for the specified user.\n// Github API doc: https://docs.github.com/en/rest/users/users#get-a-user\nfunc (c *GithubClient) GetUserProfile_Style2(ctx context.Context, username string) (user *UserProfile, err error) {\n\terr = c.Get(\"/users/{username}\").\n\t\tSetPathParam(\"username\", username).\n\t\tDo(ctx).\n\t\tInto(\u0026user)\n\treturn\n}\n```\n\n## Contributing\n\nIf you have a bug report or feature request, you can [open an issue](https://github.com/imroc/req/issues/new), and [pull requests](https://github.com/imroc/req/pulls) are also welcome.\n\n## Contact\n\nIf you have questions, feel free to reach out to us in the following ways:\n\n* [Github Discussion](https://github.com/imroc/req/discussions)\n* [Slack](https://imroc-req.slack.com/archives/C03UFPGSNC8) | [Join](https://slack.req.cool/)\n\n## Sponsors\n\nIf you like req and it really helps you, feel free to reward me with a cup of coffee, and don't forget to mention your github id.\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd align=\"center\"\u003e\n            \u003cimg src=\"https://req.cool/images/wechat.jpg\" width=\"200px\"   alt=\"\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eWechat\u003c/b\u003e\u003c/sub\u003e\n        \u003c/td\u003e\n        \u003ctd align=\"center\"\u003e\n            \u003cimg src=\"https://req.cool/images/alipay.jpg\" width=\"200px\"   alt=\"\"/\u003e\n            \u003cbr /\u003e\n            \u003csub\u003e\u003cb\u003eAlipay\u003c/b\u003e\u003c/sub\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\nMany thanks to the following sponsors:\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd align=\"center\"\u003e\n            \u003ca href=\"https://github.com/M-Cosmosss\"\u003e\n                \u003cimg src=\"https://avatars.githubusercontent.com/u/46757262?v=4?s=100\" width=\"160px\"   alt=\"\"/\u003e\n                \u003cbr /\u003e\n                \u003csub\u003e\u003cb\u003eM-Cosmosss 🥇\u003c/b\u003e\u003c/sub\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n        \u003ctd align=\"center\"\u003e\n            \u003ca href=\"https://github.com/aadog\"\u003e\n                \u003cimg src=\"https://avatars.githubusercontent.com/u/18098725?v=4?s=100\" width=\"160px\"   alt=\"\"/\u003e\n                \u003cbr /\u003e\n                \u003csub\u003e\u003cb\u003eaadog 🥈\u003c/b\u003e\u003c/sub\u003e\n            \u003c/a\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n## \u003ca name=\"License\"\u003eLicense\u003c/a\u003e\n\n`Req` released under MIT license, refer [LICENSE](LICENSE) file.\n","funding_links":[],"categories":["Go","Misc","Networking","开源类库","网络","Open source library","Go (531)","Programming Languages","开发工具\u0026框架","Libraries"],"sub_categories":["HTTP Clients","HTTP","HTTP客户端","HTTP Print Test","Go"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimroc%2Freq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimroc%2Freq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimroc%2Freq/lists"}