Trying to get json data from API, got TypeError

时间:2018-06-04 16:37:54

标签: python json api

TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.

import json
import urllib.request as req
from urllib.parse import urlencode

url = "https://apiurl.example/search/"

payload = {"SearchString":"mysearch"}

response = req.urlopen(url, urlencode(payload))
data = response.read()

print(data.decode("utf-8"))

What am I doing wrong? There is nothing wrong with the url or "payload" as i tried it in the API's online interface. Before I added the urlencode and utf-8 decode I got an error saying: "TypeError: can't concat str to bytes". At some point it returned an empty list, but don't remember what I did then. Anyway it should return some data as mentioned. Thanks for your time.

2 个答案:

答案 0 :(得分:0)

I've never used requests that way. Here's an example of how I've done it, checking the result code and decoding the JSON if it was successful:

import json
import requests

action_url = "https://apiurl.example/search/"

# Prepare the headers
header_dict = {}
header_dict['Content-Type'] = 'application/json'

# make the URL request
result = requests.get(action_url, headers=header_dict)

status_code = result.status_code
if (status_code == requests.codes.ok):
    records = json.loads(result.content)
    print 'Success. Records:'
    print records
else:
    print 'ERROR. Status: {0}'.format(status_code)
    print 'headers: {0}'.format(header_dict)
    print 'action_url: {0}'.format(action_url)

    # Show the error messages.
    print result.text

答案 1 :(得分:0)

我现在发现了。

In [75]: def chunk_array(arr, ch):
    ...:     x = arr.shape[0]
    ...:     return [np.concatenate(subs) for subs in np.split(arr, np.arange(ch, x, ch))]