2012-04-10 31 views
7

Tôi có một ứng dụng trong đó khi nhấp vào nút, tôi đang chuyển phương thức api máy chủ của mình gọi phương thức đăng JSON và lưu dữ liệu vào cơ sở dữ liệu máy chủ. và số điện thoại di động khẩn cấp không có trong máy chủ. Số điện thoại di động của tôi ở dạng chuỗi. Trong biến số chuỗi di động của tôi, số điện thoại di động của tôi đang được lưu ở định dạng này '+ 90-9491491411'.Tôi đang nhập + và sau đó mã và sau đó- và sau đó là số nhưng khi tôi gửi đến cơ sở dữ liệu máy chủ, tôi đang xóa - và gửi không cho cơ sở dữ liệu nhưng vấn đề nằm trong cơ sở dữ liệu máy chủ của tôi + của điện thoại di động không được nhập mà tôi đang nhập. Có thể là vấn đề. POST để gửi yêu cầu. Đây là mã của tôithêm + trước khi sử dụng% 2b bằng cách sử dụng mã hóa url trong iphone

-(void)sendRequest 
{ 

    NSString *newstring = txtMobile.text; 
    mobileValue = [newstring stringByReplacingOccurrencesOfString:@"-" withString:@""]; 
    NSLog(@"%@",mobileValue); 



    NSString *newString1 = txtemergencyprovider.text; 
    emergencyNumber = [newString1 stringByReplacingOccurrencesOfString:@"-" withString:@""]; 


     NSLog(@"%@",emergencyNumber); 
    if ([txtEmail.text isEqualToString:@""]) 
    { 
     post = [NSString stringWithFormat:@"CommandType=new&ApplicationType=%d&FullName=%@&Mobile=%@&EmergencymobileNumber=%@&Latitude=%f&Longitude=%f&City=%@&MobileModel=Apple",applicationtype,txtFullname.text,mobileValue,emergencyNumber,latitude,longitude,txtCity.text]; 
     NSLog(@"%@",post); 
    } 
    else { 
     post = [NSString stringWithFormat:@"CommandType=new&ApplicationType=%d&FullName=%@&Mobile=%@&EmergencymobileNumber=%@&Latitude=%f&Longitude=%f&City=%@&EmailAddress=%@&MobileModel=Apple",applicationtype,txtFullname.text,mobileValue,emergencyNumber,latitude,longitude,txtCity.text,txtEmail.text]; 
     NSLog(@"%@",post); 
    } 


    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 
    NSLog(@"%@",postLength); 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"http://myapi?RequestType=NEW"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (theConnection) { 
     webData = [[NSMutableData data] retain]; 
     NSLog(@"%@",webData); 
    } 
    else 
    { 

    } 

} 

// Trong số điện thoại di động của tôi và biến số emrgency tôi không có định dạng này '+91986444711' nhưng khi giá trị được nhập vào trong cơ sở dữ liệu máy chủ + bị loại bỏ .What có thể là prob.

+0

http://stackoverflow.com/questions/7088079/how-to-pass-an-string-value-in-url-in-iphone-app/10054500#10054500 – dayitv89

Trả lời

16

Thật không may, NSString 's -stringByAddingPercentEscapesUsingEncoding: sẽ không chuyển đổi các cộng (+) đăng nhập vào %2B vì vào dấu cộng là một nhân vật URL hợp lệ được sử dụng để truy vấn riêng biệt thông số. Điều này thường có nghĩa là nó được chuyển đổi thành ký tự khoảng trắng bởi máy chủ web.

Cách dễ nhất để thay thế dấu cộng sẽ sử dụng NSString 's stringByReplacingOccurrencesOfString:withString: để thay thế + bằng %2B. Ví dụ:

mobileValue = [mobileValue stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; 
1

Dấu cộng ("+") trong URL có nghĩa là không gian được mã hóa ("") và rất có thể máy chủ của bạn sẽ diễn giải nó dưới dạng không gian. Thay đổi ký tự cộng thành% 2B trong chuỗi trước khi đăng. Để có giải pháp hoàn chỉnh về mã hóa URL, hãy xem bài đăng này: http://madebymany.com/blog/url-encoding-an-nsstring-on-ios

+1

Tôi đã đã xem xét liên kết bạn đã đăng và đó là giải pháp tuyệt vời cho vấn đề. Tuy nhiên, vì nó đứng nó không tuân theo các quy tắc chính sách quản lý bộ nhớ. Nó trả về một đối tượng được giữ lại nhưng tên phương thức không gợi ý cho người gọi rằng họ đang chiếm quyền sở hữu đối tượng. Tôi đã để lại một bình luận trên bài đăng blog cho thấy rằng một autorelease được thêm vào trước khi phương thức trả về chuỗi thoát URL. – mttrb

+0

tuyệt vời! bạn hoàn toàn đúng về vấn đề quản lý bộ nhớ và về giải pháp, tôi đã không nhận thấy nó. – MrTJ

0

Dấu cộng có nghĩa là dấu cách trong yêu cầu đăng. Bạn cần phải chuyển đổi dấu cộng thành ký tự thoát phần trăm. Cách dễ nhất để làm điều này là như sau:

NSString* escapedMobileValue = [mobileValue stringByReplacingOccurencesOfString: @"+" withString: @"%2b"]; 

này sẽ xoay + vào %2b. Có lẽ máy chủ sẽ tự động đảo ngược mã hóa cho bạn.

(Edited phù hợp với bình luận mttrb của)

+0

Trên thực tế, điều này để lại dấu + như nó đã được. Dấu + là ký tự hợp lệ trong URL do-stringByAddingPercentEscapesUsingEncoding: không thoát khỏi nó. – mttrb

+0

@mttrb: Arrgh, bạn nói đúng. Tôi cho rằng tài liệu của Apple gây hiểu lầm ở đây. – JeremyP

Các vấn đề liên quan