2017-10-17 10 views
0

Description du problème
Je veux envoyer une demande de poste http à un BLAST website en ligne .Je inspecta les requêtes POST et a vu ceci:Python données de formulaire http format post demande

Request URL:https://p3.theseed.org/services/homology_service 
Referrer Policy:no-referrer-when-downgrade 

Request Headers 
Provisional headers are shown 
Accept:application/json 
Content-Type:application/x-www-form-urlencoded 
Origin:https://www.patricbrc.org 
Referer:https://www.patricbrc.org/ 
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 
X-Requested-With:XMLHttpRequest 

Form Data 
{"method":"HomologyService.blast_fasta_to_database","params":[">test 
ATAGCTAACAGCATC","blastn","ref.fna","10",50,0],"version":"1.1","id":"27057295081137034"}: 

Maintenant, je veux faire ceci pour plusieurs séquences (remplaçant ainsi le ATAGCTAACAGCATC). Je connais l'envoi de ce type de demande, mais je ne sais pas maintenant comment:

  • Format du form data, donc je peux l'envoyer à l'aide Requests
  • Ce que je dois faire avec le id dans le poste , parce que je ne le sais pas parce que c'est unique pour chaque travail BLAST.

code

import requests as r 

blast_url = 'https://p3.theseed.org/services/homology_service' 
data = {"method":"HomologyService.blast_fasta_to_database","params":["%3Etest%0ATAGCTAACAGCATC","blastp","ref.faa","10",'50','0'],"version":"1.1"} 
headers = { 
      'Host': 'p3.theseed.org', 
      'Accept': 'application/json', 
      'Accept-Language': 'en-US,en;q=0.5', 
      'Referer': 'https://www.patricbrc.org/app/BLAST', 
      'Content-Type': 'application/rqlquery+x-www-form-urlencoded', 
      'X-Requested-With' : 'XMLHttpRequest' 
     } 

res = r.post(blast_url, headers = headers, params = data).text 
print(res) 

Je n'ai pas rempli dans le id, mais cela ne semble pas être un problème parce que dans le message d'erreur l'identifiant est rempli (il semble donc ? à généré automatiquement) Ceci est l'erreur que je reçois:

{"id":"15004153692662703","error":{"name":"JSONRPCError","code":-32700,"message":"You did not supply any JSON to parse in the POST body."},"version":"1.1"} 

Alors, évidemment, la mauvaise mise en forme pour les données de formulaire donne ces pro blèmes, mais je ne sais pas comment je formater ce (et si cela va résoudre le problème)

Répondre

1

Vous avez une chaîne json malformée comme erreur, de sorte que l'API distante s'attend à ce que les données soient au format json. Vous devez faire

import json 
data = json.dumps(data) 
res = r.post(blast_url, headers = headers, data = data).text 

Et faire le type de contenu de votre tête comme:

headers['Content-Type'] = 'application/json' 
+1

Bien génie qui a fonctionné;) Merci beaucoup – CodeNoob

0

Vous devez modifier cette ligne res = r.post(blast_url, headers = headers, params = data).text-res = r.post(blast_url, headers = headers, data = data).text

Aussi, avant d'utiliser des outils, s'il vous plaît lire la documentation de cet outil , par exemple, dosc pour les requêtes que vous pouvez trouver here

+0

J'ai lu, mais la réponse ne fonctionne pas, cela produira une erreur: { « erreur »: {"name": "JSONRPCError", "message": "Erreur lors de l'analyse de la requête HTTP JSON: chaîne JSON malformée, ni tag, tableau, objet, nombre, chaîne ou atome, au décalage de caractère 0 (avant \" method = HomologyServi. .. \ ") sur /disks/patric-common/runtime/lib/perl5/site_perl/5.20.2/x86_64-linux/Moose/Meta/Method/Delegation.pm ligne 110. \ n", "code": - 32700}, "version": "1.1", "id": "27057295081137034"} – CodeNoob

+0

@CodeNoob, Vérifiez ma réponse, si cela ne fonctionne pas alors laissez-moi savoir que je peux poster une autre solution à ce – MohitC