2017-02-19 20 views
0

Reddit имеет конечную точку API для Oauth2, где мне нужно сделать POST с соответствующими заголовками и данными, чтобы получить токен доступа. Вот мой код:Как сделать запрос 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 клиента, в основном потому, что я могу проверить/отладки мой запрос и как только я сделал, я могу получить curl или go код для этого, помимо других вариантов, например, это выход для делать общий почтовый запрос:

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)) 
}