我正在尝试使用ASIHTTPRequest将一些JSON和一个二进制文件从iPhone发布到运行django-piston的Django服务器上
如果我只发送JSON字符串,我知道如何让它工作,如果我只发送文件,我知道如何让它工作,但两者都很棘手。
因此我们将从ASIHTTPRequest代码开始
ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];
[request setRequestMethod:@"POST"];
[request setPostFormat:ASIMultipartFormDataPostFormat];
[request appendPostData:[@"{\"save\":{\"name\":\"iostest\"}}" dataUsingEncoding:NSUTF8StringEncoding]];
[request addData:UIImageJPEGRepresentation([UIImage imageNamed:@"test.jpg"], 1.0f)
withFileName:@"test.jpg"
andContentType:@"image/jpeg"
forKey:@"data"];
[request setDelegate:self];
[request startAsynchronous];我最好的想法是,将原始字符串数据直接添加到POST正文中,然后再添加一个文件是行不通的。
但如果我转而尝试
[request setPostValue:@"{\"name\":\"iostest\"}" forKey:@"save"];然后,活塞数据字典将“save”存储为字符串,而不是反序列化对象,因此它将按字面意思传递该字符串
"{\"name\":\"iostest\"}"这是我的Piston处理程序代码
def create(self, request):
data = request.data
print(data['save']) #{\"name\":\"iostest\"}"
print("Files: " + request.FILES['data'].name) #test.jpg
print("Data Save Name: " + data['save']['name']) #crash, interprets this as a string indeces lookup欢迎大家提出想法。
发布于 2011-02-22 12:07:55
我基本上已经用我的方式解决了这个问题。
基本的问题是,Django期望文件提交到服务器的请求格式,实际上是django-piston所使用的格式。
当它遇到多部分请求时,它根本不会尝试解析数据。
这个问题的解决方案是手动调用解析引擎,在JSON的情况下,它直接从django.utils中出来(这有点令人失望)。
您可以通过使用ASIHTTPRequest (或您选择的请求模块)通过键设置标准的POST值,然后以传统的方式访问它来实现这一点。
from django.utils import simplejson
data = simplejson.loads(request.POST['save'])这基本上只是将这个处理程序方法简化为一个常规的旧Django视图,就您必须执行的步骤而言。
那么很明显,django-piston显然不是用来处理文件的?
发布于 2011-02-21 07:30:51
这里我最好的想法是,将原始字符串数据直接添加到POST正文中,然后添加一个文件是行不通的。
那是行不通的,不。如果你是使用‘POSTing /x-www- form -urlencoded’格式的应用程序表单数据,或者'multipart/ form - data‘,你将不能仅仅在末尾添加一些额外的数据-它需要作为表单数据的一部分。我猜是这样的..。
[request setPostValue:@"{\"save\":{\"name\":\"iostest\"}}" forKey:@"data"];
,但是如果我删除字符串数据,只发布文件,它仍然不能工作。
是更有问题的。
,或者如果是活塞错误地读取了数据。
首先,我可能不会从这个方向考虑--活塞并不会真正干扰request对象,所以看起来更有可能是ASI请求不太正确。
我认为首先要检查传入的请求,并检查它是否真的是有效的表单POST请求:
request["CONTENT_TYPE"]是否设置为'multipart/form-data'request.raw_post_data,并确保它是http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2中指定的有效表单数据-检查密钥名称是否如您预期的那样,以及文件内容是否存在。(很明显,在测试这项功能时,您会希望使用一个小的文本文件!)request.FILES中实际存在的键(如果有的话),以防它像命名错误的字段一样简单。如果所有这些都失败了,我会尝试缩小范围,如果这是客户端或服务器端的问题,尝试编写一个普通的python客户端,然后看看您是否也有同样的问题。环顾四周,可以看到:http://atlee.ca/software/poster/可能很有用。
https://stackoverflow.com/questions/5052630
复制相似问题