2012-06-01 28 views
5

私は、サーバーからJSONデータを送受信するためのURL接続を集中化する方法を検討しています。 POSTでは動作しますが、GETでは動作しません。私はGoogle App Engineサーバーを使用しています。私のコンピュータでは、POSTリクエストを処理して適切な結果を返す(適切にログする)が、GETメソッドでリクエストを試してみると、次のエラーが表示されます。NSURLConnectionが早く終了する

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開発サーバーは、サーバーがすべてのデータの送信を完了する前に、クライアントが接続を終了したことを示す「破損パイプ」エラーを表示します。

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

を繰り返しますが、これは、POSTで動作しなくGET:

/* 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]; 
} 

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

は、ここでの方法です。これをどうすれば解決できますか?

答えて

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]]; 

直接あなたの質問に答えるために:エラーがkCFErrorHTTPParseFailureあるCFNetwork Error Codes Referenceによると

を。これは、クライアントがHTTP応答を正しく解析できなかったことを意味します。

+0

私は、おかげでそれを試してみますよ! – drodman

1

GETにボディが含まれていないのはなぜですか。とにかくGETでJSONを提出したいのですが

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

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

サンプルポスト:[要求setHTTPMethod: "POST" @]私の場合は

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; 
8

は私が呼び出していませんでした

+0

私はこのエラーにつながったGETかPOSTを指定していませんでした。 GETを指定すると、私のために修正されました。 – njtman

関連する問題