1

http POST リクエストを介してサーバーにデータを送信する必要がある、objective-c で記述されたアプリケーションがあります。サーバー側のコードはphpで書かれています。どうやらこのコードは以前は機能していたようですが、適切に統合できないようです。現在、デバッグ目的で、Post Request をエコーバックしようとしています。php の重要な部分は次のとおりです。

if($_SERVER['SERVER_NAME'] === 'example'){
    define('DB_HOST', 'localhost');
}
else{
    define('DB_HOST', 'example.com');
}
print_r($_POST);
print_r($_REQUEST);
echo 'x'.$HTTP_RAW_POST_DATA;
echo 'this is a test';  
function getRealPOST() {
        $result = array();
        $b =  explode("&", urldecode(file_get_contents("php://input")));
    foreach($b as $k => $v)
    {
            list($ind, $val) = explode("=", $v);
       $result[$ind]  = $val;
    }
    return $result;
}

$post = getRealPOST()
echo "<pre>";
print_r($post);
die('here');

以下は、objective-c コードの重要な部分です。

NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
[params setValue:@"goleafsgo" forKey:@"password"];
[params setValue:[NSString stringWithFormat:@"%i", API_VERSION] forKey:@"version"];
[params setValue:uuid forKey:@"uuid"];
[params setValue:@"save_sensor_data" forKey:@"request"];
[params setValue:sensorData forKey:@"sensor_data"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params options:kNilOptions error:nil];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:API_URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"json" forHTTPHeaderField:@"Data-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:jsonData];
[request setHTTPMethod:@"POST"];
_urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (_urlConnection) {
    // Create the NSMutableData that will hold the received data if necessary, otherwise clear   it out
    if (!_responseData)
        _responseData = [[NSMutableData alloc] init];
    } 
    else {
         NSLog(@"Connection error");
    }

PHP から投稿情報を返すためにいくつかの方法を試しましたが、NSLogs を使用すると空の配列の後に testString が続くだけです。また、ライブラリを使用して NSMutableURLRequest+CurlDescription を出力しました。

2013-06-27 12:42:54.309 sensimatprototype[3453:907] リクエスト文字列: 2013 年 6 月 27 日木曜日 12:42:54 PM 東部夏時間

リクエスト

curl -X POST -H "Data-Type: json" -H "Content-Length: 61" -H "Content-Type: application/json" -H "Accept: application/json" " http://example.com /api/ " -d "{"request":"last_entry","version":"1","password":"examplePassword"}"

HTTPResponse allHeaderFields を出力すると、次のようになります。{ Connection = "keep-alive"; 「内容の長さ」= 52; "Content-Type" = "text/html"; Date = "Thu, 27 Jun 2013 16:42:53 GMT"; サーバー = "nginx 管理者"; "X-Cache" = "バックエンドからのヒット"; "X-Powered-By" = "PHP/5.3.25"; }

私は途方に暮れています。問題がサーバー側にあるのかクライアント側にあるのか、どうやって判断すればよいのかもわかりません。誰かが私が間違っている場所を指摘できれば、本当に感謝しています。

EDIT 提案どおり getRealPOST 関数を追加しました。また、HTMLフォームを使用してデータを送信して、何が起こるかを確認してみました

フォームは次のとおりです。

<form action="http://sensimatsystems.com/api" method="post"
<input name="pasword" value="test"/>
<input name="lastTime" value="test2"/>
<input type="submit">
</form>

Here is what gets displayed: Array ( ) Array ( [adaptive_image] => 2560 [has_js] => 1 [_ utma] => 231368128.879400039.1372276244.1372276244.1372276244.1 [ _utmc] => 231368128 [__utmz] => 231368128.1372276244.1.1.utmcsr =(直接)|utmccn=(直接)|utmcmd=(なし) ) x

配列 ( [] => ) ここに

4

2 に答える 2

1

サーバー側でこの機能を試してください

    function getRealPOST() {
            $result = array();
            $b =  explode("&", urldecode(file_get_contents("php://input")));
        foreach($b as $k => $v)
        {
                list($ind, $val) = explode("=", $v);
           $result[$ind]  = $val;
        }
        return $result;
    }

$post = getRealPOST()
echo "<pre>";
print_r($post);

$_POST を使用しない他の方法で投稿データを取得するのに役立つことを願っています

于 2013-06-27T18:06:11.433 に答える