2017-02-19 141 views
0

Reddit拥有Oauth2的API端点,我需要使用正确的标题和数据执行POST以获取访问令牌。这里是我的代码:如何使用gorequest发出POST请求

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代码?我在做什么错误?

+0

您是否必须使用“github.com/parnurzeal/gorequest”? “net/http”的请求不好吗? – Tanaike

回答

0

我一直在使用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)) 
}