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 に従っていますか?
皆さんありがとう!
これは私の最初の主要なスタックオーバーフローの質問です。すべてが正しくフォーマットされていることを願っています;-)