DocuSign错误下载文件

时间:2014-03-20 15:11:21

标签: iphone objective-c docusignapi

我正在尝试实施下载信封文档的DocuSign服务的示例link,但是当执行在步骤3中到达此行时:

NSMutableString *jsonResponse = [[NSMutableString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding];

jsonResponsenil,当我打开文档时,它有很多奇怪的字符,我无法读取它。

我的downloadind代码如下:

NSString *url = @"https://demo.docusign.net/restapi/v2/accounts/373577/envelopes/08016140-e4dc-4697-8146-f8ce801abf92/documents/1";

NSMutableURLRequest *documentsRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];

[documentsRequest setHTTPMethod:@"GET"];
[documentsRequest setURL:[NSURL URLWithString:url]];
[documentsRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[documentsRequest setValue:[self jsonStringFromObject:authenticationHeader] forHTTPHeaderField:@"X-DocuSign-Authentication"];

NSError *error1 = [[NSError alloc] init];
NSHTTPURLResponse *responseCode = nil;

NSData *oResponseData = [NSURLConnection sendSynchronousRequest:documentsRequest returningResponse:&responseCode error:&error1];

NSMutableString *jsonResponse = [[NSMutableString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding];

if([responseCode statusCode] != 200){
    NSLog(@"Error sending %@ request to %@\nHTTP status code = %i", [documentsRequest HTTPMethod], url, [responseCode statusCode]);
    NSLog( @"Response = %@", jsonResponse );
    return;
}

// download the document to the same directory as this app
NSString *appDirectory = [[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent];

NSMutableString *filePath = [NSMutableString stringWithFormat:@"%@/%@", appDirectory, @"eee"];

[oResponseData writeToFile:filePath atomically:YES];
NSLog(@"Envelope document - %@ - has been downloaded to %@\n", @"eee", filePath);

1 个答案:

答案 0 :(得分:0)

如果没有来自

的数据
NSMutableString *jsonResponse = [[NSMutableString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding];

那么这意味着oResponseData很可能是nil,这意味着没有为每个信封文档正确构建URL。您是否在sample that you linked to中执行第2步,它首先检索有关信封的envelopeDocuments信息,然后动态构建每个唯一文档uri以准备下载每个文件。

您应该动态检索envelopeDocuments数据,然后动态构建每个文档,然后您的响应数据不会为零,而不是对您的网址进行硬编码。这是完整的工作样本:

- (void)getDocumentInfoAndDownloadDocuments
{

    // Enter your info:
    NSString *email = @"<#email#>";
    NSString *password = @"<#password#>";
    NSString *integratorKey = @"<#integratorKey#>";

    // need to copy a valid envelopeId from your account
    NSString *envelopeId = @"<#envelopeId#>";

    ///////////////////////////////////////////////////////////////////////////////////////
    // STEP 1 - Login (retrieves accountId and baseUrl)
    ///////////////////////////////////////////////////////////////////////////////////////

    NSString *loginURL = @"https://demo.docusign.net/restapi/v2/login_information";

    NSMutableURLRequest *loginRequest = [[NSMutableURLRequest alloc] init];
    [loginRequest setHTTPMethod:@"GET"];
    [loginRequest setURL:[NSURL URLWithString:loginURL]];

    // set JSON formatted X-DocuSign-Authentication header (XML also accepted)
    NSDictionary *authenticationHeader = @{@"Username": email, @"Password" : password, @"IntegratorKey" : integratorKey};

    // jsonStringFromObject() function defined further below...
    [loginRequest setValue:[self jsonStringFromObject:authenticationHeader] forHTTPHeaderField:@"X-DocuSign-Authentication"];

    // also set the Content-Type header (other accepted type is application/xml)
    [loginRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

    [NSURLConnection sendAsynchronousRequest:loginRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *loginResponse, NSData *loginData, NSError *loginError) {

        if (loginError) {   // succesful GET returns status 200
            NSLog(@"Error sending request %@. Got Response %@ Error is: %@", loginRequest, loginResponse, loginError);
            return;
        }

        // we use NSJSONSerialization to parse the JSON formatted response
        NSError *jsonError = nil;
        NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:loginData options:kNilOptions error:&jsonError];
        NSArray *loginArray = responseDictionary[@"loginAccounts"];

        // parse the accountId and baseUrl from the response (other data included)
        NSString *accountId = loginArray[0][@"accountId"];
        NSString *baseUrl = loginArray[0][@"baseUrl"];

        //--- display results
        NSLog(@"\naccountId = %@\nbaseUrl = %@\n", accountId, baseUrl);

        ///////////////////////////////////////////////////////////////////////////////////////
        // STEP 2 - Get Document Info for specified envelope
        ///////////////////////////////////////////////////////////////////////////////////////

        // append /envelopes/{envelopeId}/documents URI to baseUrl and use as endpoint for next request
        NSString *documentsURL = [NSMutableString stringWithFormat:@"%@/envelopes/%@/documents", baseUrl, envelopeId];

        NSMutableURLRequest *documentsRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:documentsURL]];
        [documentsRequest setHTTPMethod:@"GET"];

        [documentsRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [documentsRequest setValue:[self jsonStringFromObject:authenticationHeader] forHTTPHeaderField:@"X-DocuSign-Authentication"];

        [NSURLConnection sendAsynchronousRequest:documentsRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *documentsResponse, NSData *documentsData, NSError *documentsError) {
            NSError *documentsJSONError = nil;
            NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:documentsData options:kNilOptions error:&documentsJSONError];
            if (documentsError){
                NSLog(@"Error sending request: %@. Got response: %@", documentsRequest, documentsResponse);
                NSLog( @"Response = %@", documentsResponse );
                return;
            }
            NSLog( @"Documents info for envelope is:\n%@", jsonResponse);
            NSError *jsonError = nil;
            NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:documentsData options:kNilOptions error:&jsonError];
            // grab documents info for the next step...
            NSArray *documentsArray = responseDictionary[@"envelopeDocuments"];

            ///////////////////////////////////////////////////////////////////////////////////////
            // STEP 3 - Download each envelope document
            ///////////////////////////////////////////////////////////////////////////////////////

            NSMutableString *docUri;
            NSMutableString *docName;
            NSMutableString *docURL;

            // loop through each document uri and download each doc (including the envelope's certificate)
            for (int i = 0; i < [documentsArray count]; i++)
            {
                docUri = [documentsArray[i] objectForKey:@"uri"];
                docName = [documentsArray[i] objectForKey:@"name"];
                docURL = [NSMutableString stringWithFormat: @"%@/%@", baseUrl, docUri];

                [documentsRequest setHTTPMethod:@"GET"];
                [documentsRequest setURL:[NSURL URLWithString:docURL]];
                [documentsRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
                [documentsRequest setValue:[self jsonStringFromObject:authenticationHeader] forHTTPHeaderField:@"X-DocuSign-Authentication"];

                NSError *error = [[NSError alloc] init];
                NSHTTPURLResponse *responseCode = nil;
                NSData *oResponseData = [NSURLConnection sendSynchronousRequest:documentsRequest returningResponse:&responseCode error:&error];
                NSMutableString *jsonResponse = [[NSMutableString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding];
                if([responseCode statusCode] != 200){
                    NSLog(@"Error sending %@ request to %@\nHTTP status code = %i", [documentsRequest HTTPMethod], docURL, [responseCode statusCode]);
                    NSLog( @"Response = %@", jsonResponse );
                    return;
                }

                // download the document to the same directory as this app
                NSString *appDirectory = [[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent];
                NSMutableString *filePath = [NSMutableString stringWithFormat:@"%@/%@", appDirectory, docName];
                [oResponseData writeToFile:filePath atomically:YES];
                NSLog(@"Envelope document - %@ - has been downloaded to %@\n", docName, filePath);
            } // end for
        }];
    }];
}

- (NSString *)jsonStringFromObject:(id)object {
    NSString *string = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:object options:0 error:nil] encoding:NSUTF8StringEncoding];
    return string;
}