2017-07-01 2 views
0

Configuration: Python 2.7.10, Demandes bibliothèque, Windows 8.1JSON-RPC - ne peut pas récupérer correctement la réponse de données POST d'un connecté site avec Python Demandes bibliothèque

Je suis nouveau à JSON-rpc et la nécessité de mettre en place tests d'automatisation pour envoyer des requêtes POST et vérifier la réponse. J'ai des difficultés à accéder aux données après la connexion. Je dois d'abord me connecter au système avec une requête POST ("method": "identity.authenticate"), puis le test après c'est aussi une requête POST qui devrait retourner Les développeurs m'ont également donné un jeton de Porteur pour passer dans les en-têtes qui, selon eux, devraient fonctionner dans tous les tests, et cela a semblé fonctionner quand je l'ai essayé dans Postman (bien que je l'ai fait). avoir des résultats mitigés), mais pour une raison quelconque, lorsque j'essaie de l'utiliser avec ma configuration Python Requests, elle renvoie une erreur à chaque fois. Le code est ci-dessous (il faut changer les données de travail pour les données factices, donc essayer de lancer le code ci-dessous ne fonctionnera pas, mais voir la configuration peut aider à identifier ce que je peux faire mal):

import requests 
from pprint import pprint 

base_url = "https://rpc_url.com/rpc" 
custom_headers = {"Content-Type":"application/json", "Authorization":"Bearer token"} 

'''Sign in payload''' 
signinPayload = {"method" : "identity.authenticate", 
"id" : 1, 
"jsonrpc" : "2.0", 
"params" : {"password" : "password", "username" : "username"}} 

test1_Payload = {"jsonrpc" : "2.0", 
"method" : "fc.pick.getPendingPicks", 
"id" : 20, "params" :{"_tags" :{"device" : "device", 
    "deviceOS" : "deviceOS", "firstName" : "firstName", 
    "devicetype" : "devicetype", "appVersion" : "appVersion", 
    "login" : "username", "devicelabel" : "devicelabel", 
    "lastName" : "lastName"}}} 

with requests.Session() as s: 
    # below passes the login payload, which returns proper data. 
    login_post = s.post(base_url, json=signinPayload, headers=custom_headers).json() 
    pprint(login_post) 
    ########################### 
    # passes the test payload, which doesn't work correctly 
    r = s.post(base_url, json=test1_Payload, headers=custom_headers).json() 
    pprint(r) 

J'ai essayé beaucoup de variations, comme ne pas passer le jeton dans les en-têtes Bearer, ne passant le jeton au porteur et non la charge utile signin, et rien n'a fonctionné jusqu'à présent.

Quand je lance le code ci-dessus avec des données non-fictives, c'est la sortie de la console (avec mes commentaires ajoutés pour plus de clarté):

# Below is returned for sign in authenticate, which appears to be good data 
{u'fcFlingVersion': u'1.0.9', 
    u'id': 1, u'jsonrpc': 
    u'2.0', 
    u'result': { 
     u'_idp': {u'accessToken': 'accessTokenNumber'}, 
     u'administratorId': 1, 
     u'changePassword': False, 
     u'companyId': 1, 
     u'daysUntilPasswordExpires': 100, 
     u'firstname': u'firstName', 
     u'groupList': u'groupList', 
     u'lastname': u'lastName', 
     u'login': u'username', 
     u'passwordDirectory': u'identity', 
     u'photoUrl': u'https://photoURL', 
     u'roles': [], 
     u'userId': 1, 
     u'username': u'username'}} 

# Below is the returned error data for test1_Payload after the successful sign in test from above. 
{u'error': {u'code': 404, u'data': None, u'message': u'module not found'}, 
u'fcFlingVersion': u'1.0.9', 
u'id': 20, 
u'jsonrpc': u'2.0'} 

La question est l'erreur avec la réponse « module introuvable » , où il devrait retourner les données pertinentes pour cette demande. Sur les sites HTTPS non rpc, j'ai utilisé des données POST pour me connecter à un site comme je le fais ci-dessus, puis j'ai parcouru une boucle for d'URL alors que les requêtes GET pour vérifier les données sont retournées correctement dans cette connexion. site, donc je ne sais pas si c'est parce que je dois envoyer des requêtes POST ici pour récupérer les réponses au test. Si quelqu'un a des conseils utiles, je l'apprécierais grandement.

Répondre

0

J'ai finalement découvert que le problème était dû à un changement d'URL récent dans l'API dont je n'avais pas été informé, ce qui explique pourquoi l'URL a initialement fonctionné dans Postman. Pour plus de confusion, l'URL de certaines des méthodes a été modifiée, ce qui explique pourquoi l'ID de connexion identity.authenticate POST a fonctionné, car il utilisait toujours l'URL d'origine. Pour les autres commandes POST, les méthodes/modules n'étaient plus présents avec l'URL d'origine, d'où le message d'erreur "module introuvable". Une fois que j'ai mis à jour la variable base_url avec la nouvelle base_url pour les charges utiles qui recevaient le message d'erreur, elles ont renvoyé les données correctes.

Espérons que cela peut aider les autres, dans le cas où ils rencontrer quelque chose de similaire. En résumé: le code fonctionne bien, ce sont les données qui étaient entrées dans le code qui étaient défectueuses et pourquoi le message d'erreur était reçu. Dans ce cas, les données erronées étaient la variable base_url pointant vers une URL obsolète.