文字列入力を受け取る amfPHP 関数を作成しています。英数字なら問題ないのですが、パラメータに「2.UgnFl4kAWovazp_tVo6fHg__.86400.1260025200-571701419」を送ると残念ながら「2」というデータが返ってきます。
ここに関数があります(ご覧のとおり本当にシンプルです)
function checkOpenSession($guid, $session_key) {
return $session_key;
}
このサービス ブラウザーのバグを回避するには、引数に文字列が必要で、この文字列が数字で始まる場合、サービス ブラウザーでエントリを二重引用符で囲みます。サービスブラウザを介していくつかのメソッドをテストするのと同じ問題がありましたが、うまくいきました。
この動作は実際に AMFPHP サービス ブラウザに存在する (バグ) ため、数字の先頭の文字列を int に変換している AMFPHP と間違えやすいです。ただし、問題は送信コードにあります。たとえば、json ゲートウェイを介して urlencoded 文字列を送信すると、正しく動作します (Objective C コード):
NSString *theUrl = [[NSString alloc] initWithFormat:@"%@/modules/amfphp/amfphp/json.php/MysqlRemoting.checkAuth/%@/%@/1", kServerBaseUrl, userName, passMD5];
NSString *encodedUrl = [theUrl stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];
passMD5 には先行番号がある場合があります。しかし、サービス ブラウザで checkAuth メソッドに適切な値を入力すると、壊れてしまいます。
[編集]
$value = urldecode($value);
if($value != "") {
if($value[0] != '[' && $value[0] != '{' && $value != "null" && $value != "false" && $value != "true") {
$hasAlpha = false;
//check to see if it is a number
$sl = strlen($value);
for ($i = 0; $i < $sl; $i++) {
$char1 = ord($value[$i]);
if($char1 >= 0x30 && $char1 <= 0x39) {
//Then this is a number
} else { //Else leave value as is */
$hasAlpha = true;
}
}
if (!$hasAlpha) $value = json_decode($value, true);
}
else
{
$value = json_decode($value, true);
}
}
簡単なセットアップでこれを試してみました。結果をサービス ブラウザからファイルに書き込むだけで、問題ないようです。したがって、問題は呼び出し側にあるようです。
もう 1 つの可能性は、先頭の整数が原因で、amfphp が戻り値のデータ型を文字列から int に変更することです。戻り文字列の先頭に英数字を入れてみて、それが何をするか見てみましょう。
文字列を二重引用符で囲みます...それでうまくいきます。