Есть ли способ привязать NSDictionary параметров к NSURLRequest вместо того, чтобы вручную создавать строку?

AFNetworking позволяет добавить в запрос NSDictionary параметров, и он добавит их в запрос. Поэтому, если бы я хотел сделать запрос GET с ?q=8&home=8888, я бы просто просто сделал NSDictionary, например @{@"q": @"8", @"home": @"8888"}.

Есть ли способ сделать это с помощью NSURLSession/NSURLConnection/NSURLRequest?

Я знаю, что я могу использовать NSJSONSerialization для добавления данных JSON, но что, если я просто хочу, чтобы они были как GET параметры в URL? Должен ли я просто добавить категорию?

Ответы

Ответ 1

Вы можете сделать это, обновив URL-адрес, используя NSURLComponents и NSURLQueryItems. В следующем примере предположим, что параметр URL уже установлен в NSMutableURLRequest. Вы можете изменить его перед использованием, чтобы включить каждый параметр из NSDictionary params. Обратите внимание, что каждый параметр кодируется до его написания.

NSURLComponents *url = [[NSURLComponents alloc] initWithURL:request.URL resolvingAgainstBaseURL:YES];
NSMutableArray *queryItems = NSMutableArray.new;
[params enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSString *value, BOOL *stop) {
    [queryItems addObject:[NSURLQueryItem queryItemWithName:name
                           value:[value stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]]];
            }];
url.queryItems = queryItems;
request.URL = url.URL;

Ответ 2

ПОПРОБУЙТЕ НИЖЕ РАБОЧИЙ КОД

// Create the request.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"YOUR URL"]];

// Specify that it will be a POST request
request.HTTPMethod = @"POST";

// This is how we set header fields
[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];


// Convert your data and set your request HTTPBody property

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"44",@"UserId",@"0",@"NewsArticleId",@"",@"Date", nil];
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];

request.HTTPBody = jsonData;


// Create url connection and fire request
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];

Ответ 3

Пример использования NSURLSession:

NSURLSession *session = [NSURLSession sharedSession];
//populate json
NSDictionary *gistDict = @{@"files":@"test",@"description":@"test"};
NSError *jsonError;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:gistDict options:NSJSONWritingPrettyPrinted error:&jsonError];
//populate the json data in the setHTTPBody:jsonData    
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://yourURL"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:jsonData];
//Send data with the request that contains the json data 
[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // Do your stuff...
}] resume];