Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone AFNetworking 2.0的POST请求不工作,但在HTTP请求测试仪中工作_Iphone_Ios_Objective C_Afnetworking_Afnetworking 2 - Fatal编程技术网

Iphone AFNetworking 2.0的POST请求不工作,但在HTTP请求测试仪中工作

Iphone AFNetworking 2.0的POST请求不工作,但在HTTP请求测试仪中工作,iphone,ios,objective-c,afnetworking,afnetworking-2,Iphone,Ios,Objective C,Afnetworking,Afnetworking 2,我刚刚开始使用新的AFNetworking 2.0API,之前的版本已经使用了一段时间。我正在尝试做一个bog标准HTTPPOST请求,但遗憾的是我做得不太好。这是我当前的代码: AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; NSDictionary *parameters = @{@"username" : self.usernameField.text,

我刚刚开始使用新的
AFNetworking 2.0
API,之前的版本已经使用了一段时间。我正在尝试做一个bog标准
HTTPPOST请求
,但遗憾的是我做得不太好。这是我当前的代码:

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];

NSDictionary *parameters = @{@"username" : self.usernameField.text,
                             @"password" : self.passwordField.text};

[operationManager POST:@"https:URL GOES HERE" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", [responseObject description]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
现在,它返回一个
JSON
(NULL)
,并没有给我一个像
404
之类的状态代码(顺便问一下,当使用AFN 2.0时,我们如何获得状态代码?)。但是,当我使用一个web应用程序(如为我测试
HTTPPOST请求
)尝试信息时,当我将用户名和密码放入
param
字段时,它就会起作用。所以我真正的问题是,为什么
AFN 2.0参数属性中的
参数
与web应用中的
参数
的作用方式不同?更一般地说,为什么
post-request参数在
afn2.0
中对我不起作用

提前感谢您的帮助,
迈克

编辑:我正在努力实施建议的修复程序。我的Post方法现在看起来像这样,但现在对我来说没有意义

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"username" : self.usernameField.text,
                             @"password" : self.passwordField.text};

operationManager.requestSerializer.queryStringSerializationWithBlock =
^NSString*(NSURLRequest *request,
           NSDictionary *parameters,
           NSError *__autoreleasing *error) {
    NSString* encodedParams = form_urlencode_HTTP5_Parameters(parameters);
    return encodedParams;
};

[operationManager POST:@"URL HERE" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", [responseObject description]);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
现在,它返回一个JSON(NULL),并没有给我404之类的状态代码(顺便问一下,当使用AFN2.0时,我们如何获得状态代码?)

它至少应该给出一个错误。故障处理程序打印出什么

所以我的问题是,为什么AFN2.0参数属性中的参数与web应用程序中的参数的作用方式不同?更一般地说,为什么AFN2.0中的post请求参数不适用于我

在检查了AFN(版本2.0.1)如何对参数进行编码后,我发现这些参数并没有按照它们应该的方式进行编码:

在修复此问题之前,您可以尝试以下解决方法。以下算法严格按照w3c针对HTTP 5的建议对参数进行编码,至少在我测试过的Mac OS X 10.8中是这样:

static NSString* form_urlencode_HTTP5_String(NSString* s) {
    CFStringRef charactersToLeaveUnescaped = CFSTR(" ");
    CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~");

    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                         kCFAllocatorDefault,
                         (__bridge CFStringRef)s,
                         charactersToLeaveUnescaped,
                         legalURLCharactersToBeEscaped,
                         kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
(注意:上面的代码取决于函数
CFURLCreateStringByAddingPercentEscapes
的实现细节。完全可以轻松地实现建议的算法,而不需要任何依赖项,我建议这样做-它不会那么短。)

然后,在使用AFN时,您可以自定义序列化算法,如下所示:

    AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];

    operationManager.requestSerializer.queryStringSerializationWithBlock = 
       ^NSString*(NSURLRequest *request,
                  NSDictionary *parameters,
                  NSError *__autoreleasing *error) {
        NSString* encodedParams = form_urlencode_HTTP5_Parameters(parameters);
        return encodedParams;
    };

/
放在url后面。我已经错过了好几个小时。

使用哪种内容类型?参数是如何编码的?编码后是否可以记录参数?(需要调试并分解为AF方法)。(最有用的是一个数据包跟踪,显示请求)好的,应该是“application/x-www-form-urlencoded”。现在,您可以检查包含编码参数的请求主体;)解码成
NSDictionary
:。您可以先将正文数据打印为NSString(UTF-8)。为了测试AFN的参数编码,您需要通过
[[NSString alloc]initWithBytes:bodyData length:[bodyData length]编码:NSUTF8StringEncoding]
创建NSString。将其打印到控制台。bodyData是一个NSData对象,它包含url表单编码的参数字符串。为了重新获取原始NSDictionary参数,请使用链接中的helper函数。请编辑您的帖子,并显示由AFNetworking编码的参数字符串,好吗?(由于正文是NSData,请在显示之前将其转换为UTF-8编码字符串)干杯,这真是彻底。我一到家就要实施这个计划,我会向你汇报的。我暂时已经做了标记,但我相信这将是正确的答案,因为在浏览之后,它是有意义的。MikeHey谢谢你的帮助,我在执行上有点困难。你能看看修改过的原始帖子吗?干杯。这意味着,你至少得到了一些东西。您现在应该确认服务器正确解释了您的参数。如果是这样,那么这个问题就结束了。关于您当前的错误:您可能没有得到JSON。您应该检查响应的内容类型标题。它的值应该是“application/json”。最好开始一个新问题并提供更多信息,特别是状态码、MIME类型和响应内容。如果可能(当然也有可能),以人类可读的格式打印内容(使用UTF-8将NSData转换为字符串)。您可以查询MIME类型的响应:
NSString*MIME=response.MIMEType
。这应该返回
application/json
。在启动连接之前,将请求的“Accept”头也设置为“application/json”是有意义的!提示:不要被一个超级方便的API误导,认为联网很容易——但仍然很难;)是的,完全正确:像
POST:parameters:…
这样的“超级方便”API将参数包装到应用程序/x-www-form-urlencoded body中。无法自定义内容类型。如果你有JSON,并且想发布JSON,你不能用这个API发布。(老实说,我觉得这些API一点用都没有)。顺便说一句:是的,与网络服务团队交谈很好,会得到更多信息。此外,似乎也是时候和AFN团队谈谈了。
    AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];

    operationManager.requestSerializer.queryStringSerializationWithBlock = 
       ^NSString*(NSURLRequest *request,
                  NSDictionary *parameters,
                  NSError *__autoreleasing *error) {
        NSString* encodedParams = form_urlencode_HTTP5_Parameters(parameters);
        return encodedParams;
    };