AFNetworking 获取完整的 http 响应
Posted
技术标签:
【中文标题】AFNetworking 获取完整的 http 响应【英文标题】:AFNetworking Get full http response 【发布时间】:2013-08-22 16:14:32 【问题描述】:我正在使用AFNetworking
查询我的服务器,这是最新的版本。
我的服务器端 php 正在发送一个与 PHP 相关的错误,但我无法看到错误是什么(因此我可以调试它),因为 AFNetworking 需要一个 JSON。
谁能告诉我如何查看完整的 HTTP 结果。我已经研究过,我知道与success
/ fail
块内的operation.responseString
有关,我当前的块没有AFHTTPRequestOperation* operation
,我无法以某种方式将其添加为另一个块变量。
非常感谢您的帮助。
以下代码使用
NSURL *url = [[NSURL alloc]initWithString:URL];
AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:url];
NSURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:URLPATH parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
//...
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
NSLog(@"Inside the success block %@",JSON);
[[self delegate ]shareExerciseDone:JSON];
[[self delegate] activityIndicatorFinish];
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
NSLog(@"Response text is: %@", operation.responseString);
NSLog(@"json text is: %@", JSON);
NSLog(@"Request failed with error: %@, %@", error, error.userInfo);
[[self delegate] activityIndicatorFinish];
];
[operation start];
错误
Request failed with error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0xc1b4520 NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.,
NSDebugDescription = "JSON text did not start with array or object and option to allow fragments not set.";
【问题讨论】:
您在寻找response.statusCode
还是response.allHeaderFields
? NSHTTPURLResponse documentation
不,我需要 PHP 输出的完整 html 文本。我想看看它失败的地方以及发送的不是 JSON 的内容
【参考方案1】:
不要使用AFJSONRequestOperation
,只需使用AFHTTPRequestOperation
。
【讨论】:
是的,这个或者使用像 Charles Web 调试代理这样的代理。【参考方案2】:为了将图像从 ios 上传到服务器,我使用的是 Afnetworking
你可以试试这个代码吗?你会得到成功或失败的响应。
NSData *userImgToUpload = UIImagePNGRepresentation(userImg.image);
NSURL *url = [NSURL URLWithString:@"www.domainname.com"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSLog(@"%@",@"Uploading data");
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:usernameTxt.text,@"username", firstnameTxt.text,@"first_name",lastnameTxt.text,@"last_name", nil];
// Upload Image
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/addPatient" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
[formData appendPartWithFileData:userImgToUpload name:@"patientimage" fileName:[NSString stringWithFormat:@"%@.png",usernameTxt.text] mimeType:@"image/png"];
];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"response: %@",[operation.responseString objectFromJSONString]);
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Upload Failed");
NSLog(@"error: %@", [operation error]);
];
[operation start];
【讨论】:
【参考方案3】:您应该监听在操作开始和结束时触发的AFNetworkingOperationDidStartNotification
和AFNetworkingOperationDidFinishNotification
事件:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(YourOperationStartMethod:)
name:AFNetworkingOperationDidStartNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(YourOperationFinishMethod:)
name:AFNetworkingOperationDidFinishNotification
object:nil];
您可以像这样从通知中获取操作对象:
AFHTTPRequestOperation *operation =
(AFHTTPRequestOperation *) [notification object];
此operation
对象包含request
和response
属性。
可以在 AFHTTPRequestOperationLogger 插件中找到所有这些工作原理的一个很好的示例(当然,您可以简单地使用它,而不是自己编写东西)。
【讨论】:
以上是关于AFNetworking 获取完整的 http 响应的主要内容,如果未能解决你的问题,请参考以下文章
如何从服务器获取 AFNetworking 中的完整响应字符串?
AFNetworking:从 Http 响应中获取 JSON 值