4

サーバーとJSONデータを送受信するためにURL接続を一元化する方法に取り組んでいます。POSTでは機能しますが、GETでは機能しません。Google App Engineサーバーを使用していて、コンピューター上でPOSTリクエストを処理し、適切な結果を返します(そして適切にログに記録します)が、GETメソッドを使用してリクエストを試行すると次のエラーが発生します。

Error Domain=kCFErrorDomainCFNetwork Code=303 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 303.)" UserInfo=0xd57e400 {NSErrorFailingURLKey=http://localhost:8080/api/login, NSErrorFailingURLStringKey=http://localhost:8080/api/login}

さらに、GAE開発サーバーは「パイプの切断」エラーを表示します。これは、サーバーがすべてのデータの送信を終了する前に、クライアントが接続を閉じたことを示します。

方法は次のとおりです。

/* Connects to a given URL and sends JSON data via HTTP request and returns the result of the request as a dict */
- (id) sendRequestToModule:(NSString*) module ofType:(NSString*) type function:(NSString*) func params:(NSDictionary*) params {

    NSString *str_params = [NSDictionary dictionaryWithObjectsAndKeys:func, @"function", params, @"params", nil];
    NSString *str_url = [NSString stringWithFormat:@"%@%@", lds_url, module];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:str_url]];
    NSData *data = [[NSString stringWithFormat:@"action=%@", [str_params JSONString]] dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPMethod:type];
    [request setHTTPBody:data];
    [request setValue:[NSString stringWithFormat:@"%d", [data length]] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    NSError *error = nil;
    NSURLResponse *response = nil;
    NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    NSLog(@"Error: %@", error);
    NSLog(@"Result: %@", [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]);
    return [result objectFromJSONData];
}

サンプル呼び出しは次のようになります。

NSDictionary *response = [fetcher sendRequestToModule:@"login" ofType:@"GET" function:@"validate_email" params:dict];

繰り返しますが、これはPOSTで機能しますが、GETでは機能しません。どうすればこれを修正できますか?

4

3 に答える 3

8

私の場合、[request setHTTPMethod:@"POST"]を呼び出していませんでした。

于 2013-07-03T08:28:06.443 に答える
2

根本的な原因は、無効なURLを使用していることだと思います。

JSONエンコーディングには、「{」、「}」、「[」、「]」などが含まれます。これらはすべて、URLに追加する前にURLエンコードする必要があります。

NSString *query = [NSString stringWithFormat:@"?action=%@", [str_params JSONString]];
query = [query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", str_url, query]];

あなたの質問に直接答えるには:

CFNetworkエラーコードリファレンスによると、エラーはkCFErrorHTTPParseFailureです。これは、クライアントがHTTP応答を正しく解析できなかったことを意味します。

于 2012-06-02T03:34:26.363 に答える
1

その理由は、GETに本文が含まれていないためです。とにかくGETでJSONを送信したいのはなぜですか?

ターゲットAPIがデータのみを返す場合は、URLパラメータでデータを渡します。

データを送信して応答を「取得」する場合は、投稿を使用して、返信時に本文を調べます。

サンプル投稿:

NSError *error;
NSString *urlString = [[NSString alloc] initWithFormat:@"http://%@:%@/XXXX/MVC Controller Method/%@",self.ServerName, self.Port, sessionId  ];   
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];

// hydrate the remote object
NSString *returnString = [rdc JSONRepresentation];
NSData *s10 = [returnString dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:s10];
NSURLResponse *theResponse = [[NSURLResponse alloc] init];
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&theResponse error:&error];
NSString *message = [[NSString alloc] initWithFormat: @"nothing"];

if (error) {
    message = [[NSString alloc] initWithFormat:@"Error: %@", error];


} else {
    message = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

}

NSLog(@"%@", message);

return message;
于 2012-08-21T15:27:56.103 に答える