2013-07-03 29 views
5

Tôi đang sử dụng đoạn mã sau,IOS không mã hóa cộng (+) đăng nhập x-www-form-urlencoded POST yêu cầu?

NSString *jsonD = [NSString stringWithFormat:@"rawJson=%@",[fbUserInfo jsonUTF8String]]; 
NSData *myRequestData = [jsonD dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                  cachePolicy:policy timeoutInterval:20.0]; 

[ request setHTTPMethod: @"POST" ]; 
[request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[ request setHTTPBody: myRequestData ]; 

Trong mã này, tôi có ngày 2013-06-29T18:33:17+0000. Vấn đề là máy chủ của tôi nhận ngày là 2013-06-29T18:33:17 0000. Xem không gian. Tôi không biết tại sao điều này lại xảy ra.

Trả lời

4

Chỉ vì bạn chỉ định tiêu đề mã hóa không có nghĩa là NSURLRequest thực tế sẽ thực hiện thực hiện mã hóa.

Chức năng CFURLCreateStringByAddingPercentEscapes có thể mã hóa URL cho chuỗi của bạn.

Nếu bạn không quan tâm đến mã hóa và chỉ muốn gửi các chuỗi đơn giản, tôi khuyên bạn nên bỏ qua toàn bộ mã hóa và sử dụng loại nội dung "văn bản/đồng bằng".

Một tùy chọn khác sẽ là sử dụng JSON thay vì mã hóa biểu mẫu ("application/json"). JSON dễ sử dụng hơn, cả ở phía máy chủ lẫn phía máy khách. Cocoa đã xây dựng hỗ trợ cho JSON.

EDIT: Bây giờ tôi đã đọc lại mã của bạn, tôi thấy rằng bạn đặt tên biến của mình cho thấy dữ liệu đã là JSON. Nếu có, giải pháp là sử dụng loại nội dung "application/json" và đảm bảo máy chủ hiểu và giải mã đúng cách.

+0

Tôi cần mã hóa x-www-form-urlencoded? Điều này có giống nhau không? Tôi sẽ cố gắng và cho bạn biết – user960567

+0

Không nhất thiết, nếu bạn cần các đối tượng mã hóa biểu mẫu (ví dụ: các mảng, từ điển và không có gì), bạn cũng cần phải mã hóa chúng dưới dạng cặp khóa-giá trị. Đối với các chuỗi đơn giản, việc thoát là đủ. – Krumelur

+0

Đây không phải là JSON đơn giản. Nó đến từ phần thứ ba. Tôi cần mã hóa chính xác mã này dưới dạng x-www-form-urlencoded – user960567

1

Nếu bạn cần thay đổi ' ' ->'+', bạn cần tự mình thực hiện.

Xem: Objective-c iPhone percent encode a string? để mã thực hiện chuyển đổi.


Cập nhật

OK, dựa trên nhận xét của bạn, đây là một số thông tin bổ sung. Dựa trên xử lý chuỗi truy vấn cũ, '+' ký tự được chuyển thành ' ' ký tự.

Nó được lưu giữ trong các URL cũ, CGI và PHP.

Microsoft thậm chí còn có một số buggy example trình diễn nó.

Bạn có thể tránh sự cố bằng cách luôn chuyển đổi '+' thành '%2B'' ' thành '%20'.

+0

Tôi đang gửi cộng từ khách hàng. Tôi cần nhận + trên máy chủ. Tôi cần đơn giản là – user960567

+0

@ user960567 Tôi đã cập nhật bài đăng của mình với một số thông tin về lý do điều này xảy ra. –

1

Thư viện AFNetworking giải quyết nó thusly:

static NSString * AFPercentEscapedQueryStringPairMemberFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { 
    static NSString * const kAFCharactersToBeEscaped = @":/?&=;[email protected]#$()~',*"; 
    static NSString * const kAFCharactersToLeaveUnescaped = @"[]."; 

    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kAFCharactersToLeaveUnescaped, (__bridge CFStringRef)kAFCharactersToBeEscaped, CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 
+0

Bạn có quan tâm không? – FluffulousChimp

+0

Có, xin lỗi đó là loại có ý nghĩa. Quan điểm của tôi là lib của bên thứ ba không phải là giải pháp cho mọi vấn đề. Điều này không giải quyết được (tôi đoán) vấn đề, nhưng bằng cách tránh nó hoàn toàn. Tôi đã không downvote mặc dù, vì nó cung cấp một giải pháp cho vấn đề :) –

+0

Tôi đồng ý; Tôi chỉ cho thấy việc triển khai chỉ là một ví dụ về cách người khác đã giải quyết nó, chứ không phải để ủng hộ việc sử dụng thư viện đó _in toto_. – FluffulousChimp

1

Như @Krumelur đề nghị, Chức năng CFURLCreateStringByAddingPercentEscapes thể URL mã hóa chuỗi cho bạn. Và đây là mã.

static NSString * CTPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { 
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 

Và Hoàn thành giải pháp : Để mã hóa url từ các thông số sử dụng dưới mã.

/** 
get parameterized url from url and query parameters. 
*/ 
+(NSString *)getParameterizedUrl:(NSString *)url withParameters:(NSDictionary *)queryDictionary 
{ 
    NSMutableArray *mutablePairs = [NSMutableArray array]; 
    for (NSString *key in queryDictionary) { 
     [mutablePairs addObject:[NSString stringWithFormat:@"%@=%@", CTPercentEscapedQueryStringKeyFromStringWithEncoding(key, NSUTF8StringEncoding), CTPercentEscapedQueryStringValueFromStringWithEncoding(queryDictionary[key], NSUTF8StringEncoding)]]; 
    } 

    return [[NSString alloc]initWithFormat:@"%@?%@",url,[mutablePairs componentsJoinedByString:@"&"]]; 
} 

static NSString * const kCharactersToBeEscapedInQueryString = @":/?&=;[email protected]#$()',*"; 

static NSString * CTPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { 
    static NSString * const kCharactersToLeaveUnescapedInQueryStringPairKey = @"[]."; 

    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 

static NSString * CTPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) { 
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding)); 
} 

Và sử dụng trong mã của bạn như

NSString *url = [self getParameterizedUrl:@"http://www.example.com" withParameters:self.params]; 

Lưu ý: params ở đây là từ điển.

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