2014-08-30 4 views
9

Sto tentando di utilizzare l'API cgminer utilizzando Python. Sono particolarmente interessato a utilizzare la libreria requests.Impostare la porta nelle richieste

Capisco come fare le cose di base in requests, ma cgminer vuole essere un po 'più specifico. Mi piacerebbe ridursi

import socket 
import json 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect(('localhost', 4028)) 

sock.send(json.dumps({'command': 'summary'})) 

utilizzando requests invece.

Come si specifica la porta che utilizza quella libreria e come si invia una tale richiesta json e si attende una risposta da memorizzare in una variabile?

+0

Non sono sicuro di capire. Ecco perché inserisco un commento: [Richiesta] (http://docs.python-requests.org/en/latest/) è una libreria HTTP. Puoi specificare la porta nell'URL 'http: //example.com: 4028/...'. Da quello che posso leggere in fretta [qui] (https: // github.com/ckolivas/cgminer/blob/master/README API) 'cgminer' fornisce un'API RPC. Ma fornisce un'interfaccia HTTP? –

+0

Forse è questo il problema. Grazie per l'aiuto. – 2mac

+0

Ho ripubblicato come risposta, come sembra confermare ciò che ho supposto. –

risposta

0

È possibile specificare la porta per la richiesta con due punti come nel browser, ad esempio r = requests.get('http://localhost:4028'). Questo bloccherà fino a quando non verrà ricevuta una risposta, o fino a quando la richiesta non scade, quindi non dovrai preoccuparti di attendere una risposta.

È possibile inviare dati JSON come una richiesta POST utilizzando il requests.post method with the data parameter, come ad esempio

import json, requests 
payload = {'command': 'summary'} 
r = requests.post('http://localhost:4028', data=json.dumps(payload)) 

Accesso alla risposta è quindi possibile con r.text o r.json().

Si noti che le richieste sono una libreria HTTP - se non è HTTP che si desidera, allora non credo sia possibile utilizzare le richieste.

3

Come qualcuno che ha imparato alcuni dei problemi comuni del pitone di rete nel modo più difficile, sto aggiungendo questa risposta per sottolineare un importante-but-facile-mess-up punto circa l'primo ARG di requests.get() :

localhost è un alias che il computer risolve a 127.0.0.1, l'indirizzo IP della propria scheda loopback. foo.com è anche un alias, solo uno che viene risolto più lontano dall'host.

requests.get('foo.com:4028')    #<--fails 
requests.get('http://foo.com:4028')   #<--works usually 
requests.get('http:///www.foo.com:4028') #<--works almost always 

& per loopback:

requests.get('http://127.0.0.1:4028')  #<--works 
requests.get('http://localhost:4028')  #<--works 

questo richiede import socket & ti dà la IP locale del proprio host (aka, il tuo indirizzo all'interno della propria LAN); va un po 'più lontano dall'host non solo chiamare localhost, ma non tutti la via d'uscita per l'open-internet:

requests.get('http://{}:4028'.format(socket.gethostbyname(socket.gethostname()))) #<--works 
+1

'172.0.0.1' non è corretto per' localhost'. È '127.0.0.1'. Typo, o è questo il motivo per cui sta fallendo? – 2mac