【问题标题】:Converting a CURL command for Objective C为 Objective C 转换 CURL 命令
【发布时间】:2012-02-17 10:56:54
【问题描述】:

我在为我的 Objective C 代码转换这个 curl 命令时遇到了困难:

curl -u 0ef106c78146a23becba9105d1e:X -H "Accept: application/json" -H "Content-Type: application/json" https://boomboom.c27.imonggo.com/api/products.json

这是我的目标 C 代码:

NSError *theError = NULL;
NSURL *theURL = [NSURL URLWithString:@"https://boomboom.c2.imonggo.com/api/products.json"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10.0f];
[theRequest setValue:@"0ef106c78146a23becba9105d1e" forHTTPHeaderField:@"username"];
[theRequest setValue:@"x" forHTTPHeaderField:@"password"];
[theRequest setValue:@"application/json" forHTTPHeaderField:@"Accept:"];
[theRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type:"];


NSURLResponse *theResponse = NULL;
NSData *theResponseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError];

我的问题很可能是标题字段。

【问题讨论】:

  • 我在你的 curl 命令中看到了-u,在你的可变请求中看到了usernamepassword。你知道你的服务器可以接受usernamepassword这样的参数吗?
  • 错误是什么?不知道怎么申请?还是没有反应? (顺便说一句,你想设置标题字段的键而不带尾随冒号。)
  • @MichaelDautermann:就是这样,我不确定我的服务器如何接受用户名和密码的参数。 (顺便说一句,我正在使用 imonggo POS 的 API)。你知道我将如何解决这个问题吗?谢谢..
  • @H2CO3:它响应但我收到错误:rror Domain=NSURLErrorDomain Code=-1012“操作无法完成。(NSURLErrorDomain 错误-1012。)”UserInfo=0x6ab39d0 {NSErrorFailingURLKey= acebonita.c2.imonggo.com/api/products.json, NSErrorFailingURLStringKey=acebonita.c2.imonggo.com/api/products.json, NSUnderlyingError=0x6ab2f40 “操作无法完成。(kCFErrorDomainCFNetwork 错误 -1012。)”} 和 HTTP Basic:访问被拒绝。我猜我的标题字段格式错误。顺便说一句,感谢有关删除冒号的建议。

标签: iphone objective-c json curl


【解决方案1】:

首先,HTTP 标头字段名称中不需要冒号。

第二,你做错了HTTP authentication。您需要连接您的用户名和密码,username:password 和 Base64 对连接的字符串数据进行编码。 使用 base64 值作为标头字段 Authorization 的值,使用下面的代码并放入 Base 64 编码 implementation

    // snip
    NSMutableUrlRequest* theRequest = [NSMutableUrlRequest ...]
    [MyClass httpAuthorizeRequest:theRequest withUsername:@"someuser" andPassword:@"mysecret"];
    // snip

+ (void)httpAuthorizeRequest:(NSMutableURLRequest*)request withUsername:(NSString*)username andPassword:(NSString*)password
{
    NSString* authorizationToken = [[NSString stringWithFormat:@"%@:%@", username, password] base64Representation];
    [request setValue:[NSString stringWithFormat:@"Basic %@", authorizationToken] forHTTPHeaderField:@"Authorization"];
}

【讨论】:

    【解决方案2】:

    您可以为 iOS 构建 cURL。这是一个 Makefile 来构建一个 iOS 库。

    将该文件作为“build-cURL.sh”保存到您的主文件夹,然后打开终端并粘贴:

    export CURL_VERSION=7.23.0 
    sh ~/build-cURL.sh
    

    然后脚本应该构建一个静态库,您可以将其添加到您的项目中。然后你会想要添加 .h 文件,它就可以开始了。

    我使用 lipo 创建了库的胖二进制文件,因此它可以在 sim 和设备中工作,从 here 下载它。然后将 curl 文件夹添加到您的项目中,并添加库。为此,请单击左上角的项目,单击目标,点击“Build Phases”选项卡,下拉“Link Binary with Libraries”,点击加号图标并选择 .a 文件。

    【讨论】:

    • 好主意,但我不知道如何为 iOS 构建 cURL。你能帮我吗?非常感谢!
    • 只需将文件作为“build-cURL.sh”保存到您的主文件夹,然后打开终端并粘贴:sh ~/build-cURL.sh 然后它将下载 cURL 源代码并构建一个静态您可以添加到项目中的库。然后你会想要添加 .h 文件,它就可以开始了。
    • 好的,我按照说明进行操作。这就是我从终端“tar:无法识别的存档格式 tar:错误退出因先前的错误而延迟。”我得到一个 curl-.tar.gz 之后我会做什么?非常感谢!
    • 抱歉 - 错过了一步。在终端中运行该命令之前,请粘贴以下内容:export CURL_VERSION=7.23.0
    • 哦!我有一个文件“curl-7.23.0.tar.gz”。那我会用它做什么呢?再次感谢:)
    【解决方案3】:

    我建议使用ASIHTTPRequest 将 cUrl 转换为 Objective C 代码。因为我已经使用它并且它很容易实现,所以我使用了 NSMutableUrlRequest 的身份验证,但它对我不起作用。所以我把这个发布给像我一样寻找答案的人。

    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:[NSURL URLWithString:@"https://acebonita.c2.imonggo.com/api/products.json"]];
    
    [request setUsername:@"0efd245bfbf6bba4106c78146a23becba9105d1e"];
    [request setPassword:@"x"];
    
    [request addRequestHeader:@"Content-Type" value:@"application/json"];
    [request addRequestHeader:@"Accept" value:@"application/json"];
    [request startSynchronous]; 
    
    if([request error])
    {
        NSLog(@"Code : %d, Error: %@",[[request error] code],[[request error] description]);
    }
    NSLog(@"Code: %d, Description: %@, Message: %@",[request responseStatusCode],[request responseData],[request responseStatusMessage]); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2017-01-01
      相关资源
      最近更新 更多