2
votes

Here is a bulleted list of events:

  • My android app sends blobs to Blobstore.
  • From app-engine console, I can see my blobs in Blob Viewer so I know my blobs got saved
  • But Blobstore does not invoke callback url, but instead
  • Blobstore returns 500 to my android app

So I cannot get blob keys to my datastore.

code to do http post myImage is a byte array:

HttpClient httpClient = new DefaultHttpClient();
        HttpPost postRequest = new HttpPost(url);
        MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
        try {
             reqEntity.addPart("title", new StringBody(title));
        reqEntity.addPart("caption", new StringBody(caption));
            ByteArrayBody myBlob = new ByteArrayBody(myImage, "myImage.png");
            reqEntity.addPart("myBlob", myBlob);
            ByteArrayBody secBlob = new ByteArrayBody(secBlobImage, "secBlobImage.png");
            reqEntity.addPart("secBlob", secBlob);
        } catch (Exception e) {
            e.printStackTrace();
        }
        postRequest.setEntity(reqEntity);
        try {
            HttpResponse response = httpClient.execute(postRequest);
            System.out.println("RESPONSE CODE::: " + response.getStatusLine().getStatusCode());
            System.out.println("REASON CODE::: " + response.getStatusLine().getReasonPhrase());
        } catch (Exception e) {
            e.printStackTrace();
        }

After android initiates the call to the blobstore, I get the following rant from logCat:

04-30 00:59:15.922: I/APACHE HTTP (thCr=4674) - NafHttpAuthStrategyDefault(8796): (thUse=4674) NafHttpAuthStrategyDefault()
04-30 00:59:15.922: I/APACHE HTTP (thCr=4674) - KeeperManager(8796): (thUse=4674) INITIALIZATION of shared resources
04-30 00:59:15.922: I/APACHE HTTP (thCr=4674) - AndroidContextProviderImpl(8796): (thUse=4674)    currentActivityThread=null
04-30 00:59:15.930: I/APACHE HTTP (thCr=4674) - GbaSupportIndicatorRequestUpdaterDefault(8796): (thUse=4674) GbaSupportIndicatorRequestUpdaterAbstract()   userHeaderPredefined=Apache-HttpClient/UNAVAILABLE (java 1.4)
04-30 00:59:15.946: I/APACHE HTTP (thCr=4674) - NafHttpAuthStrategyDefault(8796): (thUse=4674)    cached value : gbaSupportIsPossible=null
04-30 00:59:15.946: I/APACHE HTTP (thCr=4674) - NafHttpAuthStrategyDefault(8796): (thUse=4674)    The current context is NOT a context of GBA service.
04-30 00:59:15.946: I/APACHE HTTP (thCr=4674) - GbaSupportPermissionRequestCheckerImpl(8796): (thUse=4674) isCurrentProcessRequestedGba()#finished   result=false
04-30 00:59:15.946: I/APACHE HTTP (thCr=4674) - GbaSupportPermissionRequestCheckerImpl(8796): (thUse=4674) isCurrentProcessAllowedToUseGba()#started   result=false
04-30 00:59:15.946: I/APACHE HTTP (thCr=4674) - NafHttpAuthStrategyDefault(8796): (thUse=4674)    The GBA permission wasn't requested for this process.
04-30 00:59:15.954: I/APACHE HTTP (thCr=4674) - NafHttpAuthStrategyDefault(8796): (thUse=4674) It is impossible to support GBA now (many possible reasons: no Android Context, current client is GBA service, etc.), then it will be just usual HTTP.
04-30 00:59:15.954: I/APACHE HTTP (thCr=4674) - NafRequestExecutorWrapperRedirectionHandler(8796): (thUse=4674)    It isn't GBA flow, redirection responses are not handled.
04-30 00:59:20.688: I/APACHE HTTP (thCr=4674) - NafHttpAuthStrategyDefault(8796): (thUse=4674)    cached value : gbaSupportIsPossible=false
04-30 00:59:20.688: I/System.out(8796): RESPONSE CODE::: 500
04-30 00:59:20.696: I/System.out(8796): REASON CODE::: Internal Server Error

EDIT:

Many thanks to @Teshte and @ShivanRaptor for the question. I assumed my server was not being hit. But their question made me realize that indeed it was. So when I look at the server log, I find that there is a java.lang.NullPointerException at BlobKey titleKey = blobs.get("title").get(0) in the following code. The NPE occurs on the element that android is sending as StringBody. I haven't figured how to fix the NPE yet.

Code:

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
        Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req);
        BlobKey titleKey = blobs.get("title").get(0);
…

res.sendRedirect("/");
}
1
Can you show your codes ? - Raptor
The code is just typical http post. I have added it. @ShivanRaptor - Pouton Gerald
So this is the Android code...where is the GAE code? - Teshte
@Teshte many thanks for the question, it lead me to discover the cause. I have updated the post. Any ideas how to solve the root cause? - Pouton Gerald
you probably get NPE because of Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req); .. try to see what this map contains... - Teshte

1 Answers

1
votes

I am sending all the objects as ByteArrayBody instead of encoding some as StringBody.