11

編集:私は人々から得たすべての提案でOPを編集したので、これは最新です(そしてそれはまだ機能していません)。


私は次のコードを持っています。これは、私が持っている.phpファイルに(そしてデータベースに)いくつかのデータをPOSTすることになっていますが、それはこの質問の範囲を超えています。

私のメソッドには、いくつかの文字列を含む配列を渡します。

-(void)JSON:(NSArray *)arrayData {

    //parse out the json data
    NSError *error;

    //convert array object to data
    NSData* JSONData = [NSJSONSerialization dataWithJSONObject:arrayData 
                                                       options:NSJSONWritingPrettyPrinted 
                                                         error:&error];

    NSString *JSONString = [[NSString alloc] initWithData:JSONData 
                                                 encoding:NSUTF8StringEncoding];


    NSString *URLString = [NSString stringWithFormat:@"websitename"];

    NSURL *URL = [NSURL URLWithString:URLString];

    NSLog(@"URL: %@", URL);


    NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:URL 
                                                              cachePolicy:NSURLRequestUseProtocolCachePolicy 
                                                          timeoutInterval:60.0];

    NSData *requestData = [NSData dataWithBytes:[JSONString UTF8String] length:[JSONString length]];

    NSString *requestDataString = [[NSString alloc] initWithData:requestData 
                                                        encoding:NSUTF8StringEncoding];
    NSLog(@"requestData: %@", requestDataString);

    [URLRequest setHTTPMethod:@"POST"];
    NSLog(@"method: %@", URLRequest.HTTPMethod);
    [URLRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [URLRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [URLRequest setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [URLRequest setHTTPBody: requestData];

    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:URLRequest delegate:self];

    if (connection) {
        NSMutableData *receivedData = [[NSMutableData data] retain];
        NSString *receivedDataString = [[NSString alloc] initWithData:receivedData 
                                                             encoding:NSUTF8StringEncoding];
        NSLog(@"receivedData: %@", receivedDataString);
    }

    //potential response
    NSData *response = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:nil error:nil];

    //convert response so that it can be LOG'd
    NSString *returnString = [[NSString alloc] initWithData:response encoding:NSASCIIStringEncoding];

    NSLog(@"RETURN STRING: %@", returnString);
}

:コードに自分のWebサイトの実際のURLが含まれているので、誰でも必要に応じてテストできます。


次に、.php側があります。ここで、私がやろうとしているのは、入力を探すことだけです(ただし、何も得られません)。

<html>
        <body>
        <?php

        echo "Connection from iOS app to MySQL database<BR>";

        echo '<pre>'.print_r($GLOBALS,true).'</pre>';



        ?>
        </body>
</html>

私が今本当にやろうとしているのは、データが通過していることを確認し、それをページにエコーしてから、アプリからページを読み取ることです(これまでのところ、データは表示されていません)。


.phpの出力:

 <html>
        <body>
        Connection from iOS app to MySQL database<BR>'Array
(
)
'<pre>Array
(
    [_GET] => Array
        (
        )

    [_POST] => Array
        (
        )

    [_COOKIE] => Array
        (
        )

    [_FILES] => Array
        (
        )

    [GLOBALS] => Array
 *RECURSION*
)
</pre>        </body>
</html>
4

3 に答える 3

10

の代わりにJSONをPOSTしていますapplication/x-www-form-urlencoded

PHP$_POSTは-requestsに対して のみ入力されます。application/x-www-form-urlencodedそのようにjsonを直接送信する場合は、次のようにする必要があります。

<?php
$posted_json = json_decode(file_get_contents("php://input"));
print_r($posted_json);

jsonが無効な場合、これは機能しないことに注意してください。リクエスト本文は、次の方法でいつでもデバッグできます。

<?php
echo file_get_contents("php://input");

$_POSTと$_GETの一般的な説明は次のとおりですhttp://www.php.net/manual/en/language.variables.external.php

これらは通常のhtmlフォームで使用することを目的としていますが、適切なエンコーディングとコンテンツタイプヘッダーを使用してこのようなリクエストを簡単にエミュレートできます。ただし、通常のhtmlフォームの動作とは異なるため、JSONでは動作しません。

于 2012-08-13T13:50:07.223 に答える
8

私はObjective-Cについてはわかりませんが、次のJSONデータを送信しようとしていると仮定します(つまり、JSONStringは次のとおりです)。

{
    "firstName": "John",
    "lastName": "Smith",
    "age": 25,
    "address": {
        "streetAddress": "21 2nd Street",
        "city": "New York",
        "state": "NY",
        "postalCode": "10021"
    },
    "phoneNumber": [
        {
            "type": "home",
            "number": "212 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

その場合、リクエストは次のようになります。

POST /yourwebsite.php HTTP/1.1
Host: cs.dal.ca
User-Agent: USER-AGENT
Accept: text/html,application/json,*/*
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 624

data=%7B%0A++++%22firstName%22%3A+%22John%22%2C%0A++++%22lastName%22%3A+%22Smith%22%2C%0A++++%22age%22%3A+25%2C%0A++++%22address%22%3A+%7B%0A++++++++%22streetAddress%22%3A+%2221+2nd+Street%22%2C%0A++++++++%22city%22%3A+%22New+York%22%2C%0A++++++++%22state%22%3A+%22NY%22%2C%0A++++++++%22postalCode%22%3A+%2210021%22%0A++++%7D%2C%0A++++%22phoneNumber%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22type%22%3A+%22home%22%2C%0A++++++++++++%22number%22%3A+%22212+555-1234%22%0A++++++++%7D%2C%0A++++++++%7B%0A++++++++++++%22type%22%3A+%22fax%22%2C%0A++++++++++++%22number%22%3A+%22646+555-4567%22%0A++++++++%7D%0A++++%5D%0A%7D%0A%0A%0A

Content-Type: application/jsonあなたが使用したように、それはデータを投稿する方法ではないことに注意してください、そしてデータはurlencodedされていることに注意してください、これは難しいことではないはずです、Objective-Cでそうすることについてのこのリンクを見つけました:Objective-Cで文字列をURLエンコードする

上記のリクエストを送信すると、私はこれを受け取りました:

phpコード:

<?php
$raw_json_data = $_POST['data'];
$json_data = json_decode($raw_json_data);
print_r($json_data);

結果:

stdClass Object
(
    [firstName] => John
    [lastName] => Smith
    [age] => 25
    [address] => stdClass Object
        (
            [streetAddress] => 21 2nd Street
            [city] => New York
            [state] => NY
            [postalCode] => 10021
        )

    [phoneNumber] => Array
        (
            [0] => stdClass Object
                (
                    [type] => home
                    [number] => 212 555-1234
                )

            [1] => stdClass Object
                (
                    [type] => fax
                    [number] => 646 555-4567
                )

        )

)

それはあなたが望むものです!

注: http://yourwebsite.phpのスクリプトが正しく機能せず、通常のフォームを送信することもできませんでした。サーバーの設定ミスなどの問題があるかもしれませんが、Apache2.2とPHP5.4.4と上記のコードを使用して、動作しました。

于 2012-08-16T12:52:51.057 に答える
2

に設定されたhttpヘッダーフィールドを受け入れますapplication/json。コンテンツタイプも同様です。ブラウザとサーバー間で渡されるデータが有効なjsonであるかどうかを確認することをお勧めします。に変更してtext/plain確認することもできます。

于 2012-08-09T21:15:52.783 に答える