2

我正在尝试使用 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\"}"

这是我的活塞处理程序代码

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

欢迎提出想法。

4

2 回答 2

1

我基本上已经解决了这个问题。

基本问题是 Django 期望文件提交给服务器的请求格式是 django-piston 字面上只是丢球的格式。

当它遇到多部分请求时,它根本不会尝试解析数据。

这个问题的解决方案是手动调用解析引擎,在 JSON 的情况下,它直接来自 django.utils(这有点令人失望)。

您可以通过使用 ASIHTTPRequest(或您选择的请求模块)按键设置标准 post 值,然后以老式方式访问它来实现此目的。

from django.utils import simplejson
data = simplejson.loads(request.POST['save'])

就您必须采取的步骤而言,这基本上只是将这个处理程序方法简化为普通的旧 Django 视图。

很明显,django-piston 显然不是用来处理文件的?

于 2011-02-22T04:07:55.373 回答
1

我最好的想法是将原始字符串数据直接添加到 POST 正文然后添加文件是行不通的。

那是行不通的,不。如果您使用 'application/x-www-form-urlencoded' 格式或 'multipart/form-data' 发布表单数据,您将无法在最后添加一些额外的数据 - 它需要作为表单数据的一部分进入。这样的事情我猜...

[request setPostValue:@"{\"save\":{\"name\":\"iostest\"}}" forKey:@"data"];

但是,如果我删除字符串数据并只发布文件,它仍然不起作用。

更有问题...

或者如果是活塞错误地误读了数据。

我可能不会先朝那个方向看——活塞并没有真正弄乱请求对象,所以 ASI 请求似乎不太正确。

我认为开始的地方是检查传入的请求并检查它是否真的是一个有效的表单POST请求:

  1. 检查request["CONTENT_TYPE"]是否设置为“multipart/form-data”
  2. 检查request.raw_post_data并确保它是http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2中指定的有效表单数据- 检查键名是否符合您的预期,并且文件内容存在。(很明显,您在测试时会想要使用一个小文本文件!)
  3. 检查哪些键实际上存在于 中request.FILES,如果有的话,以防它像一个错误命名的字段一样简单。

如果它是客户端或服务器端的问题,我会尝试通过尝试编写一个普通的 python 客户端并查看你是否有同样的问题来尝试缩小范围。环顾四周,像这样的东西:http: //atlee.ca/software/poster/可能有用。

于 2011-02-20T23:30:50.773 回答