Can anyone help me with porting some code from PHP to Go?

522 views
Skip to first unread message

ThePiachu

unread,
Mar 11, 2014, 7:41:47 PM3/11/14
to golan...@googlegroups.com
http://stackoverflow.com/q/22315378/953732

I am trying to implement the following PHP code in Google App Engine Go:

    <?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();


When executed, the code returns a JSON array of values. I tried implementing the same code in 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
    }

I am getting an error saying "Unable to Authorize Request - Check Your Post Data". Does anyone see what could've caused this error? At the moment my best guess is that perhaps the request header in Go is a map[string][]string, while in PHP it appears to be an array...

Donovan Hide

unread,
Mar 11, 2014, 7:52:31 PM3/11/14
to ThePiachu, golang-nuts
Looks like you're doing a POST with an empty body, making the assumption that http.NewRequest will put the querystring into the body for you. You need something like:

req, err := http.NewRequest("POST", AuthAPI,strings.NewReader(values.Encode()))

See the source of PostForm for more context:


Hope that helps!



--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Oleku Konko

unread,
Mar 12, 2014, 6:55:11 AM3/12/14
to golan...@googlegroups.com
Updated your question with the answer ....  
Reply all
Reply to author
Forward
0 new messages