我有一个玩具应用程序,它使用基本身份验证安全性提交了https JSON /
POST。有人告诉我应该考虑使用AFNetworking。我已经能够将AFNetwork-2安装到我的XCode项目(ios7目标,XCode5)中。但是,那里的示例似乎都与AFNetworking-2的当前版本无关,而与以前的版本有关。AFNetworking文档非常稀疏,因此我在努力将各个部分放在一起。非AFNetworking代码如下所示:
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]]);
我不是在寻找有人为我编写代码。我只是似乎无法弄清楚如何将AFNetworking-2部分映射到该部分。非常欢迎任何链接,示例或解释。
更新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
经过一番争执,在SO的帮助下,我得到了一些工作,我想把它留作纪念。最后,AFNetworking-2给我留下了非常深刻的印象。它是如此简单,我一直努力使它变得比原来更难。给定一个jsonDict
返回要发送的json数据包的方法,我创建了以下代码:
- (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编码器将为您完成其余工作。
问题内容: 以下代码成功连接到我的Ruby on Rails API,并使用AFNetworking返回JSON。我需要做什么来进行编辑以传递用户名和密码,以便我的API可以使用HTTP基本身份验证? 我已经阅读了他们的文档,但是我对Objective-C和AFNetworking还是陌生的,目前还没有意义。 问题答案: AFNetworking 2.x的答案已更新 对于AFNetworking
问题内容: 使用基本身份验证进行身份验证时遇到问题。我正在使用符合协议的标准枚举来构造我的请求。问题是,当我在枚举中手动设置授权标头时,如下所示: 我总是收到401未经授权的回复。 但是, 如果我像这样使用回调设置密码: 它正确认证。我希望能够在符合的枚举中手动进行设置,而不是在中传递凭据。 我知道它正在使用身份验证挑战的后台,但我希望能够手动设置它。 这是我的实现: 问题答案: 最终弄清楚了问题
问题内容: 如何在Golang网站上实施基本身份验证?这样,当有人访问某个页面时,他们的 浏览器 会提示他们登录。 问题答案: 为了强制用户进行身份验证/在用户浏览器中显示基本身份验证提示,请发送标头 因此,如果您有通话,您可以 这将导致浏览器打开您所指的提示。
我正在尝试实现一个简单的发布到URL,该URL在上接受正文中的基本身份验证。 我尝试过但我被,我的数据被发送到服务器。 我尝试的另一种方法是使用,但现在我遇到了一个不同的问题。身份验证工作完美,但数据没有发送到服务器... 为了确保,我在一个简单的Java项目(不是Android环境)中设置了一个小测试。 这是我用来到服务器的代码: Java项目中的代码运行良好。 当我在Android中尝试完全相
问题内容: 我已经使用JAX-RS,Jersey和Grizzly编写了一个简单的REST服务器。这是我启动服务器的方式: 现在,我需要使用基本HTTP身份验证来保护资源,而且我不知道该怎么做。 如果可以更轻松地使它工作,我可以从Grizzly切换到Jetty,但是我确实很看重Grizzly提供的简单配置/启动。 我读了很多教程。他们都提到了web.xml,但是在我当前的配置中我没有一个。(我需要为
在SpringBoot中,我试图创建一个RestTemplate,它将使用 然后,我在我的服务类中注入RestTem板作为 但是,我的请求失败了401未经授权的例外: 使用另一个REST客户端(Postman),对同一URL的请求成功,因此我假设基本身份验证工作不正常。从调试输出来看,似乎未设置身份验证标头。是什么让这一切起作用的?