2012-02-24 10 views
0

私のiPhoneアプリからPOST要求を送信することに関連する非常に奇妙な問題があります。iPhone - '&'がHTTPリクエスト本体に含まれていると奇妙な動作が発生する

アプリは、HTTPポストデータをサードパーティのサービスに送信する必要があります。リクエストはXMLであり、XMLレスポンスを取得します。ここで要求を送信するための私のコードは次のとおりです。

-(void)sendRequest:(NSString *)aRequest 
{ 
    //aRequest parameter contains the XML string to send. 
    //this string is already entity-encoded 
    isDataRequest = NO; 
    //the following line will created string REQUEST=<myxml> 
    NSString *httpBody = [NSString stringWithFormat:@"%@=%@",requestString,aRequest]; 
    //I'm not sure what this next string is doing, frankly, as I didn't write this code initially 
    httpBody = [(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)httpBody, NULL, CFSTR("+"), kCFStringEncodingUTF8) autorelease]; 
    NSData *aData = [httpBody dataUsingEncoding:NSUTF8StringEncoding]; 
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:kOOURLRequest]] autorelease]; 
    [request setHTTPBody:aData]; 
    [request setHTTPMethod:@"POST"]; 
    self.feedURLConnection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease]; 
} 

これがある限り、要求XMLは、例えば、このXML要求を&記号が含まれていないとして完璧に動作します:予想通り

<?xml version="1.0"?> 
<request type="search" group="0" language="en" version="2.5.2"> 
    <auth> 
     <serial>623E1579-AC18-571B-9022-3659764542E7</serial> 
    </auth> 
    <data> 
     <location> 
      <lattitude>51.528536</lattitude> 
      <longtitude>-0.108865</longtitude> 
     </location> 
     <search>archive</search> 
    </data> 
</request> 

が送信されます正しい応答が期待どおりに受信されます。リクエストが(特に「検索」要素で)&文字が含まれる場合

しかし、 - そのような:&文字まで

<?xml version="1.0"?> 
<request type="search" group="0" language="en" version="2.5.2"> 
    <auth> 
     <serial>623E1579-AC18-571B-9022-3659764542E7</serial> 
    </auth> 
    <data> 
     <location> 
      <lattitude>51.528536</lattitude> 
      <longtitude>-0.108865</longtitude> 
     </location> 
     <search>&amp; archive</search> 
    </data> 
</request> 

だけにすべてをサーバーに送信されます。サーバーはこの文字を超えて何も受信していないようです。 Androidアプリではほとんど同じコードが動作しており、すべて正常に動作しているため、サーバー上で問題はありません。

どのように私はこの固定を得ることができます任意のアイデアは大いに感謝します!

+0

WireSharkまたはCharlesのようなネットワークモニタを使用して、実際に何が送信されているかを確認します。 – zaph

+0

処理して送信するまでの間に文字列(NSLog it)をチェックアウトしてください。それはあなたがそれを行うすべての処理で切り捨てられているかもしれません。 –

答えて

0

Zaphのコメントのおかげで、私は最終的にそれをソートしました。 WireSharkを使用して、実際に何がサーバーに送信されたかを確認し、要求が完全にエンコードされていないことを発見しました。最終的なHTTPボディでは、実際のシンボル&が存在しました(&amp;の一部)。

REQUEST=first_half_of_request&amp;second_half_of_request 

サーバがPOST変数をデコードし、&は、変数の区切りとしたため、リクエスト変数が唯一だった:それはのようなものを受けていたので、これは当然、サーバー側で非常にうまく動作しませんでしたfirst_half_of_requestに設定します。すべて& charまでです。

解決策は非常に簡単でした。ライン

httpBody = [(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)httpBody, NULL, CFSTR("+"), kCFStringEncodingUTF8) autorelease]; 

にも&エンコードするCFSTR("+&")CFSTR("+")を置き換えます。これで、エンティティエンコーディング(&amp;&)と組み合わせて、正しいデータがサーバーに送信され、正しい応答が受信されました。

関連する問題