programing

NSURLRequest를 사용하여 Http 요청에서 json 데이터를 전송하는 방법

batch 2023. 3. 7. 21:12
반응형

NSURLRequest를 사용하여 Http 요청에서 json 데이터를 전송하는 방법

저는 objective-c에 처음 와서 최근 들어 요청/응답에 많은 노력을 기울이기 시작했습니다.(http GET 경유로) URL을 호출하여 반환된 json을 해석할 수 있는 작업 예를 가지고 있습니다.

이 작업의 예는 다음과 같습니다.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
  NSLog([NSString stringWithFormat:@"Connection failed: %@", [error description]]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    [connection release];
  //do something with the json that comes back ... (the fun part)
}

- (void)viewDidLoad
{
  [self searchForStuff:@"iPhone"];
}

-(void)searchForStuff:(NSString *)text
{
  responseData = [[NSMutableData data] retain];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.whatever.com/json"]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

첫 번째 질문은 이 접근 방식이 확장될 것인가 하는 것입니다.또는 비동기(앱이 응답을 기다리는 동안 UI 스레드를 차단함)가 아닐까요?

두 번째 질문은 GET 대신 POST를 수행하기 위해 이 요청 부분을 어떻게 수정해야 합니까?단순히 Http Method를 그렇게 수정하는 건가요?

[request setHTTPMethod:@"POST"];

마지막으로 json 데이터 세트를 간단한 문자열로 이 게시물에 추가하려면 어떻게 해야 합니까(예:

{
    "magic":{
               "real":true
            },
    "options":{
               "happy":true,
                "joy":true,
                "joy2":true
              },
    "key":"123"
}

잘 부탁드립니다.

다음 작업을 수행합니다(서버로 전송되는 JSON은 키 = 질문에 대해 하나의 값(다른 사전)을 가진 사전이어야 합니다. 즉, {:question = > {dictionary } } } ) 。

NSArray *objects = [NSArray arrayWithObjects:[[NSUserDefaults standardUserDefaults]valueForKey:@"StoreNickName"],
  [[UIDevice currentDevice] uniqueIdentifier], [dict objectForKey:@"user_question"],     nil];
NSArray *keys = [NSArray arrayWithObjects:@"nick_name", @"UDID", @"user_question", nil];
NSDictionary *questionDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

NSDictionary *jsonDict = [NSDictionary dictionaryWithObject:questionDict forKey:@"question"];
          
NSString *jsonRequest = [jsonDict JSONRepresentation];

NSLog(@"jsonRequest is %@", jsonRequest);

NSURL *url = [NSURL URLWithString:@"https://xxxxxxx.com/questions"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
             cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];


NSData *requestData = [jsonRequest dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: requestData];

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
if (connection) {
 receivedData = [[NSMutableData data] retain];
}

수신한 데이터는 다음에 의해 처리됩니다.

NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *jsonDict = [jsonString JSONValue];
NSDictionary *question = [jsonDict objectForKey:@"question"];

이것은 100% 명확하지 않기 때문에 다시 읽어야 합니다.다만, 모든 것을 여기에 두면 시작할 수 있습니다.제가 봤을 때 이건 비동기식입니다.이러한 콜이 발신되는 동안에는 UI가 잠기지 않습니다.

나는 한동안 이것과 씨름했다.서버에서 PHP를 실행하고 있습니다.이 코드는 json을 게시하고 서버로부터 json 응답을 가져옵니다.

NSURL *url = [NSURL URLWithString:@"http://example.co/index.php"];
NSMutableURLRequest *rq = [NSMutableURLRequest requestWithURL:url];
[rq setHTTPMethod:@"POST"];
NSString *post = [NSString stringWithFormat:@"command1=c1&command2=c2"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding];
[rq setHTTPBody:postData];
[rq setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:rq queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {
     if ([data length] > 0 && error == nil){
         NSError *parseError = nil;
         NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
         NSLog(@"Server Response (we want to see a 200 return code) %@",response);
         NSLog(@"dictionary %@",dictionary);
     }
     else if ([data length] == 0 && error == nil){
         NSLog(@"no data returned");
         //no data, but tried
     }
     else if (error != nil)
     {
         NSLog(@"there was a download error");
         //couldn't download

     }
 }];

ASIHTTPRequest를 사용하는 것이 좋습니다.

ASIHTTPRequest는 CFNetwork API에 관한 사용하기 쉬운 래퍼로 웹 서버와의 통신에 있어 보다 번거로운 부분을 쉽게 할 수 있습니다.Objective-C로 작성되어 Mac OS X와 iPhone 어플리케이션 모두에서 동작합니다.

기본적인 HTTP 요청을 수행하거나 REST 기반 서비스(GET / POST / PUT / DELETE)와 상호 작용하기에 적합합니다.포함된 ASIFormDataRequest 서브클래스를 통해 멀티파트/폼데이터를 사용하여 POST 데이터와 파일을 쉽게 전송할 수 있습니다.


원저작자는 이 프로젝트를 중단하였음을 유의하시기 바랍니다.이유와 대체 방법에 대해서는, 다음의 투고를 참조해 주세요.http://allseeing-i.com/%5Brequest_release%5D;

개인적으로 저는 AFNetworking의 광팬입니다.

여러분 대부분은 이미 알고 계실 것입니다만, iOS6+의 JSON에 아직 어려움을 겪고 있는 분들을 위해 이 글을 올립니다.

iOS6 이후에는 NSJON Serialization 클래스가 있어 빠르고 "외부" 라이브러리 포함에 의존하지 않습니다.

NSDictionary *result = [NSJSONSerialization JSONObjectWithData:[resultStr dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; 

이것이 iOS6 이후로는 JSON을 효율적으로 해석할 수 있는 방법입니다.SBJson을 사용하는 것도 ARC 이전 구현이며 ARC 환경에서 작업하는 경우에도 이러한 문제가 발생합니다.

도움이 됐으면 좋겠네요!

여기 Restkit을 사용한 훌륭한 기사가 있습니다.

네스트된 데이터를 JSON에 시리얼화하여 HTTP POST 요구에 부가하는 방법에 대해 설명합니다.

코드 현대화에 대한 Mike G의 답변에 대한 나의 편집이 3대 2로 거부되었기 때문에

이 편집은 게시물의 작성자를 지칭하기 위한 것으로 편집으로서 의미가 없습니다.댓글이나 답변으로 써있어야 하는데

편집한 내용을 다른 답변으로 다시 게시합니다.에서는, 「」가 됩니다.JSONRepresentation depend와의 의존 관계NSJSONSerialization15표를 얻은 롭의 코멘트가 시사하는 것처럼요.

    NSArray *objects = [NSArray arrayWithObjects:[[NSUserDefaults standardUserDefaults]valueForKey:@"StoreNickName"],
      [[UIDevice currentDevice] uniqueIdentifier], [dict objectForKey:@"user_question"],     nil];
    NSArray *keys = [NSArray arrayWithObjects:@"nick_name", @"UDID", @"user_question", nil];
    NSDictionary *questionDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

    NSDictionary *jsonDict = [NSDictionary dictionaryWithObject:questionDict forKey:@"question"];

    NSLog(@"jsonRequest is %@", jsonRequest);

    NSURL *url = [NSURL URLWithString:@"https://xxxxxxx.com/questions"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                 cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];


    NSData *requestData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil]; //TODO handle error

    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody: requestData];

    NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    if (connection) {
     receivedData = [[NSMutableData data] retain];
    }

수신한 데이터는 다음에 의해 처리됩니다.

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSDictionary *question = [jsonDict objectForKey:@"question"];

NSURLConnection + send를 사용하는 업데이트된 예를 다음에 나타냅니다.AsynchronousRequest: (10.7+, iOS 5+), "Post" 요청은 접수된 답변과 동일하게 유지되며 명확성을 위해 여기서 생략됩니다.

NSURL *apiURL = [NSURL URLWithString:
    [NSString stringWithFormat:@"http://www.myserver.com/api/api.php?request=%@", @"someRequest"]];
NSURLRequest *request = [NSURLRequest requestWithURL:apiURL]; // this is using GET, for POST examples see the other answers here on this page
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     if(data.length) {
         NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
         if(responseString && responseString.length) {
             NSLog(@"%@", responseString);
         }
     }
}];

송신 json 문자열에 대해 이 코드를 시도할 수 있습니다.

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:ARRAY_CONTAIN_JSON_STRING options:NSJSONWritin*emphasized text*gPrettyPrinted error:NULL];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *WS_test = [NSString stringWithFormat:@"www.test.com?xyz.php&param=%@",jsonString];

언급URL : https://stackoverflow.com/questions/4456966/how-to-send-json-data-in-the-http-request-using-nsurlrequest

반응형