如何使用Three20框架上传多个图像并处理JSON响应?

时间:2010-05-12 03:56:30

标签: iphone json upload three20 asihttprequest

所以我有一个需要的iPhone应用程序:

  1. 将多个字符串和最多5个图像(存储在内存中)发布到RoR Web应用程序
  2. 解析返回的JSON,其中包含多个字符串和一组URL(每个URL代表在网站上可以找到上传图像的位置)。
  3. 问题:

    1. 这可以用Three20完成(因为我用它来做其他事情会很好吗?)如果是这样,怎么样?

    2. 如果使用Three20无法完成...如何使用ASIHttpRequest完成?或者,如果这是一个更好的选择,可能会在SDK中加入一些内容吗?

    3. 非常感谢

2 个答案:

答案 0 :(得分:4)

不幸的是,网上没有很多关于三个教程的教程和良好的文档......所以这就是我最终如何工作:

- (void) sendToWebsite {

    NSString* url = [[NSString stringWithFormat:kRequestURLPath, self.entityId] stringByAppendingString:@".json"] ;

    // Prep. the request
    TTURLRequest* request = [TTURLRequest requestWithURL: url delegate: self];
    request.httpMethod = @"POST";
    request.cachePolicy = TTURLRequestCachePolicyNoCache; 

    // Response will be JSON ... BUT WHY DO I NEED TO DO THIS HERE???
    request.response = [[[TTURLJSONResponse alloc] init] autorelease];

    // Set a header value
    [request setValue:[[UIDevice currentDevice] uniqueIdentifier] forHTTPHeaderField:@"Device-UID"];

    // Post a string
    [request.parameters setObject:self.entity_title forKey:@"entity_title"];

    // Post some images
        for (int i = 0; i < [self.photos count]; i++) {
        // IS IT POSSIBLE TO ADD A PARAM NAME SO I CAN LOOK FOR THE SAME NAME
        // IN THE WEB APPLICATION REGARDLESS OF FILENAME???
        [request addFile:UIImagePNGRepresentation([self.winnerImages objectAtIndex:i]) 
                mimeType:@"image/png" 
                fileName:[NSString stringWithFormat:@"photo_%i.png", i]];
    }

        // You rails guys will know what this is for
        [request.parameters setObject:@"put" forKey:@"_method"];

        // Send the request
    [request sendSynchronously];

}

我仍然不理解(或发现有问题)的事情:

  1. 对于已发布的文件,如何同时包含参数名称和文件名?
  2. 设置request.response =的目的是什么?我不明白。

答案 1 :(得分:1)

回答#2: 在发送请求之前,您需要为响应提供处理程序TTURLJSONResponse不是实际响应,但它负责处理响应。您可以在此处理字符串和URL数组的响应。

这是一个名为TTURLResponse的协议,它定义了以下实现方法:

/**
 * Processes the data from a successful request and determines if it is valid.
 *
 * If the data is not valid, return an error. The data will not be cached if there is an error.
 *
 * @param  request    The request this response is bound to.
 * @param  response   The response object, useful for getting the status code.
 * @param  data       The data received from the TTURLRequest.
 * @return NSError if there was an error parsing the data. nil otherwise.
 *
 * @required
 */
- (NSError*)request:(TTURLRequest*)request 
            processResponse:(NSHTTPURLResponse*)response
            data:(id)data;

您选择TTURLJSONResponse作为处理程序,这是一个直接的实现,可以帮助您自己编写。