以JSON

时间:2017-05-24 08:11:20

标签: python json python-2.7 http post

正在使用API​​,要求指定一个文件(在我的情况下为Excel)以上传到API。文档指定:JSON Property = file,Data Type = FileUpload。我的问题:什么是FileUpload。我试过简单地指定文件的名称(例如c:\ test \ Data.xls),但显然这不起作用。

我正在使用FastField Mobile Forms的API(www.fastfield.com)。屏幕截图中显示的文档,代码和结果。不知何故,我没有正确地将文件数据发布到API。

API Documentation

所以这是我试图运行的Python代码

import requests
import json
from requests.auth import HTTPBasicAuth
import base64

 # Get session token, this must be specified in header of subsequent request and returns a JSON object ready for insertion into header
rqstResponse = requests.post('https://manage.fastfieldforms.com/api/authenticate', auth=HTTPBasicAuth('***', '***'))
jsonObj = json.loads(rqstResponse.content)
sessionToken = jsonObj['data']['sessionToken']
headers = {'X-Gatekeeper-SessionToken': sessionToken}

# run this code to get listIds - which are hard coded further down
rqstResponse = requests.get("https://manage.fastfieldforms.com/api/globallists", headers=headers)
print (rqstResponse.content)
del rqstResponse

# Read file and convert to binary string
filePath = r"J:\Properties\PropGIS\proj\20150820140457_TelecoMapping\data\Survey_Feb17\FastField_Test01.xlsx"
with open(filePath, 'r') as f:
    filecontents = f.read()
fileDataEncoded = base64.b64encode(filecontents)

# create JSON
payloadDictObj = {}
payloadDictObj['file'] = fileDataEncoded
payloadDictObj['id'] = "03c804cb-b983-4e4c-956b-96ac23da16b2"
#payloadDictObj['listname'] = "Test02"
serializedJsonStr = json.dumps(payloadDictObj)
print serializedJsonStr

# Update Global List
rqstResponse = requests.post("https://manage.fastfieldforms.com/api//globallist", data=serializedJsonStr, headers=headers)
print (rqstResponse.content)
del rqstResponse
# --------------------
# Response
{
  "code": 200,
  "data": {
    "searchResults": [
      {
        "id": 7793,
        "accountId": 43600,
        "name": "Test01",
        "active": true,
        "createdAt": "2017-05-24T06:37:28.49Z",
        "updatedAt": "2017-05-24T06:37:28.49Z",
        "version": 1,
        "listId": "03c804cb-b983-4e4c-956b-96ac23da16b2",
        "path": "{ bucket:'fastfield-globallists', key:'43600/ca4b89df75db4ef8b513d15d59f654d8.csv'}"
      }
    ]
  }
}
{"id": "03c804cb-b983-4e4c-956b-96ac23da16b2", "file": "UEsDB...qaJXQ=="}
{
  "code": 403,
  "error": "listname name is required",
  "data": {}
}

1 个答案:

答案 0 :(得分:0)

行。物有所值。这就是我最终使用它的方法。我现在意识到这个问题更多是关于我对Python请求模块的理解或缺乏理解。

import requests
import json
from requests.auth import HTTPBasicAuth
import base64

# Get session token, this must be specified in header of subsequent request and returns a JSON object ready for insertion into header
rqstResponse = requests.post('https://manage.fastfieldforms.com/api/authenticate', auth=HTTPBasicAuth('XXX', 'XXX'))
jsonObj = json.loads(rqstResponse.content)
sessionToken = jsonObj['data']['sessionToken']
headers = {'X-Gatekeeper-SessionToken': sessionToken}

def getGloballistsDetails():
   # run this code to get listIds - which are hard coded further down
   rqstResponse = requests.get("https://manage.fastfieldforms.com/api/globallists", headers=headers)
   print (rqstResponse.content)
   del rqstResponse

def createGloballist(listname, filePath):
   # usage example createGloballist("test01", r"c:\temp\test.xlsx")
   files = {'file': open(filePath, 'rb')}
   data = {'listname': listname}
   rqstResponse = requests.post("https://manage.fastfieldforms.com/api//globallist",  files=files, data=data, headers=headers)
   print (rqstResponse.content)
   del rqstResponse

def updateGloballist(id, filePath):
   # usage example createGloballist("f03c7db1-cfea-4486-8350-53381ac048b4", r"c:\temp\test.xlsx")
   files = files = {'file': open(filePath, 'rb')}
   data = {'id': id}
   rqstResponse = requests.post("https://manage.fastfieldforms.com/api//globallist",  files=files, data=data, headers=headers)
   print (rqstResponse.content)
   del rqstResponse



filePath = r"J:\Properties\PropGIS\proj\20150820140457_TelecoMapping\data\Survey_Feb17\FastField_Test01.xlsx"
getGloballistsDetails()
#createGloballist("Test02", filePath)
updateGloballist('f03c7db1-cfea-4486-8350-53381ac048b4', filePath)