1

我在使用请求时遇到问题

我正在测试的 API 指示要在消息正文中发布的参数 device_info。它还说 device_info 作为表单字段。在请求的所有文档中,我找不到如何向参数添加“名称”,而不是用它在 json 中的值拍打名称。这是我尝试过的。

import requests
import json

loginPayload = {'device_info':{'app-id':'fc','os-type':'ios'}}
loginHeaders = {'content-type': 'application/json','Authorization':'Basic base64here'}
loginUrl = "http://subdomain.test.com/endpoint/method"
loginPost = requests.post(loginUrl, params=json.dumps(loginPayload), headers=loginHeaders)

print loginPost.text

我试过换成params=data=但我没有运气。

我得到的回复是:

{
"response": {
"message": "Parameter 'device_info' has invalid value ()", 
"code": 400, 
"id": "8c4c51e4-9db6-4128-ad1c-31f870654374"
  }
}

编辑:

去新的地方!我没有修改我的代码如下所示:

import requests

login = 'test'
password = 'testtest'
url = "http://subdomain.domain.com/endpoint/method"

authentication = (login,password)
payload = {'device_info': {'device_id': 'id01'}}
request = requests.post(url, data=payload, auth=authentication)

print request.text

产生:

{
  "response": {
    "message": "Parameter 'device_info' has invalid value (device_id)", 
    "code": 400, 
    "id": "e2f3c679-5fca-4126-8584-0a0eb64f0db7"
  }
}

似乎是什么问题?我没有按要求的格式提交吗?

编辑:解决方案是将我的参数更改为:

{
    "device_info": "{\"app-id\":\"fc\",\"os-type\":\"ios\",\"device_id\":\"myDeviceID1\"}"
}
4

1 回答 1

2

所以这里有几个问题:

  • 您没有说您发布到的网站需要 JSON 数据,实际上在您的评论中您说“所需的编码是 'application/x-www-form-urlencoded'。
  • params指查询字符串的参数。你需要的是data参数。

因此,如果您的应用程序正在寻找“application/x-www-form-urlencoded”数据,您不应该:

  • 设置Content-Type标题
  • json.dumps在您的有效负载数据上使用

你应该做的是:

import requests

login_payload = {'device_info': {'app-id': 'fc', 'os-type': 'os'}}
authentication = (login, password)  # Anyone who sees your authorization will be able to get this anyway
url = 'http://example.com/login'
response = requests.post(url, data=login_payload, auth=authentication)

我不知道采用 x-www-form-urlencoded 数据的 RESTful API,但您也可能错误地描述了您的问题。你没有给我们太多的继续,你没有给我更多的猜测能力。因此,根据您所说的其他一切,这是我绝对最好的猜测。

于 2013-05-07T02:50:15.927 回答