2011-07-05 8 views
3

私のiPhoneアプリからの簡単なPOSTがあります。アンパサンドを渡す以外は正常に動作しますが、バックエンドは壊れてしまいます.GETリクエスト(アンパサンドは変数名を区切ります)のように扱います。最初に何らかのエンコーディングを行う必要がありますか?ここでは、コードは次のようになります。POST中のアンパサンドが大混乱の原因となる

NSString *content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", str, emailAddress.text]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.myurl.com/myscript.php"]]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:[content dataUsingEncoding:NSISOLatin1StringEncoding]]; 

// generates an autoreleased NSURLConnection 
[NSURLConnection connectionWithRequest:request delegate:self]; 
+0

@Richあなたはこれをどのように解決しましたか? ** 'stringByAddingPercentEscapesUsingEncoding'はアンパサンドをコードしないので、エラーがまだ発生**動作しない/ –

答えて

0

編集:stringByAddingPercentEscapesUsingEncoding:がクエリ全体ではなく、1の部分をエンコードするために使用されるように、あなたの代わりに別の方法を使用する必要があります。

残念ながら、財団は、このような方法を提供していないので、あなたは、CoreFoundationのに到達する必要があります。それは次のようになります

- (NSString *)stringByURLEncodingString:(NSString *)string { 
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
     kCFAllocatorDefault, 
     (__bridge CFStringRef)string, 
     NULL, // or (__bridge CFStringRef)(@"[].") 
     (__bridge CFStringRef)(@":/?&=;[email protected]#$()',*"), 
     kCFStringEncodingUTF8 
    ); 
} 

あなたはあなたのケースでは

- stringByAddingPercentEscapesUsingEncoding: 

を使用することができますこれは:

NSString * content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], [emailAddress.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

Yこれはあなたのケースで動作するかどう

NSString *dataStr = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString *emailStr = [emailAddress.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

NSString *content = [[NSString alloc] initWithFormat:@"data=%@&email=%@", dataStr, emailStr]; 
+3

stringByAddingPercentEscapesUsingEncodingは実際にそれがアンパサンドコーディングされなかった私のシナリオでは、アンパサンド – morgancodes

+1

をエンコードしていないようです。 –

+0

この回答を: – Aaron

0

が、私はわからないんだけど、あなたは試してみてアンパサンドをエンコードするために%38を試すことができます。ouも、このような方法でこれを行うことができます。

+0

これを行うには、単に 'stringByAddingPercentEscapesUsingEncoding'を呼び出す必要があります。 – akashivskyy

+0

&の正しいエンコーディングが%26ではなく、%38であるため、あなたはdownvotedを取得したと思います –

7

iOS7でこの問題が発生しましたが、受け入れられた回答がまったく機能しませんでした(実際には、バックエンドにデータを送信する際の私の標準です)。バックエンド側でアンパサンドが壊れていたので、&を%26に置き換えなければなりませんでした。バックエンドはPythonで実行されていて、コードは従来のもので、ASIを使用していました。

基本的に私は次のことを行っている:&は、有効なURL文字であるとして

NSString *dataContent = [NSString stringWithFormat:@"text=%@", 
    [json stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

dataContent = [dataContent stringByReplacingOccurrencesOfString:@"&" 
                withString:@"%26"]; 
1

ByAddingPercentは.......動作しません。

私は&でJSONを送信する必要がありましたが、それは同じ考えです。

NSString *post = [NSString stringWithFormat:@"JSON=%@", (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)jsonString, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8))]; 

最後に向かって "jsonString"が変換されます。

関連する問題