실행중인 RoR 서버에 일부 데이터를 게시하려고 시도하고 있지만 보내려는 NSDictionary가 직렬화 후 형식화되는 방식에 문제가 있습니다.
다음은 내 Objective C 코드입니다.
- (void)registerUser:(NSString *)provider uid:(NSString *)uid
inviteCode:(NSString *)inviteCode userInfo:(NSDictionary *)userInfo
{
NSLog(@"Attempting to register user");
// Construct the data to post
NSDictionary *post = @{
@"provider": provider,
@"uid": uid,
@"invite_code": inviteCode,
@"user_info": userInfo
};
// TODO need to format better so it works with rails
NSData *data = [NSJSONSerialization dataWithJSONObject:post options:0 error:nil];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:_registerUserURL]];
[request setHTTPMethod:@"POST"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:_defaultConfig];
NSURLSessionUploadTask *task = [session uploadTaskWithRequest: request
fromData: data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", json);
}];
[task resume];
}
다음 형식으로 데이터를 RoR 서버에 게시 할 것으로 예상했습니다.
{\"user_info\":{\"name\":\"Matt Fornaciari\",\"email\":\"[email protected]\",\"city\":\"San Francisco, California\"},\"provider\":\"facebook\",\"uid\":\"10202835053250675\",\"invite_code\":\"a\"}
그러나 직렬화 프로세스는 내 사전을 중첩하는 것 같습니다.
2014-12-09T04:20:14.366921+00:00 app[web.1]: Started POST "/users/register" for 67.160.200.20 at 2014-12-09 04:20:14 +0000
2014-12-09T04:20:14.439711+00:00 app[web.1]: Completed 400 Bad Request in 22ms (Views: 0.2ms | ActiveRecord: 0.0ms)
2014-12-09T04:20:14.417370+00:00 app[web.1]: Processing by UsersController#register as */*
2014-12-09T04:20:14.417422+00:00 app[web.1]: Parameters: {"{\"user_info\":{\"name\":\"Matt Fornaciari\",\"email\":\"[email protected]\",\"city\":\"San Francisco, California\"},\"provider\":\"facebook\",\"uid\":\"10202835053250675\",\"invite_code\":\"a\"}"=>nil}
따라서 내 모든 데이터가 도착하지만 nil 값을 가리키고 모든 데이터를 Ruby에서 읽을 수 없게 만드는 키로 다른 Map 내에 중첩됩니다 . 누구든지 이것을 경험하고 조언이 있습니까?
따라서 NSJSONSerialization이 JSON을 레일스 애플리케이션에 보내는 데 잘 작동하지 않는 것 같습니다. NSData
문자열 에서 개체를 수동으로 생성하여 문제를 해결할 수있었습니다 . 아래는 매개 변수를 인코딩하는 데 사용한 코드입니다.
// Construct the data to post
NSString *post = [NSString stringWithFormat:
@"provider=%@&uid=%@&invite_code=%@&user_info[name]=%@&user_info[email]=%@&user_info[city]=%@",
provider, uid, inviteCode, userInfo[@"name"], userInfo[@"email"], userInfo[@"city"]
];
NSData *data = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
// Create and send the request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:_registerUserURL]];
[request setHTTPMethod:@"POST"];
NSURLSession *session = [NSURLSession sessionWithConfiguration:_defaultConfig];
NSURLSessionUploadTask *task = [session uploadTaskWithRequest: request
fromData: data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", json);
}];
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다