2009-12-19 12 views
2

en utilisant le code suivant pour accéder à une URL avec un message.python - urrlib2 demande site https - obtenant l'erreur 400

je peux l'obtenir en utilisant wget et les éléments suivants: wget --post-data 'p_calling_proc = bwckschd.p_disp_dyn_sched & p_term = 201010' https://spectrumssb2.memphis.edu/pls/PROD/bwckgens.p_proc_term_date

pour une raison quelconque, je vais avoir un problème avec mon python texte dans la mesure où je reçois un code d'erreur de 400. (et bien sûr le navigateur fonctionne comme prévu)

toute pensée/commentaires/etc ...

le test python que j'ai:

// ==========================================

import urllib 
import urllib2 
import sys, string 
import time 
import mechanize 

Request = urllib2.Request 
urlopen = urllib2.urlopen 

headers ={'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'} 
query = "p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010" 
url1="https://spectrumssb2.memphis.edu/pls/PROD/bwckgens.p_proc_term_date" 

req = Request(url1, query, headers) 

test1=0 
test=0 
while test==0: 
    print "aaaaattttt \n" 
    try: 
    res = urlopen(req) 
    #req = Request(url1, query, headers) 
    print "aaaappppp \n" 
    #urllib2.URLError, (e) 
    #print e 
    except urllib2.HTTPError, e: 
    print "ffff1111 "+str(e.code)+"\n" 
    if e.code: 
     test1=1 
     print "error ..sleep \n" 
     time.sleep(1) 
    else: 
     test1=0 
    except urllib2.URLError, e: 
    print e.reason 
    #print "ffff3333 "+e.code+"\n" 
    if e.reason: 
     test1=1 
     print "error ..sleep \n" 
     time.sleep(1) 
    else: 
     test1=0 
    #print "ddd "+e.code +"\n" 
    #print e 
    if test1==0: 
    test=1 

print "test1 = "+str(test1)+"\n" 
#res = urlopen(req) 
print "gggg 000000000000\n" 
s = res.read() 

.


des pensées/commentaires seraient appréciés ..

grâce

Répondre

1

Essayez de ne pas coder la chaîne de requête. Les & et = dans les données POST n'ont pas besoin d'être urlencoded. Si l'application Web de l'extrémité distante n'attend pas l'encodage% xx dans la chaîne de requête, elle ne pourra pas l'analyser.

Voici les têtes de requête HTTP papillotes:

POST/HTTP/1.1 
User-Agent: curl/7.19.4 (universal-apple-darwin10.0) libcurl/7.19.4 OpenSSL/0.9.8k zlib/1.2.3 
Host: 127.0.0.1 
Accept: */* 
Content-Length: 188 
Expect: 100-continue 

bwckschd.p_disp_dyn_sched&p_term=201010 

Et voici les en-têtes de requête HTTP à partir de votre python:

POST/HTTP/1.1 
Accept-Encoding: identity 
Content-Length: 60 
Host: 127.0.0.1 
Content-Type: application/x-www-form-urlencoded 
Connection: close 
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT) 

p_calling_proc%3Dbwckschd.p_disp_dyn_sched%26p_term%3D201010 
+0

Il est simplement faux que "les données POST n'ont pas besoin d'être encodées car elles sont placées dans le corps de la requête HTTP". Le type de contenu des données de formulaire POSTed est 'application/x-www-form-urlencoded'. –

+0

@Jonathan - c'est plutôt clair, hein? Merci, j'ai édité le post pour clarifier l'urlencoding, je pensais certainement tortueux. –

+0

C'est bettah! Downvote annulé. :) –

0

Je pense que votre chaîne de requête n'est pas tout à fait raison. Essayez d'utiliser la méthode urllib.urlencode() pour générer la requête, à la

urllib.urlencode([ ('param1', value1), ('param2',value2) ]) 
+0

la requête que je fourni "est" la requête urlencoded .. initial requête est: requête === p_calling_proc = bwckschd.p_disp_dyn_sched & p_term = 201010 >>> p_calling_proc% 3Dbwckschd.p_disp_dyn_sched% 26p_term% 3D201010 –

+0

salut jon ... merci pour le commentaire !!! après réflexion .. j'ai essayé d'utiliser la requête non codée .. il semble fonctionner! merci –