Я пытаюсь выполнить следующий PHP код в Google App Engine Перейти:PHP против Golang HTTP вызовов получает различные результаты
<?php
function api_query(array $req = array()) {
$key = '90294318da0162b082c3d27126be80c3873955f9';
$req['method'] = 'getinfo';
$req['nonce'] = 1394503747386411;
// generate the POST data string
$post_data = http_build_query($req, '', '&');
$sign = '75da1e3ff750286bf73d03197f1b779fbfff963fd7402941ae326509a6615eacb839b44f236b4d5ee6cff39321e7b35e9563a9a2075e99df0f4ee3b732999348';
// generate the extra headers
$headers = array(
'Sign: '.$sign,
'Key: '.$key,
);
// our curl handle (initialize if required)
static $ch = null;
if (is_null($ch)) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; Cryptsy API PHP client; '.php_uname('s').'; PHP/'.phpversion().')');
}
curl_setopt($ch, CURLOPT_URL, 'https://api.cryptsy.com/api');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
// run the query
$res = curl_exec($ch);
if ($res === false) throw new Exception('Could not get reply: '.curl_error($ch));
$dec = json_decode($res, true);
if (!$dec) throw new Exception('Invalid data received, please make sure connection is working and requested API exists');
echo "<pre>".print_r($dec, true)."</pre>";
return $dec;
}
api_query();
При выполнении кода возвращает массив JSON значений. Я попытался реализации один и тот же код в Golang:
func PrivateCall(c appengine.Context) (map[string]interface{}, error) {
AuthAPI := "https://api.cryptsy.com/api"
APIKey := "90294318da0162b082c3d27126be80c3873955f9"
tr := urlfetch.Transport{Context: c}
values := url.Values{}
values.Set("method", "getinfo")
values.Set("nonce", "1394503747386411")
signature := "75da1e3ff750286bf73d03197f1b779fbfff963fd7402941ae326509a6615eacb839b44f236b4d5ee6cff39321e7b35e9563a9a2075e99df0f4ee3b732999348"
req, err := http.NewRequest("POST", AuthAPI+"?"+values.Encode(), nil)
if err != nil {
c.Infof("API - Call - error 2 - %s", err.Error())
return nil, err
}
req.Header.Set("Key", APIKey)
req.Header.Set("Sign", signature)
c.Infof("req - %v", req)
resp, err := tr.RoundTrip(req)
if err != nil {
c.Errorf("API post error: %s", err)
return nil, err
}
defer resp.Body.Close()
//reading response
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
c.Errorf("API read error: could not read body: %s", err)
return nil, err
}
result := make(map[string]interface{})
//unmarshalling JSON response
err = json.Unmarshal(body, &result)
if err != nil {
c.Infof("Unmarshal: %v", err)
c.Infof("%s", body)
return nil, err
}
return result, nil
}
Я получаю сообщение об ошибке сказав «не удалось авторизовать запрос - Проверьте сообщение данных». Кто-нибудь видит, что могло вызвать эту ошибку? На мой взгляд, возможно, заголовок запроса в Go представляет собой строку [string] [], а в PHP - массив ...
никогда не использовал golang, но сразу же я могу видеть заголовки отличаются от 'Знак: & Key:' –
Пожалуйста 'идти fmt' свой код и укажите значения для переменных, выходящих за рамки. Кроме того, какая часть кода печатает ошибку? – AntoineG
@LozCherone Я думаю, что ':' добавляется, потому что в PHP заголовки представляют собой массив, поэтому, чтобы превратить их в структуру, похожую на карту, вам нужно добавить ':', в то время как в Go они уже являются картой, поэтому они будут правильно напечатаны. – ThePiachu