2013-01-24 17 views
7

मैं एपीआई में फ़ॉर्म-डेटा के साथ एक साधारण पोस्ट अनुरोध करने की कोशिश कर रहा हूं लेकिन मुझे हमेशा स्थिति 401 मिलती है।AFNetworking पोस्ट फॉर्म-डेटा

मैं आसानी से एक्सकोड (उदाहरण के लिए पोस्टमैन में) के बाहर कॉल कर सकता हूं, मैं जो भी फॉर्म-डेटा प्रकार के कुंजी-मूल्य जोड़े के साथ यूआरएल में पोस्ट करता हूं लेकिन एक्सकोड में यह हमेशा विफल रहता है।

@implementation UnpaktAPIClient 

+ (id)sharedInstance { 
    static UnpaktAPIClient *__sharedInstance; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     __sharedInstance = [[UnpaktAPIClient alloc] initWithBaseURL:[NSURL URLWithString:UnpaktAPIBaseURLString]]; 
    }); 
    return __sharedInstance; 
} 

- (id)initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 
    if (self) { 
     [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
     [self setParameterEncoding:AFFormURLParameterEncoding]; 
    } 
    return self; 
} 

- (NSDictionary *)login:(NSDictionary *)credentials { 

    [[UnpaktAPIClient sharedInstance] postPath:@"/api/v1/users/login" 
            parameters:credentials 
             success:^(AFHTTPRequestOperation *operation, id response) { 
              NSLog(@"success"); 
             } 
             failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
              NSLog(@"%@", error); 
             }]; 

    return nil; 
} 

मैं भी एक requestOperation के साथ एक अनुरोध बनाने का प्रयास किया है::

यहाँ मेरी AFHTTPClient है

- (NSDictionary *)login:(NSDictionary *)credentials { 

    NSMutableURLRequest *request = [[UnpaktAPIClient sharedInstance] requestWithMethod:@"POST" path:@"/api/v1/users/login" parameters:credentials]; 

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                         success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json) { 
                          NSLog(@"success"); 
                         } 
                         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id json){ 
                          NSLog(@"%@", error); 
                         }]; 
    [operation start]; 

    return nil; 
} 

लेकिन मैं ठीक उसी त्रुटि हर समय मिलता है: Error Domain=AFNetworkingErrorDomain Code=-1011 "Expected status code in (200-299), got 401"। मैं जेएसओएन फीडबैक की उम्मीद कर रहा हूं, आप संलग्न तस्वीर में सफलता की स्थिति देख सकते हैं। मुझे संदेह है कि यह कुछ आसान है लेकिन मैं इसे ढूंढने की कोशिश कर अपने बालों को खींच रहा हूं, मैं नेटवर्किंग के लिए काफी नया हूं। कोई मदद अद्भुत होगा, धन्यवाद। Postman Success

अद्यतन

के बाद से डाकिया अनुरोध खाली पैरामीटर और हेडर है, मैं समझ रहा प्रपत्र शरीर को पाने के लिए की जरूरत है। करने के लिए अनुरोध बदलना:

- (NSDictionary *)login:(NSDictionary *)credentials { 

    NSURLRequest *request = [self multipartFormRequestWithMethod:@"POST" 
                  path:@"/api/v1/users/login" 
                 parameters:nil 
             constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 

             }]; 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                         success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json) { 
                          NSLog(@"success"); 
                         } 
                         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id json) { 
                          NSLog(@"%@", error); 
                         }]; 
    [operation start]; 
    return nil; 
} 

अब मुझे एक 404 त्रुटि है, जो है जो मैं एक मान्य ईमेल और पासवर्ड के बिना उम्मीद करेंगे देता है, मैं सिर्फ फार्म, कुछ भी शरीर के लिए एक जोड़ने के लिए कैसे यह पता लगाने की जरूरत है मैं जोड़ने की कोशिश करता हूं मुझे "अनुरोध शरीर स्ट्रीम समाप्त हो गया" त्रुटि देता है।

+0

तो अपने URL में प्रोटोकॉल को शामिल किया है, उदाहरण के http: //? –

+0

हां, त्रुटि यूआरएल जो रिपोर्ट हो जाता है वह सही है जिसके लिए मुझे प्रमाणीकरण करना चाहिए। – hokiewalrus

+1

यह बुनियादी http प्रमाणीकरण के साथ समस्या हो सकती है। बुनियादी प्रमाणीकरण के लिए, यह मेरे लिए काम करता है: NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: @ ""]]; // tmpbase 64 प्रारूप उपयोगकर्ता नाम में क्रेडेंशियल्स का बेस 64 है: पासवर्ड एनएसएसटींग * authValue = [एनएसएसटींग स्ट्रिंगविथफॉर्मैट: @ "बेसिक% @", tmpBase64]; [अनुरोध सेट वैल्यू: एचटीटीपीएचडर फ़ील्ड के लिए authValue: @ "प्रमाणीकरण"]; –

उत्तर

8

समझ लिया, पता चला है यह एक छोटे फार्म-डेटा के लिए कुंजी/मान जोड़े को जोड़ने के लिए वर्बोज़ लेकिन मैं यह तो जैसे पूरा किया है:

NSMutableData *email = [[NSMutableData alloc] init]; 
NSMutableData *password = [[NSMutableData alloc] init]; 
[email appendData:[[NSString stringWithFormat:@"[email protected]"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[password appendData:[[NSString stringWithFormat:@"qwerty"] dataUsingEncoding:NSUTF8StringEncoding]]; 
[formData appendPartWithFormData:email name:@"email"]; 
[formData appendPartWithFormData:password name:@"password"];