0

iPhone アプリで Web サービス (JSON 形式で返される) を使用しています。すべてがうまく機能し、パラメーターを使用して Web サービスを呼び出し (以下の例では、パラメーターは JSON 形式を含む文字列です)、Web サービスから JSON の回答を取得できます。私の問題は、Web サービスがエスケープ文字 (UTF8) を含むパラメーターを受け取ることです。コードは次のとおりです。

// 1 - iOS app  

NSString *parameters = @"&user={"Name":"aName","Date":"2012-04-24 02:24:13 +0000"}";
NSData   *postData   = [parameters dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];    

NSString *urlString = @"http://myWebService:80/AddUser";
NSURL *url = [NSURL URLWithString:urlString];    

unsigned long long postLength = postData.length;
NSString *contentLength = [NSString stringWithFormat:@"%ull",postLength];    

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:contentLength forHTTPHeaderField:@"Content-Length"];    

[request setHTTPBody:postData];

// send the request...

------------------------------------------------------------------------------

// 2 - Web service

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void AddUser(string user)
{
    Dictionary<string, string> userData = new JavaScriptSerializer().Deserialize<Dictionary<string, string>>(user);

    string name = userData["Name"];   // OK here, name == "aName"
    DateTime newDateTime = DateTime.Parse(userData["Date"]);  // ERROR here because userData["Date"] returns "2012-04-24%2002:24:13%20+0000" so Parse method crash

    // ... return the JSON answer
}

まず、受け取ったパラメーターにエスケープ文字がまだ含まれているのは正常ですか? はいの場合、文字列「user」を変更するにはどうすればよいですか。

{"Name":"aName","Date":"2012-04-24%2002:24:13%20+0000"}

それに:

{"Name":"aName","Date":"2012-04-24 02:24:13 +0000"}

それ以外の場合は、iOS アプリでリクエストをビルドするときに何か間違ったことをしましたか?

4

1 に答える 1

0

これは、それ自体は「文字エンコーディング」の問題ではありません。文字列は単純にURL エンコードされています。"2012-04-24%2002:24:13%20+0000"

私は実際にはObjective-C開発者ではありませんが、問題は設定しているContent-Typeヘッダーに起因しているようです:

[request setValue:@"application/x-www-form-urlencoded; ... ]

なぜあなたが使っているのかわかりませんContent-Type: application/x-www-form-urlencodedが、それは間違いなく私にとって面白いにおいがします. JSON を as として送信application/jsonすると、問題が解決するはずです。

于 2012-04-24T03:53:56.137 に答える