網頁

2015年3月22日 星期日

Python Http Request 自訂範例

last update:2015/05/20

因為一些因素,又回來寫了一些 Python
Python 3 和 Python 2 就如同大家所知的是完全兩回事
只是這次有必要寫出一段可以相容的程式碼,所以在這部分花了一點工
查詢過很多範例,撰寫 Python 大多會推薦使用 Library

大概是因為我不是 Pythoner ,還是不喜歡完全使用無法控制的東西
所以下面就是用爛透的 Python 的原生 HTTP API 做的示範
純紀錄,沒有技術難度就是

try:
    import urllib.parse as urllib_parse
    import urllib.request as urllib_request
    import urllib.error as urllib_error
    import http.client as http_client
except ImportError:
    import urllib as urllib_parse
    import urllib2 as urllib_request
    import urllib2 as urllib_error
    import httplib as http_client

import json


# public objects
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36'}
demoUrl = "https://xxxx/xxxx/xxx"
API_HOST = "api.xxx.com";

def sendGetReq(url, params={}, urlHost=API_HOST, headers=headers):
    url_params = urllib_parse.urlencode(params, True)
    # establish connection with the webpage
    h = http_client.HTTPConnection(urlHost)
    h.request('GET', url+"?"+url_params, url_params, headers)
    response = h.getresponse()
    the_page = response.read().decode('utf8')
    h.close()
    return the_page

def sendPostReq(url, params, headers=headers):
    data  = urllib_parse.urlencode(params, True)
    data = data.encode('utf-8')
    req = urllib_request.Request(url, data, headers)
    try:
        response = urllib_request.urlopen(req)
        the_page = response.read().decode('utf8')
        return the_page
    except urllib_error as e:
        print(e)



# Get method demo
data= sendGetReq(demoFormUrl)
j = json.loads(data)
print(j['0'])


# Post method demo
field1 = "a"
field2 = "b"
values = {
          field1 : "Python test",
          field2 : "Test"
          }
res = sendPostReq(demoUrl , values)
print(res)


當有相容性需求時,就能體會 Python 原生API的爛
要用其他 HTTP method,如DELETE、AUTH 可以參考撰寫GET的那段
h.request('想使用的HTTP Method', url+"?"+url_params, url_params, headers)
只是這個方式需要加上url host資訊,這點需要注意

另外如果有需要將參數以陣列方式送出,例如表單送出多選選項的值,以下面方式建立
params = {'where': ['a=1', 'b=0']}

經過 urlencode後就能送出 where=a%3D1&where=b%3D0 這樣的字串了

沒有留言:

張貼留言