gpt4 book ai didi

objective-c - 无法使用 NSURLConnection 使 iOS http post 正常工作

转载 作者:可可西里 更新时间:2023-11-01 04:36:03 26 4
gpt4 key购买 nike

我正在尝试使 POST 消息正常工作。我看过一些描述这样做的帖子,例如 this one ,但我仍然无法让它工作。下面是我的 objective-c 代码:

NSString * urlString = @"http://magicthegatheringdatabase.com/test.php";
NSURL *aUrl = [NSURL URLWithString: urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];

NSString *postString = [NSString stringWithFormat:@"tes1=%@&test2=%@",
[@"hello" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
[@"world" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData * postBody = [postString dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody: postBody];

[request addValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

NSString *postLength = [NSString stringWithFormat:@"%d", postBody.length];
[request addValue: postLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPMethod:@"POST"];

NSError * error = nil;
NSData *returnData = [NSURLConnection sendSynchronousRequest: request
returningResponse: nil
error: &error];
NSLog(@"%p, %@", error, error.localizedDescription);

NSString * returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(@"Result: %@", returnString);

这是我的 PHP:

<?php
print_r($_REQUEST);
print_r($_POST);
print_r($_GET);

echo file_get_contents( 'php://input' );
?>

如果我运行代码,我会记录以下内容:

2012-12-19 09:24:09.061 MTG Deck Builder[7921:570f] 0x0, (null)2012-12-19 09:24:09.062 MTG Deck Builder[7921:570f] Result: Array()Array()Array()

如果我直接导​​航到 url 并附加 ?test1=hello&test2=world(显然使用 GET 而不是 POST)我得到:

Array(    [test1] => hello    [test2] => world    [phpbb3_5e63r_u] => 1    [phpbb3_5e63r_k] =>     [phpbb3_5e63r_sid] => 7ff37e188aa8e0ab57fae6a52f0d1f7b    [__utma] => 86369156.392372889.1349352986.1352901458.1353328580.11    [__utmz] => 86369156.1351935106.8.2.utmcsr=hankinsoft.com|utmccn=(referral)|utmcmd=referral|utmcct=/website/forum/10-mtg-magic-the-gathering-trading-card-game-tcg-da/634-new-forum.html    [style_cookie] => null)Array()Array(    [test1] => hello    [test2] => world)

所以我知道我的 PHP 正在正确记录 get/requests,但我不确定为什么我通过 objective-c 代码的 POST 不起作用。我很确定我忽略了一些愚蠢的事情。关于我遗漏的任何建议?

最佳答案

这是因为 NSURLConnection 没有正确处理重定向。

当您向 URL http://magicthegatheringdatabase.com/test.php 发送 POST 请求时,服务器响应 301 Moved Permanently 并重定向到 http://www.magicthegatheringdatabase.com/test.php

NSURLConnection 不是向新 URL 发送相同的请求,而是创建一个新的 GET 请求并丢弃原始请求的 HTTPBody。此行为是由于 HTTP specifications 禁止在未经用户确认的情况下自动重定向除 HEADGET 以外的请求。将方法更改为 GET 是错误的,但至少它是一种安全方法,不会损害 HTTP 资源。

这个问题可以通过两种方式解决:

  1. 您可以简单地将请求的 URL 更改为 http://www.magicthegatheringdatabase.com/test.php

  2. 或者您可以使用委托(delegate)创建 NSURLConnection 的实例并实现 connection:willSendRequest:redirectResponse: 以便正确处理重定向,如this question 的答案。即使重定向发生变化,这也会起作用,但需要您编写更多代码,因为您需要等待响应,创建一个 NSMutableData 对象,在字节到来时附加字节并异步处理所有内容(参见 Apple Developer Documentation ) .然而,异步执行任务始终是一个好主意:如果需要,您可以取消它们,并且您不会冒长时间阻塞线程的风险(当您在主线程中时,任何超过 1 秒的时间都是长时间).

关于objective-c - 无法使用 NSURLConnection 使 iOS http post 正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13952940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com