サーバー側でJersey RESTを使用してGAE Blobstoreを使用しています。Android 経由でサーバーに GET リクエストを送信し、 というクエリ パラメータを含めますlogindx
。サーバー側のコード スニペットは次のようになります。
@Path("/getuploadurl")
@GET
@Produces(MediaType.TEXT_PLAIN)
public Response getUploadUrl(@QueryParam("logindx") Long logIndx ) {
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
String uurl = blobstoreService.createUploadUrl("/logblobkey");
logger.severe("urltest: " + uurl);
return Response.ok(uurl).build();
}
問題は、Android に返される結果の文字列 (ログにも記録される) が次のとおりであることです。
urltest: http://bardroid123.appspot.com/_ah/upload/?logindx=-43803902306520/AMmfu6b2Ubvf17gD_5uheZeDhTIsr8nm582oaNi0_SDPWfuxqHmYgtkWqVVP52QbBwnnNbWyJf_lDdf9GDmFKtdHU_eUn5gjjtrOSAB32HSu3HiVgLovO5pYeYDkapBPfu7uuo460Ez0/ALBNUaYAAAAAUeuzYniVLlTqyYCjIkfK7-n0ARv5yoo1/
上記のアップロード URLの部分?logindx=-43803902306520/
は、確かに存在しないはずですか? この関数は、クエリ パラメータを抽出するためにオブジェクトをcreateUploadUrl
取得する方法さえ知っているでしょうか?HttpRequest
問題は、Android アプリで上記の uri を次のように使用しようとしたときです。
HttpPost postRequest = new HttpPost(uri);
次のエラーが表示されます。
java.lang.IllegalArgumentException: Illegal character in query at index 253: http://bardroid123.appspot.com/_ah/upload/?logindx=-43803902306520/AMmfu6ZDQr7WenGd0N3ZkbI3zfSl0xPcY56XS5p_VQiS_MWxtTwtc1xm8NbhdrhK-PxopCIolsWci_06DQ3EsUJXSlbiavtJKX9JXT7RU3vTnwj-H0yY5DZKv9hbYR0brfOezaVwob1k/ALBNUaYAAAAAUevBZWOmVC0m1tipSR7Lk9WcwePsXBzf/
さらにややこしいのは、?logindx=-43803902306520/
(App Engine が提供する Eclipse から) ローカル サーバーで get 要求を実行したときに、その部分を取得できないことです。
http://localhost:8888/res/logs/getuploadurl?logindx=1234567.
その場合、ブラウザは次のようなものを返します。
http://localhost:8888/_ah/upload/agtiYXJkcm9pZDEyM3IbCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGDIM
明らかに、これは Android とは何の関係もありません。また、これがジャージー固有のものである可能性もわかりません。
どんな助けでも大歓迎です。
ありがとう - アフリカから。
編集:
uri の最後のスラッシュ (/) をドロップするだけで、今すぐ取得でき、Illegal character in query
エラーはなくなりました。uri は、パーツが含まれている Blobstore と完全に連携して?logindx=-43803902306520/
いました。今は関係ありませんが、なぜアップロード uri に含まれているのか疑問に思っていますか?