2015-05-30 38 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响应中的兆字节文件数据不太可行)。