web-dev-qa-db-fra.com

Définir le port dans les demandes

J'essaie d'utiliser l'API de cgminer en utilisant Python. Je suis particulièrement intéressé par l'utilisation de la bibliothèque requests.

Je comprends comment faire les choses de base dans requests, mais cgminer veut être un peu plus précis. J'aimerais rétrécir

import socket
import json

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

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

en utilisant requests à la place.

Comment spécifier le port en utilisant cette bibliothèque, et comment envoyer une telle requête json et attendre qu'une réponse soit stockée dans une variable?

14
2mac

Request est une bibliothèque HTTP.

Vous pouvez spécifier le port dans l'URL http://example.com:4028/ ....

Mais, d'après ce que je peux lire à la hâte icicgminer fournit une RPC API (ou JSON RPC ?) pas ni HTTP l'interface.

13
Sylvain Leroux

En tant que quelqu'un qui a appris certains des pièges courants du python mise en réseau à la dure, j'ajoute cette réponse pour souligner un point important mais facile à gâcher à propos du - 1er argument de requests.get():

localhost est un alias que votre ordinateur résout en 127.0.0.1, l'adresse IP de son propre adaptateur de bouclage. foo.com est également un alias, juste un qui est résolu plus loin de l'hôte.

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

& pour les bouclages:

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

celui-ci nécessite import socket & vous donne l'adresse IP locale de votre hôte (aka, votre adresse dans votre propre LAN); cela va un peu plus loin de l'hôte que d'appeler simplement localhost, mais pas tout le chemin vers l'open-internet:

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

Vous pouvez spécifier le port de la demande avec deux points comme vous le feriez dans un navigateur, tel que r = requests.get('http://localhost:4028'). Cela se bloquera jusqu'à ce qu'une réponse soit reçue, ou jusqu'à ce que la demande expire, vous n'avez donc pas à vous soucier d'attendre une réponse.

Vous pouvez envoyer des données JSON en tant que demande POST en utilisant la méthode requests.post Avec le paramètre data , comme

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

L'accès à la réponse est alors possible avec r.text Ou r.json().

Notez que les demandes sont une bibliothèque HTTP - si ce n'est pas HTTP que vous voulez, je ne pense pas qu'il soit possible d'utiliser des demandes.

2
Kkelk