سؤال

أقوم بإرسال سلسلة BASE64 إلى خادم PHP وعمل بشكل جيد. الآن أريد إرسال معلمة أخرى كسلسلة. هل يمكن لأي شخص أن يخبرني ما هو الرمز الذي يحتاج إلى إضافة رمز أدناه.

يلي الرمز يعمل بشكل جيد للمعلمة واحدة. كيف يمكننا تعديله لمعلمات متعددة؟

 NSData *data = [UIImageJPEGRepresentation(imgeview.image,90) base64Encoding];

// Create your request string with parameter name as defined in PHP file
NSString *myRequestString = [NSString stringWithFormat:@"question_image=%@",data];
myRequestString = [myRequestString stringByReplacingOccurrencesOfString:
                                             @"+" withString:@"%2B"];

// Create Data from request
NSData *myRequestData = [NSData dataWithBytes:[myRequestString UTF8String] 
                                       length:[myRequestString length]];
request = [[NSMutableURLRequest alloc] initWithURL:
    [NSURL URLWithString:@"http://192.168.0.101/Mobile_tutor/webservice/question_details.php"]];
// set Request Type
[request setHTTPMethod:@"POST"];
// Set content-type
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
// Set Request Body
[request setHTTPBody:myRequestData];
// Now send a request and get Response
NSData *returnData = [NSURLConnection sendSynchronousRequest:request 
                                           returningResponse:nil 
                                                       error: nil];
// Log Response
NSString *response = [[NSString alloc] initWithBytes:[returnData bytes] 
                                              length:[returnData length]
                                            encoding:NSUTF8StringEncoding];
NSLog(@"-------------%@",response); // here you get reasponse string
هل كانت مفيدة؟

المحلول

بالنسبة لعملية الشبكة ، يتم دعم API بشكل أفضل مثل Afnetworking Witch Work Async و Way Better أفضل للتعامل معه

البرامج التعليمية لـ AFNetworking

احصل من هنا

NSArray *keys = @[@"UserID", ];
NSArray *objects = @[@(userId)];

NSDictionary *parameter = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:
                            [NSURL URLWithString:BaseURLString]];
[httpClient setParameterEncoding:AFJSONParameterEncoding];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];

NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
                                                        path:@"services/UserService.svc/GetUserInfo"
                                                  parameters:parameter];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSError* error = nil;
    id jsonObject = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
    if ([jsonObject isKindOfClass:[NSDictionary class]]) {
        // do what ever
    }
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

نصائح أخرى

نظرا ل NSDictionary "params" التي تكون مفاتيحها وقيمها سلاسل وحيث يمثل كل إدخال واحد المعلمة (الاسم/القيمة) يمكنك تحديد فئة المساعد:

@interface NSDictionary (FormURLEncoded)
-(NSData*) dataFormURLEncoded;
@end

dataFormURLEncoded إرجاع تسلسل حرف مشفر بشكل صحيح من المعلمات المحددة في القاموس.

يتم تحديد خوارزمية الترميز بواسطة W3C: بيانات النموذج المشفرة عن URL / خوارزمية الترميز / X-WWW-Form-Form-urlencoded

يمكن تنفيذه على النحو التالي:

أولاً ، وظيفة مساعد تشفر اسم المعلمة ، على التوالي قيمة المعلمة:

static NSString* x_www_form_urlencoded_HTML5(NSString* s)
{
    // http://www.w3.org/html/wg/drafts/html/CR/forms.html#application/x-www-form-urlencoded-encoding-algorithm   , Editor's Draft 24 October 2013
    CFStringRef charactersToLeaveUnescaped = CFSTR(" ");
    CFStringRef legalURLCharactersToBeEscaped = CFSTR("!$&'()+,/:;=?@~");
    
    NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
                                             kCFAllocatorDefault,
                                             (__bridge CFStringRef)s,
                                             charactersToLeaveUnescaped,
                                             legalURLCharactersToBeEscaped,
                                             kCFStringEncodingUTF8));
    return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}

أخيراً، dataFormURLEncoded يتكون تسلسل حرف للمعلمات المشفرة. سوف تتألف "المعلمة" عن طريق تسلسل المشفر name, = وترميز value:

parameter := name "=" value

بعد ذلك ، ستتألف قائمة المعلمات عن طريق تسلسل المعلمات عن طريق فصلها بواسطة "&":

parameters  := parameter ["&" parameter]

يمكن تنفيذها على النحو التالي:

@implementation NSDictionary (FormURLEncoded)

-(NSData*) dataFormURLEncoded {
    NSMutableData* data = [[NSMutableData alloc] init];
    BOOL first = YES;
    for (NSString* name in self) {
        @autoreleasepool {
            if (!first) {
                [data appendBytes:"&" length:1];
            }
            NSString* value = self[name];
            NSData* encodedName = [x_www_form_urlencoded_HTML5(name) dataUsingEncoding:NSUTF8StringEncoding];
            NSData* encodedValue = [x_www_form_urlencoded_HTML5(value) dataUsingEncoding:NSUTF8StringEncoding];
            
            [data appendData:encodedName];
            [data appendBytes:"=" length:1];
            [data appendData:encodedValue];
            first = NO;
        }
    }
    return [data copy];
}

@end

ملحوظة: يقوم تسلسل الأحرف بتشفير السلاسل باستخدام Unicode UTF-8.

مثال:

بالنظر إلى المعلمات الخاصة بك:

NSDictionary* params = @{@"a": @"a a", @"b": @"b+b", @"c": @"ü ö"};
NSData* encodedParamData = [params dataFormURLEncoded];

حاليا، encodedParamData ستضاف إلى جسمك الذي يكون نوع المحتوى application/x-www-form-urlencoded.

تصبح سلسلة المعلمة المشفرة:

A = A+A & B = B ٪ 2BB & C = ٪ C3 ٪ BC+٪ C3 ٪ B6

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top