2

ASIHTTPRequestを使用して、iPhoneからdjango-pistonを実行しているDjangoサーバーにJSONとバイナリファイルをPOSTしようとしています

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

ここでの私の最善のアイデアは、生の文字列データをPOST本文に直接追加してから、ファイルを追加するだけでは機能しないということです。

それはうまくいきません、いいえ。'application/x-www-form-urlencoded'形式または'multipart/ form-data'を使用してフォームデータをPOSTしている場合、最後にいくつかの余分なデータを追加することはできません。フォームデータの一部として入力します。このようなものだと思います...

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

しかし、文字列データを削除してファイルを投稿するだけでは、それでも機能しません。

もっと問題があります...

または、ピストンが誤ってデータを読み間違えた場合。

私はおそらく最初にその方向を見ないでしょう-ピストンは実際にはリクエストオブジェクトを混乱させないので、ASIリクエストが完全に正しくない可能性が高いようです。

開始する場所は、着信リクエストを調べて、それが本当に有効なフォームPOSTリクエストであることを確認することだと思います。

  1. request["CONTENT_TYPE"]'multipart/form-data'に設定されていることを確認してください
  2. を調べて、 http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2request.raw_post_data指定されている有効なフォームデータであることを確認します-キー名が期待どおりであることを確認し、ファイルの内容が存在すること。(明らかに、これをテストするときは小さなテキストファイルを使用することをお勧めします!)
  3. request.FILES名前が間違っているフィールドのように単純な場合は、実際にどのキーが存在するかを確認してください。

すべてに失敗した場合、クライアント側またはサーバー側で問題が発生した場合は、プレーンなPythonクライアントを作成して、同じ問題が発生するかどうかを確認することで、絞り込みを試みます。周りを見回すと、次のようなものが役立つかもしれません:http ://atlee.ca/software/poster/ 。

于 2011-02-20T23:30:50.773 に答える
1

私は基本的にこれを回避する方法をハックしました。

基本的な問題は、Djangoがファイルがサーバーに送信されることを期待する要求形式が、文字通りdjango-pistonがボールをドロップする形式であるということです。

マルチパートリクエストが発生した場合、データを解析しようとはしません。

この問題の解決策は、解析エンジンを手動で呼び出すことです。これは、JSONの場合、django.utilsから直接取得されます(これはちょっと残念です)。

これを実現するには、ASIHTTPRequest(または選択したリクエストモジュール)を使用して、キーで標準の投稿値を設定し、昔ながらの方法でアクセスします。

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

これは基本的に、この時点でこのハンドラーメソッドを、それを実行するために実行する必要のある手順の観点から、通常の古いDjangoビューにすぎないようにするだけです。

明らかに、django-pistonはファイルを処理するように構築されていないようです。

于 2011-02-22T04:07:55.373 に答える