【问题标题】:Cocoa Base 64 Implementation for REST AuthREST Auth 的 Cocoa Base 64 实现
【发布时间】:2009-09-08 19:50:02
【问题描述】:

我可以使用干净、有效的 base64 实现来通过 HTTP 对 REST 协议进行授权。

任何人都可以帮助我或指出一个方向吗?

谢谢。

【问题讨论】:

    标签: objective-c cocoa rest


    【解决方案1】:

    您绝对不需要这样做。在高层次上,Cocoa 提供了 NSURLConnection 来进行 HTTP 身份验证。如果没有,CFHTTP API 会提供较低级别的访问权限。

    【讨论】:

    • -1:虽然 NSURLConnection 和 CFHTTPMessageRef 可以内部访问 base64 编码/解码,但它们使用的内容是不可访问的。
    • 能否提供一个同步请求的示例。如果我只使用 NSURLConnection 类就可以做到这一点,那就太好了。
    • 好吧,我通常建议不要使用同步连接。使用异步 API 并实现 -connection:didReceiveAuthenticationChallenge: 委托方法。如果您非常想使用同步 API,请构建包含用户名和密码的 URL。
    【解决方案2】:

    这个浮动的一些变体通过使用 Objective-C 类别扩展 NSStringNSData

    这是我添加到“实用程序”工具箱中的一个示例:

    标题:

    #import <Foundation/NSString.h>
    
    @interface NSString (Utilities)
    
    + (NSString *) base64StringFromData:(NSData *)data;
    
    @end    
    

    实施:

    #import "NSString+Utilities.h"
    
    @implementation NSString (Utilities)
    
    + (NSString *) base64StringFromData:(NSData *)data {
      static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    
      if ([data length] == 0)      
        return @"";
    
      char *characters = malloc((([data length] + 2) / 3) * 4);
      if (characters == NULL)
        return nil;
      NSUInteger length = 0;
    
      NSUInteger i = 0;
      while (i < [data length]) {
        char buffer[3] = {0,0,0};
        short bufferLength = 0;
        while (bufferLength < 3 && i < [data length])
          buffer[bufferLength++] = ((char *)[data bytes])[i++];
    
        //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
        characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
        characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
    
        if (bufferLength > 1)
          characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
        else characters[length++] = '=';
    
        if (bufferLength > 2)
          characters[length++] = encodingTable[buffer[2] & 0x3F];
        else characters[length++] = '=';        
      }
    
      return [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSUTF8StringEncoding freeWhenDone:YES] autorelease];
    }
    
    @end
    

    示例用法:

    NSString *inputString = @"myInputString";
    NSLog(@"%@", [NSString base64StringFromData:[inputString dataUsingEncoding:NSUTF8StringEncoding]]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2021-01-03
      • 2013-03-05
      • 1970-01-01
      相关资源
      最近更新 更多