카테고리 없음

[아이폰] UIWebView에 POST 요청을 삽입하는 방법

행복을전해요 2020. 12. 31. 04:39

NSMutableURLRequest를 사용하고 HTTP 메서드를 POST로 설정 한 다음 -loadRequest를 사용하여 UIWebView에로드 할 수 있습니다.

-------------------

Seva에 대답 해 주셔서 감사합니다. 나는 당신의 코드에서 방법을 만들었습니다. 이것이 다른 사람들에게 도움이되기를 바랍니다. :)

//-------------------------------------------------------------------
//  UIWebViewWithPost
//       init a UIWebview With some post parameters
//-------------------------------------------------------------------
- (void)UIWebViewWithPost:(UIWebView *)uiWebView url:(NSString *)url params:(NSMutableArray *)params
{
    NSMutableString *s = [NSMutableString stringWithCapacity:0];
        [s appendString: [NSString stringWithFormat:@"<html><body onload=\"document.forms[0].submit()\">"
             "<form method=\"post\" action=\"%@\">", url]];
                 if([params count] % 2 == 1) { NSLog(@"UIWebViewWithPost error: params don't seem right"); return; }
                     for (int i=0; i < [params count] / 2; i++) {
                             [s appendString: [NSString stringWithFormat:@"<input type=\"hidden\" name=\"%@\" value=\"%@\" >\n", [params objectAtIndex:i*2], [params objectAtIndex:(i*2)+1]]];
                                 }    
                                     [s appendString: @"</input></form></body></html>"];
                                         //NSLog(@"%@", s);
                                             [uiWebView loadHTMLString:s baseURL:nil];
                                             }
                                             

그것을 사용하려면

NSMutableArray *webViewParams = [NSMutableArray arrayWithObjects:
                                 @"paramName1", @"paramValue1",
                                                                  @"paramName2", @"paramValue2",
                                                                                                   @"paramName3", @"paramValue3", 
                                                                                                                                    nil];
                                                                                                                                    [self UIWebViewWithPost:self.webView url:@"http://www.yourdomain.com" params:webViewParams];
                                                                                                                                    
-------------------

(새로 테스트 된 코드를 포함하도록 원본 답변 수정)

이 요청의 내 버전을 중단하고 싶었습니다. 포스트 매개 변수를 표현하기 위해 사전을 사용했습니다.

코드 덩어리이지만 웹뷰가있는 뷰로 들어가 모든 URL 로딩에 사용할 수있을만큼 간단합니다. "postDictionary"를 보내는 경우에만 게시됩니다. 그렇지 않으면 당신이 보낸 URL을 사용하여 물건을 가져옵니다.

