سؤال

أحاول نشر نموذج متعدد الأجزاء باستخدام HTTPLIB، يتم استضافة URL على محرك Google App، على منشور يقول الطريقة غير المسموح بها، على الرغم من أن المنشور باستخدام Urllib2 يعمل. مثال العمل الكامل مرفقة.

سؤالي هو ما هو الفرق بين اثنين، لماذا يعمل المرء ولكن ليس الآخر

  1. هل هناك مشكلة في رمز بريد Mulipart الخاص بي؟

  2. أو المشكلة هي مع محرك تطبيق Google؟

  3. أو أي شيء آخر ؟


import httplib
import urllib2, urllib

# multipart form post using httplib fails, saying
# 405, 'Method Not Allowed'
url = "http://mockpublish.appspot.com/publish/api/revision_screen_create"
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url)
print host, selector
h = httplib.HTTP(host)

h.putrequest('POST', selector)

BOUNDARY = '----------THE_FORM_BOUNDARY'
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
h.putheader('content-type', content_type)
h.putheader('User-Agent', 'Python-urllib/2.5,gzip(gfe)')
content = ""
L = []
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="test"')
L.append('')
L.append("xxx")
L.append('--' + BOUNDARY + '--')
L.append('')
content = '\r\n'.join(L)
h.putheader('content-length', str(len(content)))
h.endheaders()
h.send(content)

print h.getreply()

# post using urllib2 works
data = urllib.urlencode({'test':'xxx'})
request = urllib2.Request(url)
f = urllib2.urlopen(request, data)
output = f.read()
print output

تحرير: بعد تغيير putrequest لطلب (على اقتراح نيك جونسون)، فإنه يعمل

url = "http://mockpublish.appspot.com/publish/api/revision_screen_create"
_, host, selector, _, _ = urllib2.urlparse.urlsplit(url)

h = httplib.HTTPConnection(host)

BOUNDARY = '----------THE_FORM_BOUNDARY'
content_type = 'multipart/form-data; boundary=%s' % BOUNDARY

content = ""
L = []
L.append('--' + BOUNDARY)
L.append('Content-Disposition: form-data; name="test"')
L.append('')
L.append("xxx")
L.append('--' + BOUNDARY + '--')
L.append('')
content = '\r\n'.join(L)
h.request('POST', selector, content,{'content-type':content_type})
res = h.getresponse()
print res.status, res.reason, res.read()

حتى الآن يبقى السؤال ما هو الفرق بين نهجين ويمكن أولا أن يتم أولا للعمل؟

هل كانت مفيدة؟

المحلول

نيك جونسون إجابه

هل حاولت إرسال الطلب باستخدام httpleib باستخدام .REQUEST () بدلا من .PTREQUEST () إلخ، تزويد الرؤوس كإخبز؟

إنها تعمل!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top