Ios 通缉:使用AFNetworking-2使用基本身份验证的JSON/POST最新示例

Ios 通缉:使用AFNetworking-2使用基本身份验证的JSON/POST最新示例,ios,objective-c,json,afnetworking,afnetworking-2,Ios,Objective C,Json,Afnetworking,Afnetworking 2,我有一个玩具应用程序,它使用基本的身份验证安全性提交https JSON/POST。我被告知我应该考虑使用网络连接。我已经能够将AFNetwork-2安装到我的XCode项目(ios7目标,XCode5)中了。但是没有一个例子与AFNetworking-2的当前版本相关,而是与以前的版本相关。这些文档非常稀少,所以我正在努力将它们组合起来。非AFN网络代码如下所示: NSURL *url = [NSURL URLWithString:@"https://xxx.yyy.zzz.aaa:bbbbb

我有一个玩具应用程序,它使用基本的身份验证安全性提交https JSON/POST。我被告知我应该考虑使用网络连接。我已经能够将AFNetwork-2安装到我的XCode项目(ios7目标,XCode5)中了。但是没有一个例子与AFNetworking-2的当前版本相关,而是与以前的版本相关。这些文档非常稀少,所以我正在努力将它们组合起来。非AFN网络代码如下所示:

NSURL *url = [NSURL URLWithString:@"https://xxx.yyy.zzz.aaa:bbbbb/twig_monikers"];
NSMutableURLRequest *request = [NSMutableURLRequest
    requestWithURL:url
    cachePolicy: NSURLRequestUseProtocolCachePolicy
    timeoutInterval: 10.0];

NSData *requestData = [NSJSONSerialization dataWithJSONObject: [self jsonDict] options: 0 error: nil];
[request setHTTPMethod: @"POST"];
[request setValue: @"application/json" forHTTPHeaderField: @"Accept"];
[request setValue: @"application/json" forHTTPHeaderField: @"Content-Type"];
[request setValue:[NSString stringWithFormat: @"%d", [requestData length]] forHTTPHeaderField: @"Content-Length"];
NSData *plainPassText = [@"app_pseudouser:sample_password" dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64PassText = [plainPassText base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength];
[request setValue:[NSString stringWithFormat: @"Basic %@", base64PassText] forHTTPHeaderField: @"Authorization"];

FailedCertificateDelegate *fcd=[[FailedCertificateDelegate alloc] init];
NSURLConnection *c=[[NSURLConnection alloc] initWithRequest:request delegate:fcd startImmediately:NO];
[c setDelegateQueue:[[NSOperationQueue alloc] init]];
[c start];
NSData *data=[fcd getData];

if (data)
    NSLog(@"Submit response data: %@", [NSString stringWithUTF8String:[data bytes]]);
我不是在找人为我写代码的人。我似乎不知道如何将AF2部分映射到这一点。欢迎提供任何链接、示例或解释

更新1

以上是已知工作的非AF版本。为了一气呵成,我试着:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer
    setAuthorizationHeaderFieldWithUsername:@"app_pseudouser"
    password:@"sample_password"];
AFHTTPRequestOperation *operation =
[manager
    PUT: @"https://172.16.214.214:44321/twig_monikers"
    parameters: [self jsonDict]
    success:^(AFHTTPRequestOperation *operation, id responseObject){
        NSLog(@"Submit response data: %@", responseObject);}
    failure:^(AFHTTPRequestOperation *operation, NSError *error){
        NSLog(@"Error: %@", error);}
];
这将产生以下错误:

2013-10-09 11:41:38.558 TwigTag[1403:60b] Error: Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x1662c1e0 {NSErrorFailingURLKey=https://172.16.214.214:44321/twig_monikers, NSErrorFailingURLStringKey=https://172.16.214.214:44321/twig_monikers}

从服务器端看,没有任何东西能通过。我不知道这是因为https还是什么,但我可以将应用程序切换回原始代码,它可以正常运行。

更新:发现下面的JSON部分适用于PUT/POST,但不适用于GET/HEAD/DELETE

经过一番争吵,并在外面帮忙,我得到了一些有用的东西,我想留下作为纪念。最后,AF2给我留下了深刻的印象。它是如此简单,我一直试图使它比本来应该更难。给定一个返回要发送的json数据包的
jsonDict
方法,我创建了以下内容:

- (void) submitAuthenticatedRest_PUT
{
    // it all starts with a manager
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    // in my case, I'm in prototype mode, I own the network being used currently,
    // so I can use a self generated cert key, and the following line allows me to use that
    manager.securityPolicy.allowInvalidCertificates = YES;
    // Make sure we a JSON serialization policy, not sure what the default is
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    // No matter the serializer, they all inherit a battery of header setting APIs
    // Here we do Basic Auth, never do this outside of HTTPS
    [manager.requestSerializer
        setAuthorizationHeaderFieldWithUsername:@"basic_auth_username"
        password:@"basic_auth_password"];
    // Now we can just PUT it to our target URL (note the https).
    // This will return immediately, when the transaction has finished,
    // one of either the success or failure blocks will fire
    [manager
        PUT: @"https://101.202.303.404:5555/rest/path"
        parameters: [self jsonDict]
        success:^(AFHTTPRequestOperation *operation, id responseObject){
            NSLog(@"Submit response data: %@", responseObject);} // success callback block
        failure:^(AFHTTPRequestOperation *operation, NSError *error){
            NSLog(@"Error: %@", error);} // failure callback block
    ];
}
3条设置语句,然后是2条消息发送,真的很简单

编辑/添加:这里有一个@jsonDict实现示例:

- (NSMutableDictionary*) jsonDict
{
    NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
    result[@"serial_id"] = self.serialID;
    result[@"latitude"] = [NSNumber numberWithDouble: self.location.latitude];
    result[@"longitude"] = [NSNumber numberWithDouble: self.location.longitude];
    result[@"name"] = self.name;
    if ([self hasPhoto])
    {
        result[@"photo-jpeg"] = [UIImageJPEGRepresentation(self.photo, 0.5)
            base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength];
}
return result;
}


它应该只返回一个带有字符串键的字典,以及作为值的简单对象(NSNumber、NSString、NSArray(我想)等等)。JSON编码器为您完成其余的工作。

Ouch,我能做些什么来避免否决票?AFNetworking主页明确鼓励在SO上提问。你为什么选择AFNetworking-2而不是NSURLSession?@Jano一些同事在看到上述内容后鼓励我查看AFNet。在观看了AFNet-2上的一些演示之后,似乎仍有一些人认为使用AFNet-2(围绕NSURLSession)提供了引人注目的优势。哇,这里有落选吗?很高兴看到正义得到了伸张。有些人是真正的混蛋-人,帮助那个家伙或STFU!反对票是在发起时。从那以后一切都很艰难。我注意到最近在SO社区中有一个真正的趋势,那就是过度治疗。令人失望。jsonDict的代码是什么样子的?它是否序列化为字符串?很好。也许也解决了我的图片上传问题。谢谢从AFNetworking文档中可以看出,默认的requestSerializer“设置为
AFHTTPSerializer
的一个实例,它序列化
GET
HEAD
DELETE
请求的查询字符串参数,或者URL表单编码HTTP消息体。”好的,但是对于GET请求,我有完全相同的设置,它给了我一个3840错误:JSON文本没有以数组或对象开头,并且允许不设置片段的选项。这对我不起作用。AFNetworking 2无法使用令牌和GET请求: