1

Android Camera Service からの 2 つの byte[] 配列があります。それらといくつかのパラメーターを AppEngine サーバーに POST して、python webapp フレームワークを実行したいと考えています。

問題: サーバー側で空の HTTP リクエスト引数を取得し続けます。

私の主なアプローチは Apache HttpClient です。

1) Android 2.x には、マルチパート w/バイナリに必要な MultiPartEntity クラスが含まれていません。そこで、httpmime-4.0.1.jar と apache-mime4j-0.6.1.jar をビルド パスに追加しました。

2) Android 側では、次のように POST を実行しています。

public String post(String URI, byte[] jpeg, String description) {
    // Setup MultiPartEntity
    MultipartEntity args = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    args.addPart("mydescription", new StringBody(description));

    // Now add the file
    InputStream s1 = new ByteArrayInputStream(jpeg);
    args.addPart("myfile", new InputStreamBody(s1, "image/jpeg", "1.jpeg"));

    HttpClient httpclient = new DefaultHttpClient();
    // HTTP 1.1 is much faster with HttpClient, same issues w/o it  
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    HttpPost httpost = new HttpPost(URI);
    httpost.setEntity(args);

    HttpResponse response = httpclient.execute(httpost);

    // blah blah blah, process response
}

3) Python AppEngine 側、私のハンドラーは次のようになります。

class UploadHandler(webapp.RequestHandler):
    def post(self, request):
        logging.info(self.request.arguments())
        logging.info(self.request.POST)

4) 引数が空です -> 空の配列がログに出力されます。webobの下位レベルself.request._request__body()も空です。悪い兆候!

5) InputStreamBody を MultipartEntity に追加しない場合 (StringBody 引数のみ)、すべて正常に動作し、mydescription 引数が表示されます。

6) PHP サーバーをセットアップして投稿してみました: POST は PHP で動作します!

7) HttpClient が送信している形式に関する何かが、webapp/webob/wsgi/cgi.FieldStorage などの問題を引き起こします。どこが壊れているのかわかりません。

8) URLConnection を使用して RFC 2388 に従って生の http multipart/form を作成してみましたが、同様の結果が得られました。webapp/webob/wsgi/whatever はどの RFC に従っていますか?

皆さんありがとう!

これは私の最初の主要なスタックオーバーフローの質問です。すべてが正しくフォーマットされていることを願っています;-)

4

0 に答える 0