4

私はiPhoneでプロジェクトをやっています。ここでは、POSTリクエストをWebサービスに送信する必要があります。NSMutableURLRequestとNSURLConnectionを使用してデータを送信し、サーバーはPHPを使用します。if ($_SERVER['REQUEST_METHOD'] != "POST")ローカルホストで試しても、「GET」が返されるように、チェックは常に失敗することがわかりました。

私のPOSTリクエストは次のようになります(Wiresharkを介してスニッフィングされます):

POST tester.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/tester.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 422

protocol=4&msgtype=authorize&merchant=86189919&language=da&ordernumber=1274168351&amount=100&currency=DKK&continueurl=http%3A%2F%2Fquickpay.net%2Ffeatures%2Fpayment-window%2Fok.php&cancelurl=http%3A%2F%2Fquickpay.net%2Ffeatures%2Fpayment-window%2Ferror.php&callbackurl=http%3A%2F%2Fquickpay.net%2Ffeatures%2Fpayment-window%2Fcallback.php&autocapture=0&cardtypelock=&splitpayment=1&md5check=d2259d9db077e0f5a41b4bf271c3c549

もちろん、そこにはダミーのテキストがたくさんあり、通常はiPhoneからは表示されませんが、私はhtmlフォームを介して同じ呼び出しを行おうとしましたが、それはうまくいきました。したがって、私はすべての情報をコピーして、それが違いを生むかどうかを確認しましたが、役に立ちませんでした。

2つのリクエスト(1つはiPhoneから、もう1つは私のphpページから)を比較しましたが、まったく同じように見えます。

私はびっくりしました-誰かが何をすべきかについて良いアドバイスがありますか?

編集:

あなたのテストはpostまたはpostvsgetをテストしていません、具体的にはPOSTをテストしています、そこでケースの問題がある可能性があります... phpでリクエスト自体を調べてみましたか?–グレイディプレーヤー

はい、それは本当かもしれませんが、行は常にGETを返すので、それがあなたの言いたいことであれば、ケースの問題はカバーされています。

また、iPhoneがリクエストを送信したときにサーバーからprint_r($ _ SERVER)の結果を投稿してください– Aleks G

Array(HTTP_HOST => 10.11.105.254 HTTP_USER_AGENT => Mozilla / 5.0(iPhone Simulator; MacOSXのようなCPUiPhoneOS 5_1)AppleWebKit / 534.46(GeckoのようなKHTML)Mobile / 9B176 HTTP_ACCEPT => text / html、application / xhtml + xml、application / xml; q = 0.9、/; q = 0.8 HTTP_ACCEPT_LANGUAGE => en-us HTTP_ACCEPT_ENCODING => gzip、deflate HTTP_CONNECTION => keep-alive PATH => / usr / bin:/ bin:/ usr / sbin:/ sbin SERVER_SIGNATURE => Apache / 2.2.21(Unix )DAV / 2 PHP / 5.3.8 with Suhosin-Patch Server at 10.11.105.254 Port 80 SERVER_SOFTWARE => Apache / 2.2.21(Unix)DAV / 2 PHP / 5.3.8 with Suhosin-Patch SERVER_NAME => 10.11.105.254 SERVER_ADDR => 10.11.105.254 SERVER_PORT => 80 REMOTE_ADDR => 10.11.105.254 DOCUMENT_ROOT => / Library / WebServer / Documents SERVER_ADMIN => you@example.com SCRIPT_FILENAME => /Users/tester.php REMOTE_PORT => 51492 GATEWAY_INTERFACE => CGI / 1.1 SERVER_PROTOCOL => HTTP / 1.1 REQUEST_METHOD => GET QUERY_STRING => REQUEST_URI => /tester.php SCRIPT_NAME => /tester.php PHP_SELF => /tester.php REQUEST_TIME => 1334211212 argv =>配列argc=>0)

$ _POST ['known_to_be_set_by_client']などの既知の変数が設定されているかどうかを確認してみましたか?リクエストがPOSTかGETかを判断するのはPHPではなく、Webサーバーです。–ティム・ポスト

iPhoneリクエストから既知の変数をエコーし​​ようとすると、もちろん空になります。これは理にかなっています。フォームから同じものをエコーすると、そこにあります。

実際のリクエストを行うために使用しているiOSコードを投稿してください。–クリフリバウド

リクエストを作成して送信するコードは次のとおりです。

