是否可以使用Python的Requests库构建URL?
支持构建查询字符串但是如何构建URL的其余部分.具体来说,我有兴趣使用URL编码的字符串添加到基本URL:
http:// some address.com/api/[term]/
term ='这是一个测试'
http:// some address.com/api/This+is+a+test/
这可能是使用urllib可能的,但似乎在请求中会更好.这个功能是否存在?如果没有,是不是有充分理由不应该?
我有一个表单数据以及要在同一个POST中发送的文件.例如,{duration:2000,file:test.wav}.我在使用python请求的multipart/form-data发布中看到了很多线程.它们很有用,特别是这个.
我的样例请求如下:
files = {'file': ('wavfile', open(filename, 'rb'))}
data = {'duration': duration}
headers = {'content-type': 'multipart/form-data'}
r = self.session.post(url, files=files, data=data, headers=headers)
Run Code Online (Sandbox Code Playgroud)
但是当我执行上面的代码时,我收到此错误:
5:59:55.338 Dbg 09900 [DEBUG]解析来自handler [null]的异常:org.springframework.web.multipart.MultipartException:无法解析multipart servlet请求; 嵌套异常是org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界.
所以我的问题是:1)如何查看发送请求的内容?无法使用wireshark,它不在网络上.2)为什么编码数据中缺少边界?我错过了什么,请指出.
我很好奇data参数和请求中的params参数之间的区别是什么python-requests,以及何时应该使用它们.
一个例子是我有一个dicts数组,users=[{"email_hash": "fh7834uifre8houi3f"}, ... ]我尝试用POST(requests.post())
params = {
"ads_token": blah blah,
"user_id": blah blah,
"users": json.dumps(users) # users=[{"email_hash": "fh7834uifre8houi3f"}, ... ]
"hash_type": "md5"
}
Run Code Online (Sandbox Code Playgroud)
因为users是几百长,所以得到的字符串json.dumps(users)(以及URL本身也是如此)很长,我得到了错误{'status_code': 414, 'reason': 'Request-URI Too Large'}.这是一个案例,data还是应该遵循一些其他途径?谢谢!
我希望能够输入服务器响应代码并让请求告诉我代码的含义.例如,代码200 - >确定
我找到了源代码的链接,它显示了代码和描述的字典结构.我看到Requests将返回给定描述的响应代码:
print requests.codes.processing # returns 102
print requests.codes.ok # returns 200
print requests.codes.not_found # returns 404
Run Code Online (Sandbox Code Playgroud)
但不是相反:
print requests.codes[200] # returns None
print requests.codes.viewkeys() # returns dict_keys([])
print requests.codes.keys() # returns []
Run Code Online (Sandbox Code Playgroud)
我认为这将是一项例行任务,但似乎无法在在线搜索或文档中找到答案.
我希望能够使用lovoo API,但不知道如何开始.在运行Charles代理并查看流量后,我得出以下结论:
一旦用户通过应用程序(iPhone)登录,就会发送第一个GETto https://api.lovoo.com/oauth/requestToken?:
GET /oauth/requestToken? HTTP/1.1
Host api.lovoo.com
User-Agent LOVOO/612 (iPhone; iOS 10.2; Scale/3.00)
kissapi-app-idfv 1EC7A8E5-DF16-4E14-8EC9-98DD4772F903
tz Europe/xxx
kissapi-device-model iPhone 6s Plus
kissapi-app-version 3.17.0
kissapi-new-oauth 1
kissapi-device iphone
kissapi-app lovoo
wifi true
kissapi-adv-id 00000000-0000-0000-0000-000000000000
Connection keep-alive
kissapi-app-id 7F947A460DAFCA88556B2F35A6D78A3E
Authorization OAuth oauth_callback="oob", oauth_consumer_key="an.email%40gmail.com", oauth_nonce="A32CCA91-FB7A-4AA3-8314-0A9A6E67045E", oauth_signature="Sq8KTg%2FhVIGBaWgWXprPluczOs4%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1487017515", oauth_version="1.0"
Accept-Language en-CH;q=1, de-CH;q=0.9
kissapi-adv-on false
kissapi-version 1.20.0
kissapi-update-user-hash 6ea2bd15ea41d0dc8c2615589e2d52ec
Accept */*
kissapi-device-os 10.2
Accept-Encoding gzip, deflate
kissapi-sync-enabled 1
Run Code Online (Sandbox Code Playgroud)
这也给出了以下标记: oauth_token=44d83e8ef50f&oauth_token_secret=37998f6c6ef2e618
这是跟其他GET到https://api.lovoo.com/oauth/accessToken?:
GET /oauth/accessToken? HTTP/1.1
Host …Run Code Online (Sandbox Code Playgroud) 我找到了几个关于这个问题的网页,但没有一个解决了我的问题.
即使我做了:
pip show
Run Code Online (Sandbox Code Playgroud)
我明白了:
/usr/local/lib/python2.7/dist-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.9.1) or chardet (2.3.0) doesn't match a supported version!
RequestsDependencyWarning)
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
load_entry_point('pip==1.5.6', 'console_scripts', 'pip')()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 480, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2691, in load_entry_point
return ep.load()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2322, in load
return self.resolve()
File "/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2328, in resolve
module = __import__(self.module_name, fromlist=['__name__'], level=0)
File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 74, in <module>
from pip.vcs import git, mercurial, subversion, …Run Code Online (Sandbox Code Playgroud) 我正在使用请求库来查询Diffbot API以从网页URL获取文章的内容.当我访问我在浏览器中创建的请求URL时,它返回一个带有Unicode文本的JSON对象(对吗?)(例如我稍微缩短了文本):
{"icon":"http://mexico.cnn.com/images/ico_mobile.jpg","text":"CIUDADDEMÉXICO(CNNMéxico)\ u2014 Kassandra Guazo Cano tiene32años,pero estedomingopastópriprimera vez enunaelección.\n \"没有habíasacadomi(credencial del)IFE(Instituto Federal Electoral)porque al hacereltrámitehairmucha mofa cuando ven que tu nombre no conide con tu y otros documentos de acuerdo con su nueva identidad. nSánchez骰子阙洛杉矶solicitantes没有儿子discriminados,佩罗拉experiencia德Kassanda ES diferente:\"干草阙丹戎巴葛未licenciado,DOS peritos(恩特雷里奥斯埃勒斯未endocrinólogo)Además,EL juez格言sentencia第下午坎比奥德农布雷Ÿ州市没有上课有利tienes阙esperar OTROS夸A号段御宇一个demandar人registro民事\ "\南特ESTAsituación,报理事会全国第PrevenirŸEliminar LA sculina,洛杉矶transgéneroVOTAN - 墨西哥:博托2012 - 全国", "URL":"HTTP:/ /mexico.cnn.com/nacional/2012/07/02/con-apariencia-de-mujer-e-identidad-masculina-los-transexuales-votan ", "的xpath": "/ HTML [1]/BODY [1]/SECTION [5]/DIV [1]/ARTICLE [1]/DIV [1]/DIV [6]"}
当我使用python请求库时,如下所示:
def get_article(self, params={}):
api_endpoint = 'http://www.diffbot.com/api/article'
params.update({
'token': self.dev_token,
'format': self.output_format,
})
req = requests.get(api_endpoint, params=params)
return …Run Code Online (Sandbox Code Playgroud) Python请求是一个很好的模块,可以简化我的Web REST API访问编程,我通常会在下面做
import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
r = requests.post(url, data=json.dumps(payload), headers=headers)
Run Code Online (Sandbox Code Playgroud)
当出现错误时,我想看看它背后发生了什么.构造curl命令以在命令行中重现是常见的方法,因为这是RESP API文档中最常描述的标准方法
try:
r = requests.post(url, data=json.dumps(payload), headers=headers)
except Exception as ex:
print "try to use curl command below to reproduce"
print curl_request(url,"POST",headers,payload)
Run Code Online (Sandbox Code Playgroud)
我可以curl为这个请求生成命令示例,在libcloud的调试中看到很好的例子,我找不到一个简单的构造方法,下面是我想要自己创建的方法.
# below code is just pseudo code, not correct
def curl_request(url,method,headers,payloads):
# construct curl sample from requests' structure
# $ curl -v -H "Accept: application/json" -H …Run Code Online (Sandbox Code Playgroud) 我试图使用python中的请求模块复制以下POST请求:
POST /example/asdfas HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------241652170216373
Content-Length: 279
-----------------------------241652170216373
Content-Disposition: form-data; name="value_1"
12345
-----------------------------241652170216373
Content-Disposition: form-data; name="value_2"
67890
-----------------------------241652170216373--
Run Code Online (Sandbox Code Playgroud)
请求文档建议应使用files参数.
当我尝试以下呼叫时:
import requests
requests.post('http://example.com/example/asdfas', files={'value_1': '12345',
'value_2': '67890'})
Run Code Online (Sandbox Code Playgroud)
我收到以下HTTP请求:
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, compress',
'Content-Length': '264',
'User-Agent': 'python-requests/2.2.1 CPython/3.3.2 Windows/7',
'Content-Type': 'multipart/form-data; boundary=273f13699c02429db4eb95c97f757d38'
--273f13699c02429db4eb95c97f757d38
Content-Disposition: form-data; name="value_1"; filename="value_1"
12345
--273f13699c02429db4eb95c97f757d38
Content-Disposition: form-data; name="value_2"; filename="value_2"
67890
--273f13699c02429db4eb95c97f757d38--
Run Code Online (Sandbox Code Playgroud)
我也试过使用data参数: …
我正在开发一个涉及连接到远程服务器,等待响应,然后根据该响应执行操作的项目.我们捕获了几个不同的异常,并且根据捕获的异常而表现不同.例如:
def myMethod(address, timeout=20):
try:
response = requests.head(address, timeout=timeout)
except requests.exceptions.Timeout:
# do something special
except requests.exceptions.ConnectionError:
# do something special
except requests.exceptions.HTTPError:
# do something special
else:
if response.status_code != requests.codes.ok:
# do something special
return successfulConnection.SUCCESS
Run Code Online (Sandbox Code Playgroud)
为了测试这个,我们编写了如下测试
class TestMyMethod(unittest.TestCase):
def test_good_connection(self):
config = {
'head.return_value': type('MockResponse', (), {'status_code': requests.codes.ok}),
'codes.ok': requests.codes.ok
}
with mock.patch('path.to.my.package.requests', **config):
self.assertEqual(
mypackage.myMethod('some_address',
mypackage.successfulConnection.SUCCESS
)
def test_bad_connection(self):
config = {
'head.side_effect': requests.exceptions.ConnectionError,
'requests.exceptions.ConnectionError': requests.exceptions.ConnectionError
}
with mock.patch('path.to.my.package.requests', **config):
self.assertEqual(
mypackage.myMethod('some_address',
mypackage.successfulConnection.FAILURE
)
Run Code Online (Sandbox Code Playgroud)
如果我直接运行该函数,一切都按预期发生.我甚raise …
python exception-handling python-mock python-3.3 python-requests
python-requests ×10
python ×8
http ×2
chardet ×1
oauth ×1
pip ×1
python-3.3 ×1
python-3.x ×1
python-mock ×1
unicode ×1
urllib3 ×1