http - 如何使用 gorequest 发起 POST 请求

标签 http go

Reddit 有一个 Oauth2 的 API 端点,我需要在其中使用适当的 header 和数据执行 POST 以获得访问 token 。这是我的代码:

package main

import (
    "github.com/parnurzeal/gorequest"
    "fmt"
)

func main() {
    app_key := "K...A"
    app_secret := "3...M"
    ua_string := "script:bast:0.1 (by /u/a...h)"
    username := "a...h"
    password := "..."
    r := gorequest.New().SetBasicAuth(app_key, app_secret).Set("User-Agent", ua_string)
    resp, body, errs := r.Post("https://www.reddit.com/api/v1/access_token").Send(
        map[string]string{
            "grant_type": "password",
            "username": username,
            "password": password,
        },
    ).End()
    if errs != nil {
        fmt.Println(errs)
    }
    fmt.Println(resp)
    fmt.Println(resp.StatusCode)
    fmt.Println(body)
}

但是它不起作用,我得到:{"message": "Too Many Requests", "error": 429}

我根本没有提出太多请求,我也遵守 API 规则。

这是我的等效 python 代码:

import requests
import requests.auth

app_key = "K...A"
app_secret = "3...M"
ua_string = "script:bast:0.1 (by /u/a...h)"
username = "a...h"
password = "..."

client_auth = requests.auth.HTTPBasicAuth(app_key, app_secret)
post_data = {"grant_type": "password", "username": username,
             "password": password}
headers = {"User-Agent": ua_string}
response = requests.post("https://www.reddit.com/api/v1/access_token",
                         auth=client_auth, data=post_data, headers=headers)
print(response.json())

那么我的 Go 代码有什么问题?我做错了什么吗?

最佳答案

我一直在使用paw客户端,主要是因为我可以测试/调试我的请求,一旦完成,我可以获得 curlgo 代码来这样做,除了其他选项,例如这是执行通用发布请求的输出:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func sendGetRepos() {
    // Create client
    client := &http.Client{}

    // Create request
    req, err := http.NewRequest("POST", "https://api.endpoint.tld", nil)

    // Headers
    req.Header.Add("Authorization", "Bearer ***** Hidden credentials *****")

    // Fetch Request
    resp, err := client.Do(req)

    if err != nil {
        fmt.Println("Failure : ", err)
    }

    // Read Response Body
    respBody, _ := ioutil.ReadAll(resp.Body)

    // Display Results
    fmt.Println("response Status : ", resp.Status)
    fmt.Println("response Headers : ", resp.Header)
    fmt.Println("response Body : ", string(respBody))
}

关于http - 如何使用 gorequest 发起 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42323374/

相关文章:

php - 带有 JSON 正文的 HTTP GET 请求是否有大小限制?

go - 创建没有标题的 zip 文件

php - Golang 用字符串中的数组元素替换数组元素

go - 在循环中清除和重写 slice

java - 在请求中设置用户角色以实现基于角色的访问以保护 Jersey 中的 Web 服务

java - 从 SOAP 响应中获取 HTTP 状态代码

http - 是否为每个请求打开和关闭 HTTP 连接?

c# - 如何在 C# 中获取像 IDM Grabber 这样的特殊网站的文件和文件夹

ruby-on-rails - golang 解码 websocket-rails JSON 响应

git - Docker alpine golang go get error for coding.net private repo