Преобразование запроса curl в Golang - PullRequest
0 голосов
/ 01 февраля 2020

Итак, этот скручиваемый запрос к API PayPal Payouts работает:

curl --silent -v 'https://api.sandbox.paypal.com/v1/oauth2/token' \
   -H "Accept: application/json" \
   -H "Accept-Language: en_US" \
   -u "${client_id}:${client_secret}" \
   -d "grant_type=client_credentials"

Одна вещь, которая меня смущает: опция -d предназначена для данных в теле HTTP-запроса - выполняет -d вариант сделать это запрос POST или запрос curl над запросом GET с телом? Я бы предположил, что последнее, но я не уверен, учитывая вывод curl --help.

В golang У меня есть:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

const (
    PayPalTestClientID = "Aeit5RskDRN8eUUMB0Ud3RjA_z6feWMUHktwlJZMeQMo9A9ulbKK"
    PayPalTestSecret   = "EAAqyzrOTUWf-OFJCB4BxgXT4xuravL7pnkC8Tn20HYtZExd1mFO"
)

func main() {

    //reader := bytes.NewBuffer()
    req, err := http.NewRequest("GET", "https://api.sandbox.paypal.com/v1/oauth2/token", nil)

    if err != nil {
        log.Fatal(err)
    }

    req.Header.Set("Accept", "application/json")
    req.Header.Set("Accept-Language", "en_US")
    req.Header.Set("Authorization", fmt.Sprintf("Basic %s:%s", PayPalTestClientID, PayPalTestSecret))

    client := &http.Client{}
    resp, err := client.Do(req)

    if err != nil {
        log.Fatal(err)
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        log.Fatal(err)
    }

    var v interface{}
    err = json.Unmarshal(body, &v);

    if err != nil {
        log.Fatal(err)
    }

    log.Print(v)
}

клиент / секрет были запутаны, поэтому они выиграли ' т работает как написано выше. Но используя реальные кредиты, я получаю:

2020/01/31 16:05:07 map [error: invalid_client error_description: Ошибка аутентификации клиента]

Реальные кредиты работать с командой curl tho.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Примечание: предоставленные учетные данные действительны? Потому что я получаю sonorus 401, Authentication Failed.

ПРИМЕЧАНИЕ : Используя -d в cURL, вы собираетесь отправить POST запрос вместо GET. Благодаря такому поведению вы, вероятно, захотите отправить POST запрос вместо GET

. Вы можете использовать мою маленькую библиотеку http: https://github.com/alessiosavi/Requests/

package main

import requests "github.com/alessiosavi/Requests"

func main() {
    req, err := requests.InitRequest("https://postman-echo.com/basic-auth", "GET", []byte{}, false, false)
    if err != nil {
        fmt.Println("ERROR! ", err)
    }
    req.CreateHeaderList("Accept", "application/json", "Accept-Language", "en_US", "Authorization", "postman:password")
    client := &http.Client{}
    resp := req.ExecuteRequest(client)
    fmt.Println(resp.Dump())
}

Вы можете изменить данные (URL, данные публикации, заголовки) на те, которые вам нужны для аутентификации в сервисе.

В вашем случае будет что-то вроде этого:

package main

import requests "github.com/alessiosavi/Requests"

const (
    ID= "Aeit5RskDRN8eUUMB0Ud3RjA_z6feWMUHktwlJZMeQMo9A9ulbKK"
    SECRET= "EAAqyzrOTUWf-OFJCB4BxgXT4xuravL7pnkC8Tn20HYtZExd1mFO"
)

func main() {
    req, err := requests.InitRequest("https://api.sandbox.paypal.com/v1/oauth2/token", "GET", []byte{"grant_type=client_credentials"}, false, false)
    if err != nil {
        fmt.Println("ERROR! ", err)
    }
    req.CreateHeaderList("Accept", "application/json", "Accept-Language", "en_US", "Authorization", ID+":"+SECRET)
    client := &http.Client{}
    resp := req.ExecuteRequest(client)
    fmt.Println(resp.Dump())
}
0 голосов
/ 01 февраля 2020
  1. curl - это tra sh для использования -d для параметров запроса, а не только для тела запроса POST. (и неявно преобразовывать запрос в запрос POST?)
  2. PayPal - это tra sh для запроса POST вместо запроса GET.

Это сработало:

package main

import (
    "encoding/base64"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

const (
    PayPalTestClientID = "<your data here>"
    PayPalTestSecret   = "<your data here>"
)

func main() {


    req, err := http.NewRequest("POST", "https://api.sandbox.paypal.com/v1/oauth2/token?grant_type=client_credentials", nil)

    if err != nil {
        log.Fatal(err)
    }


    basicHeader := fmt.Sprintf("%s:%s", PayPalTestClientID, PayPalTestSecret)
    encodedBasicHeader := base64.StdEncoding.EncodeToString([]byte(basicHeader))


    req.Header.Set("Accept", "application/json")
    req.Header.Set("Accept-Language", "en_US")
    req.Header.Set("Authorization", fmt.Sprintf("Basic %s", encodedBasicHeader))


    client := &http.Client{}
    resp, err := client.Do(req)

    if err != nil {
        log.Fatal(err)
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        log.Fatal(err)
    }

    var v interface{}
    err = json.Unmarshal(body, &v);

    if err != nil {
        log.Fatal(err)
    }

    log.Print(v)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...