- (void) loadWebView:(UIWebView *)theWebView withURLString:(NSString *)urlString andPostDictionaryOrNil:(NSDictionary *)postDictionary {
    NSURL *url                          = [NSURL URLWithString:urlString];
        NSMutableURLRequest *request        = [NSMutableURLRequest requestWithURL:url
                                                     cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                                                              timeoutInterval:60.0];
                                                                                              
                                                                                              
                                                                                                  // DATA TO POST
                                                                                                      if(postDictionary) {
                                                                                                              NSString *postString                = [self getFormDataString:postDictionary];
                                                                                                                      NSData *postData                    = [postString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
                                                                                                                              NSString *postLength                = [NSString stringWithFormat:@"%d", [postData length]];
                                                                                                                                      [request setHTTPMethod:@"POST"];
                                                                                                                                              [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
                                                                                                                                                      [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
                                                                                                                                                              [request setHTTPBody:postData];
                                                                                                                                                                  }
                                                                                                                                                                  
                                                                                                                                                                      [theWebView loadRequest:request];
                                                                                                                                                                      }
                                                                                                                                                                      - (NSString *)getFormDataString:(NSDictionary*)dictionary {
                                                                                                                                                                          if( ! dictionary) {
                                                                                                                                                                                  return nil;
                                                                                                                                                                                      }
                                                                                                                                                                                          NSArray* keys                               = [dictionary allKeys];
                                                                                                                                                                                              NSMutableString* resultString               = [[NSMutableString alloc] init];
                                                                                                                                                                                                  for (int i = 0; i < [keys count]; i++)  {
                                                                                                                                                                                                          NSString *key                           = [NSString stringWithFormat:@"%@", [keys objectAtIndex: i]];
                                                                                                                                                                                                                  NSString *value                         = [NSString stringWithFormat:@"%@", [dictionary valueForKey: [keys objectAtIndex: i]]];
                                                                                                                                                                                                                  
                                                                                                                                                                                                                          NSString *encodedKey                    = [self escapeString:key];
                                                                                                                                                                                                                                  NSString *encodedValue                  = [self escapeString:value];
                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                          NSString *kvPair                        = [NSString stringWithFormat:@"%@=%@", encodedKey, encodedValue];
                                                                                                                                                                                                                                                  if(i > 0) {
                                                                                                                                                                                                                                                              [resultString appendString:@"&"];
                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                              [resultString appendString:kvPair];
                                                                                                                                                                                                                                                                                  }
                                                                                                                                                                                                                                                                                      return resultString;
                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                      - (NSString *)escapeString:(NSString *)string {
                                                                                                                                                                                                                                                                                          if(string == nil || [string isEqualToString:@""]) {
                                                                                                                                                                                                                                                                                                  return @"";
                                                                                                                                                                                                                                                                                                      }
                                                                                                                                                                                                                                                                                                          NSString *outString     = [NSString stringWithString:string];
                                                                                                                                                                                                                                                                                                              outString                   = [outString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
                                                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                  // BUG IN stringByAddingPercentEscapesUsingEncoding
                                                                                                                                                                                                                                                                                                                      // WE NEED TO DO several OURSELVES
                                                                                                                                                                                                                                                                                                                          outString                   = [self replace:outString lookFor:@"&" replaceWith:@"%26"];
                                                                                                                                                                                                                                                                                                                              outString                   = [self replace:outString lookFor:@"?" replaceWith:@"%3F"];
                                                                                                                                                                                                                                                                                                                                  outString                   = [self replace:outString lookFor:@"=" replaceWith:@"%3D"];
                                                                                                                                                                                                                                                                                                                                      outString                   = [self replace:outString lookFor:@"+" replaceWith:@"%2B"];
                                                                                                                                                                                                                                                                                                                                          outString                   = [self replace:outString lookFor:@";" replaceWith:@"%3B"];
                                                                                                                                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                              return outString;
                                                                                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                                                                                              - (NSString *)replace:(NSString *)originalString lookFor:(NSString *)find replaceWith:(NSString *)replaceWith {
                                                                                                                                                                                                                                                                                                                                                  if ( ! originalString || ! find) {
                                                                                                                                                                                                                                                                                                                                                          return originalString;
                                                                                                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                  if( ! replaceWith) {
                                                                                                                                                                                                                                                                                                                                                                          replaceWith                 = @"";
                                                                                                                                                                                                                                                                                                                                                                              }
                                                                                                                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                                  NSMutableString *mstring        = [NSMutableString stringWithString:originalString];
                                                                                                                                                                                                                                                                                                                                                                                      NSRange wholeShebang            = NSMakeRange(0, [originalString length]);
                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                                                                          [mstring replaceOccurrencesOfString: find
                                                                                                                                                                                                                                                                                                                                                                                                                       withString: replaceWith
                                                                                                                                                                                                                                                                                                                                                                                                                                                       options: 0
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         range: wholeShebang];
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             return [NSString stringWithString: mstring];
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
-------------------

ASIHTTPRequest 와 같은 것을 사용하여 POST 요청 ( 비동기 적으로 수행하는 옵션 사용 )을 만든 다음 응답 문자열 / 데이터를 UIWebView에로드 할 수 있습니다. 에서 봐 이 페이지 섹션 아래는 제목 POST 나 PUT 요청으로 데이터를 전송 하고 볼 만들기 비동기 요청의 응답 문자열 / 데이터를 처리하는 방법에 대한 자세한 내용은 상단에 절을 참조하십시오.

도움이 되었기를 바랍니다. 질문을 오해 한 경우 죄송합니다.

-------------------

loadHTMLString을 사용하여 숨겨진 양식이 미리 채워진 UIWebView에 페이지를 제공 한 다음 해당 페이지가로드시 Javascript 양식 [0] .submit ()을 수행하도록합니다.

편집 : 먼저 입력을 변수로 수집합니다. 그런 다음 다음과 같이 HTML을 작성합니다.

NSMutableString *s = [NSMutableString stringWithCapacity:0];
[s appendString: @"<html><body onload=\"document.forms[0].submit()\">"
 "<form method=\"post\" action=\"http://someplace.com/\">"
  "<input type=\"hidden\" name=\"param1\">"];
  [s appendString: Param1Value]; //It's your variable
  [s appendString: @"</input></form></body></html>"];
  

그런 다음 WebView에 추가합니다.

[myWebView loadHTMLString:s baseURL:nil];

WebView가 양식을로드 한 다음 즉시 제출하여 someplace.com에 대한 POST 요청을 실행합니다 (URL은 다를 수 있음). 결과는 WebView에 나타납니다.

양식의 세부 사항은 귀하에게 달려 있습니다 ...

-------------------

POST URLRequest를 생성하고이를 사용하여 webView를 채 웁니다.

 NSURL *url = [NSURL URLWithString: @"http://your_url.com"];
 NSString *body = [NSString stringWithFormat: @"arg1=%@&arg2=%@", @"val1",@"val2"];
  NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url];
   [request setHTTPMethod: @"POST"];
    [request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]];
     [webView loadRequest: request];
     
-------------------

다음은 저에게 완벽하게 작동하는 Seva Alekseyev의 답변의 Swift 버전입니다. 멋진 포스트 메이트 주셔서 감사합니다! BTW 다음 코드는 Swift 3.1에 있습니다.

fileprivate func prepareDataAndSubmitForRepayment(parameters paramData: [String: Any]) {
    var stringObj = String()
        stringObj.append("<html><head></head>")
            stringObj.append("<body onload=\"payment_form.submit()\">")
                stringObj.append("<form id=\"payment_form\" action=\"\(urlString)\" method=\"post\">") //urlString is your server api string!
                
                    for object in paramData { //Extracting the parameters for request
                          stringObj.append("<input name=\"\(object.key)\" type=\"hidden\" value=\"\(object.value)\">")
                              }
                              
                                  stringObj.append("</form></body></html>")
                                      debugPrint(stringObj)
                                          webviewToLoadPage?.loadHTMLString(stringObj, baseURL: nil)
                                          }
                                          


출처
https://stackoverflow.com/questions/2002919