2015-05-30 37 views
1

我怎樣才能返回一個JSON響應和文件響應:返回JSON和文件

現在我這樣做:

runNumber = "A0001" 
response = None 
try: 
    response = make_response("Line One\r\nLine Two\r\n") 
    response.headers["Content-Disposition"] = "attachment; filename=" + runNumber + ".txt" 
except MyCustomException as e: 
    response = jsonify(error=e.value, runnumber=runNumber) 
except: 
    raise 
return(response) 

但是,只允許我回JSON或文件。在某些情況下,我想要返回兩者。

我想要返回JSON和文件的情況是當用戶在使用該文件之前應該檢查的文件內容的警告。

如果這是不可能的,我會將警告添加到文件的內容。

+1

然後客戶如何將文件和JSON部分再次分開? –

+1

這在HTTP中是不可能的 - 你的響應有一個Content-Type(和一個Content-Disposition)。並且多部分響應根本不受瀏覽器的任何標準化方式的支持([1](http://stackoverflow.com/questions/10729733/is-there-a-de-facto-or-established-reason-why-multipart -http-responses-arent-ge),[2](http://stackoverflow.com/questions/1806228/browser-support-of-multipart-responses)) –

回答

1

你不能只返回兩個響應。你只能返回一個。

這意味着,如果你真的需要同時返回JSON,你需要拿出一個方案,讓文件返回兩人在一個響應,並讓客戶端分離出來的文件和JSON零件再次。

這沒有標準。無論您提出什麼,都需要仔細記錄,以便客戶明確處理。

你可以使用自定義標題來存儲JSON數據,例如:

response = make_response("Line One\r\nLine Two\r\n") 
response.headers["Content-Disposition"] = "attachment; filename=" + runNumber + ".txt" 
response.headers['X-Extra-Info-JSON'] = json.dumps(some_object) 

或者你可以把該文件的內容的JSON數據。 JSON是不是二進制數據的最大格式,您可能希望將二進制數據編碼首先爲Base64:

filedata = "Line One\r\nLine Two\r\n".encode('base64') 
return jsonify(name=runNumber + '.txt', data=filedata) 

或者你可以創建一個多部分MIME文件,以同樣的方式,一個POST multipart/form-data體作品。

您選擇的內容取決於您的使用情況(使用您的API的是哪種客戶端)以及數據的大小(JSON響應中的兆字節文件數據不太可行)。