//variables
NSString *protocol = @"4";
NSString *msgtype = @"authorize";
NSString *merchant = @"86189919";
NSString *language = @"da";
NSString *orderNo = @"1274168351";
NSString *amount = @"100";
NSString *currency = @"DKK";
NSString *continueURL = @"http://quickpay.net/features/payment-window/ok.php";
NSString *cancelURL = @"http://quickpay.net/features/payment-window/error.php";
NSString *callbackURL = @"http://quickpay.net/features/payment-window/callback.php";
NSString *autoCapture = @"0";
NSString *cardtypeLock =@"";
NSString *splitText = @"1";
NSString *md5check = @"d2259d9db077e0f5a41b4bf271c3c549";

//setting up the request
NSMutableString *post = [[NSMutableString alloc] initWithString:@"protocol="];
[post appendString:protocol];

[post appendString:@"&msgtype="];
[post appendString:msgtype];

[post appendString:@"&merchant="];
[post appendString:merchant];

[post appendString:@"&language="];
[post appendString:language];

[post appendString:@"&ordernumber="];
[post appendString:orderNo];

[post appendString:@"&amount="];
[post appendString:amount];

[post appendString:@"&currency="];
[post appendString:currency];

[post appendString:@"&continueurl="];
[post appendString:continueURL];

[post appendString:@"&cancelurl="];
[post appendString:cancelURL];

[post appendString:@"&callbackurl="];
[post appendString:callbackURL];

[post appendString:@"&autocapture="];
[post appendString:autoCapture];

[post appendString:@"&cardtypelock="];
[post appendString:cardtypeLock];

[post appendString:@"&splitpayment="];
[post appendString:splitText];

[post appendString:@"&md5check="];
[post appendString:md5check];


//escape characters
NSString *tmp = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(
                                        NULL, 
                                        (__bridge CFStringRef)post, 
                                        NULL, 
                                        (CFStringRef)@";/:@+$,~", 
                                        kCFStringEncodingUTF8
                                        );


NSData *body = [tmp dataUsingEncoding:NSUTF8StringEncoding];
//setup url
NSString *urlString =@"http://10.10.225.255/tester.php";
NSURL *quickUrl = [NSURL URLWithString:urlString];

//setup URL request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
//method
[request setHTTPMethod:@"POST"];
//url
[request setURL:url];

//body data to string
NSString *strData = [[NSString alloc]initWithData:body encoding:NSUTF8StringEncoding];

//content length
NSString *postLenght = [NSString stringWithFormat:@"%d", [body length]];

//set body
[request setHTTPBody:body];

//Dummy data to make the request look like the same from the HTML form.
[request setValue:@"localhost" forHTTPHeaderField:@"Host"];
[request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:10.0.2) Gecko/20100101 Firefox/10.0.2" forHTTPHeaderField:@"User-Agent"];
[request setValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" forHTTPHeaderField:@"Accept"];
[request setValue:@"en-us,en;q=0.5" forHTTPHeaderField:@"Accept-Language"];
[request setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"];
[request setValue:@"http://localhost/tester.php" forHTTPHeaderField:@"Referer"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setValue:postLenght forHTTPHeaderField:@"content-length"];

//send the request to server
if([[NSURLConnection alloc] initWithRequest:request delegate:self]){
    NSLog(@"sending data to quickpay"); 
} 
4

2 に答える 2

1

(これは答えというよりコメントです)もし

if ($_SERVER['REQUEST_METHOD'] != "POST")

常に失敗します(質問に書き込むとき)。これは、次のことを意味する必要があります

$_SERVER['REQUEST_METHOD'] == "POST"

したがって、間違った質問をしたか、入力値を適切に検証していません。var_dump($_SERVER)の出力を質問に追加してください。

于 2012-04-11T14:01:58.910 に答える
0

私はそれを考え出した。さすが、私一人の見落としでした!UIWebViewにURLをロードするときに、デリゲートでloadRequestメソッドを使用しました。もちろん、このメソッドはGETリクエストを使用してコンテンツを返します。代わりに、loadHTMLString:baseURL:メソッドを使用して、返されたデータをロードする必要がありました。このエラーは、アプリが最初のPOSTの後に別のGETリクエストを発行したことを意味し、エラーが発生しました。明らかに、私はこの余分な要求に長い間気づいていませんでした。

于 2012-04-25T07:53:43.443 に答える