问题描述:

I'm having the strangest issue right now with google app engine. I'm sending a POST request from iOS and google app engine instead invokes the GET handler.

I've sandboxed this one situation for testing and can't get it figured out. I have an iOS app that just sends a request. And I've commented out everything on GAE except for the service. The service only logs a parameter and returns.

The iOS app I've tried using two different ways of sending the request. Neither works.

iOS Code:

/*

NSURL * url = [NSURL URLWithString:@"http://beermonster-gngrwzrd.appspot.com/TestParameter"];

ASIFormDataRequest * _fdrequest = [[ASIFormDataRequest alloc] initWithURL:url];

[_fdrequest setPostValue:@"hello" forKey:@"testkey"];

[_fdrequest startAsynchronous];

*/

NSURL * __url = [NSURL URLWithString:@"http://beermonster-gngrwzrd.appspot.com/TestParameter"];

NSMutableURLRequest * __request = [NSMutableURLRequest requestWithURL:__url];

[__request setHTTPMethod:@"POST"];

NSString * post = [NSString stringWithFormat:@"testkey=hello"];

[__request setHTTPBody:[post dataUsingEncoding:NSUTF8StringEncoding]];

[NSURLConnection sendSynchronousRequest:__request returningResponse:nil error:nil];

My App engine handler:

class TestParameter(webapp.RequestHandler):

def post(self):

logging.debug(self.request.get("testkey"))

self.response.out.write(self.request.get("testkey"))

print self.request.get("testkey")

def get(self):

logging.debug("get")

logging.debug(self.request.get("testkey"))

self.response.out.write(self.request.get("testkey"))

The output in the GAE logs shows the "get" code path which isn't correct.

Any ideas why POST requests would come into GAE as a GET? Is there some configuration in GAE that I missed?

Thanks!

网友答案:

Check the entry in app.yaml for the script that handles "/TestParameter". Does it specify "secure: always"? If it does and you make a non-secure connection you will get a 302 redirecting to the secure version.

To fix this either make your post over HTTPS or remove "secure: always" from the entry in app.yaml.

网友答案:

From what I can tell if you want to send POST requests to GAE. Make sure you do it on https. If you make the request on a non-https attempt, it sends back a 302 redirect to the https version of the request. But if whatever you're using to send the request doesn't correctly handle 302's it might resend the request incorrectly.

相关阅读:
Top