2011-10-05 101 views
2

我使用OAuthConsumer庫由喬恩·克羅斯比(google code linkOAuthConsumer - 發送圖像服務器OAMutableURLRequest

我已經成功地建立了我的項目有訪問&請求令牌/密使與基本授權HTTP請求服務器(GET)。但現在我需要創建一個呼叫,上傳圖像到服務器...(POST)

據我發現,我需要自己定義整個httpBody(糾正我,如果我錯了)。我發現一些示例代碼將數據附加到httpBody,但我完全不知道我在做什麼。我這樣做是這樣的:

// create url request 
urlRequest = [[[OAMutableURLRequest alloc] initWithURL:urlToServerGoesHere 
              consumer:authentication.consumer 
              token:authentication.token 
              realm:nil 
              signatureProvider:nil] autorelease]; 
// apply http method on request 
[urlRequest setHTTPMethod:@"POST"]; 

// define boundary and content-type of file in header of request 
NSString* boundary = @"----IMAGE_UPLOAD"; 
NSString* contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[urlRequest setValue:contentType forHTTPHeaderField:@"Content-Type"]; 

// Create entire body 
NSMutableData* body = [NSMutableData data]; 

[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[NSData dataWithData:imageData]]; 
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

[urlRequest setHTTPBody:body]; 

當在代碼末尾應用httpBody以上,一個例外是OAMutableRequest內拋出。我在想有些事情我做錯了或沒有設置。它似乎與我沒有使用的參數數組有關...?

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]' *** Call stack at first throw:(0 CoreFoundation      0x00ddc5a9 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x00f30313 objc_exception_throw + 44 
2 CoreFoundation      0x00dd21cc -[__NSArrayI objectAtIndex:] + 236 
3 TwooWrapper       0x0000d310 -[OAMutableURLRequest parameters] + 610 
4 TwooWrapper       0x0000d45d -[OAMutableURLRequest _signatureBaseString] + 39 
5 TwooWrapper       0x0000c619 -[OAMutableURLRequest prepare] + 213 
6 TwooWrapper       0x0000c17c -[OADataFetcher 

有沒有人對如何通過的Oauth這個庫,我使用,有什麼建議或上傳文件的一些信息?將是一個很大的幫助! thx

回答

1

經過排序代碼的排序順序和http請求的正文,我設法使其工作。 這裏是什麼樣子:

// create URL from string 
NSURL* url = [[NSURL alloc] initWithString:path]; 

// create url request 
urlRequest = [[[OAMutableURLRequest alloc] initWithURL:url 
              consumer:authentication.consumer 
              token:authentication.token 
              realm:nil 
              signatureProvider:nil] autorelease]; 
[urlRequest prepare]; 
[urlRequest setHTTPMethod:@"POST"]; 

// define boundary and content-type of file in header of request 
NSString* boundary = @"----IMAGE_UPLOAD"; 
NSString* contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[urlRequest setValue:contentType forHTTPHeaderField:@"Content-Type"]; 

// Create entire body 
NSMutableData* dataRequestBody = [NSMutableData data]; 

[dataRequestBody appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[dataRequestBody appendData:[@"Content-Disposition: form-data; name=\"image\"; filename=\"upload.jpg\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[dataRequestBody appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[dataRequestBody appendData:[NSData dataWithData:imageData]]; 
[dataRequestBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 

// add 'type' parameter to request body 
[dataRequestBody appendData:[[NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\npublic\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

// Write end-boundary! 
[dataRequestBody appendData:[[NSString stringWithFormat:@"--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

[urlRequest setHTTPBody:dataRequestBody]; 

// write content length of body in header! 
[urlRequest setValue:[[NSNumber numberWithInt:[dataRequestBody length]] stringValue] forHTTPHeaderField:@"Content-Length"]; 

// do call 
dataFetcher = [[OADataFetcher alloc]init]; 
[dataFetcher fetchDataWithRequest:urlRequest delegate:self didFinishSelector:@selector(onApiSuccess:rawData:) didFailSelector:@selector(onApiFail:rawData:)]; 

我還添加了兩行代碼到一個額外的參數添加到名爲「類型」,值爲「公共」的httpbody。如果您查看所添加的數據,首先插入邊界,然後添加一些http協議(不要忘記重要的\ n \ r),然後結束邊界以標記參數的結尾。

同樣重要的是將你的正文內容的長度寫入http頭部'Content-Length',否則請求將不會發送任何數據。

希望這可以幫助別人!

+0

這似乎取代了以前的帖子參數。不爲我工作。其他職位領域必須包含在oauthSignature中,我不能在這裏看到類似的東西。你是如何解決這個問題的? – Geri

+0

OAAttachment類可以用於此嗎?或OARequestParameter? – Prat

+0

我嘗試做同樣的事情,但在POST中傳遞JSON數據。 它給我「signature_invalid」錯誤。你能指導我嗎? –

0

設置正文後是否調用了[urlRequest準備]?

在設置正文前呼叫準備。這是圖書館中的一個錯誤/錯誤特徵,因爲它期望身體擁有像foo = bar & firble = mumble的參數,所以如果你的身體看起來不那麼會崩潰。

+0

當我在設置[urlRequest setHTTPBody:body]之前[urlRequest prepare]時仍然會引發異常 – Jovan

+0

您在設置正文之前發佈了一個答案,內容是「我設法讓它工作」。 – Bryan