如何使用 Requests 模块 POST API Python 3 中的代码?不断收到 405 错误

How to POST this API code in Python 3 with Requests module? Keep getting 405 error

我想将 API 用于 link 缩短网站。我知道给出的示例在 curl-H 表示有一个 header 以及 PUT 表示它正在发布,但我不能无论我尝试多少,似乎都能得到我想要的结果。我所能做的就是得到一个 405 错误或者中断它。

我在 Windows 上 Python 3 并且已经安装了 requests

For developers Shorte.st prepared API which returns responses in JSON format.

Currently there is one method which can be used to shorten links on behalf of your account.

Take a look on the sample below to learn how to use our API.

curl -H "public-api-token: (my token)" -X PUT -d
"urlToShorten=google.com" https://api.shorte.st/v1/data/url 

When received,

{"status":"ok","shortenedUrl":"http:\/\/sh.st\/XXXX"}

我尝试了一些东西,

import requests
import json
gogo = { 'public-api-token: (my token)' : 'urlToShorten=google.com'}
yep = requests.post('https://api.shorte.st/v1/data/url',   
data=json.dumps(gogo))
print (yep.text)

向我展示了一个 HTML 错误 405 的网页。

import requests
import json
gogo = { 'public-api-token' : '(my token)', 'urlToShorten=' : 'google.com'}
yep = requests.post('https://api.shorte.st/v1/data/url',    
data=json.dumps(gogo))
print (yep.text)

还显示了一个错误 405 的网页。

我现在知道 -H 是给 header 的,我在使用它的同时仍然只是让我获取页面。

import requests
import json

headers = { 'public-api-token' : '(my token)' }
gogo = {"urlToShorten" : "google.com"}
yep = requests.post('https://api.shorte.st/v1/data/url',  
data=json.dumps(gogo), headers=headers)
print (yep.text)

又一次尝试 405

gogo = {"public-api-token: (my token)" : "urlToShorten=google.com"}
yep = requests.post('https://api.shorte.st/v1/data/url', 
data=json.dumps(gogo))
print (yep.text)

如果我去掉文字,即使这样也只是给我一个完整的 html page/405。

headers = { "public-api-token: (my token)" : "urlToShorten=google.com" }
yep = requests.post('https://api.shorte.st/v1/data/url', headers=headers)
print (yep.text)

您正在将 PUT 负载放入 header。将它放在 body 中。您的负载 不是 JSON,因此没有必要尝试这样对待它。

需要将header指定为字典,其中header名称和令牌作为键和值。有效载荷的参数可以用同样的方式处理。

你也用错了requests方法;要发送 PUT 请求,请改用 put function

headers = {'public-api-token': '(my token)'}
payload = {'urlToShorten': 'google.com'}
response = requests.put(
    'https://api.shorte.st/v1/data/url',
    data=payload, headers=headers)

print(response.json())

response object 有一个 json() method 来解码 API 返回的 JSON 数据;它将为您提供对应于 JSON 文本的 Python 数据结构。

我没有您正在使用的服务的令牌;我使用 httpbin.org service 创建了一个演示;它反映了作为 JSON 响应发送的内容:

>>> import requests
>>> headers = {'public-api-token': '(my token)'}
>>> payload = {'urlToShorten': 'google.com'}
>>> response = requests.put(
...     'http://httpbin.org/put',
...         data=payload, headers=headers)
>>> from pprint import pprint
>>> pprint(response.json())
{u'args': {},
 u'data': u'',
 u'files': {},
 u'form': {u'urlToShorten': u'google.com'},
 u'headers': {u'Accept': u'*/*',
              u'Accept-Encoding': u'gzip, deflate',
              u'Content-Length': u'23',
              u'Content-Type': u'application/x-www-form-urlencoded',
              u'Host': u'httpbin.org',
              u'Public-Api-Token': u'(my token)',
              u'User-Agent': u'python-requests/2.5.0 CPython/2.7.9 Darwin/14.1.0'},
 u'json': None,
 u'origin': u'94.118.96.0',
 u'url': u'http://httpbin.org/put'}

如果将其与 curl 向同一个 URL 发送 PUT 请求所产生的输出进行比较,您会看到产生了相同的结果:

$ curl -H "public-api-token: (my token)" -X PUT \
     -d "urlToShorten=google.com" http://httpbin.org/put
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "urlToShorten": "google.com"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "Public-Api-Token": "(my token)", 
    "User-Agent": "curl/7.37.1"
  }, 
  "json": null, 
  "origin": "94.118.96.0", 
  "url": "http://httpbin.org/put"
}