首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 同步 POST 請求中動態插入輸入框參數的實現

     編輯:程式設計綜合問答

問題核心

將 `UITextField` 的輸入內容動態拼接到 POST 請求體字符串中,替換硬編碼的參數值。

關鍵代碼修正

- (IBAction)signin:(id)sender {
    // 1. 獲取輸入框文本
    NSString *username = self.username.text; // IBOutlet 連接的 UITextField
    NSString *password = self.pwd.text;

    // 2. 基礎參數校驗 (防空指針、長度限制等)
    if (!username.length || !password.length) {
        // 提示用戶輸入完整
        return;
    }

    // 3. 構建請求 URL (注意:原 URL 含 jsoncallback=? 疑似 JSONP,POST 請求通常不需此參數)
    NSURL *url = [NSURL URLWithString:@"https://14.17.84.128:8088/wcf/ActionService.svc/action/web/get/do"];
    // 建議去掉 ?jsoncallback=?,或確認服務端確實需要

    // 4. 創建可變請求
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url
                                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                          timeoutInterval:10.0];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; // 關鍵!

    // 5. 動態拼接參數字符串 (使用 stringWithFormat)
    // 注意:原參數格式 "ActionCode =0x2001¶meter=pwd###123#####userNo###aaa& LoginID=&LoginIp="
    // 空格可能導致解析異常,建議去除鍵值對中的空格
    NSString *bodyString = [NSString stringWithFormat:
        @"ActionCode=0x2001¶meter=pwd###%@#####userNo###%@&LoginID=&LoginIp=",
        password, username]; // 順序對應原偽代碼:pwd=密碼, userNo=用戶名

    // 6. 設置 HTTP Body (UTF-8 編碼)
    NSData *bodyData = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:bodyData];

    // 7. 發送同步請求 (主線程會阻塞,建議生產環境用異步 NSURLSession)
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *receivedData = [NSURLConnection sendSynchronousRequest:request
                                                 returningResponse:&response
                                                             error:&error];

    // 8. 處理響應
    if (error) {
        NSLog(@"請求失敗: %@", error.localizedDescription);
        return;
    }
    if (receivedData) {
        NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
        NSLog(@"響應: %@", responseString);
        // 解析 JSON/XML 並更新 UI
    }
}

重要注意事項

  1. 編碼一致性:服務端期望 `application/x-www-form-urlencoded` 時,參數值若含特殊字符 (`&` `=` `#` 空格等) **必須 URL Encode**。使用 `CFURLCreateStringByAddingPercentEscapes` 或第三方庫 (如 `AFNetworking` 的 `AFHTTPRequestSerializer`)。
  2. 同步請求風險:`sendSynchronousRequest` 會阻塞主線程導致界面凍結,**嚴禁在正式項目主線程使用**。請改用 `NSURLSession` + `dataTaskWithRequest:completionHandler:` 異步回調。
  3. 參數順序與名稱:務必與服務端 API 文檔完全一致 (`pwd###` `#####` `userNo###` 等分隔符極易出錯)。
  4. HTTPS:生產環境強制使用 HTTPS,防止明文傳輸密碼。

現代寫法推薦

// 使用 NSURLSession 異步 (iOS 7+)
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error) { NSLog(@"Error: %@", error); return; }
    NSString *resp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"Response: %@", resp);
    // 回主線程更新 UI
    dispatch_async(dispatch_get_main_queue(), ^{
        // self.label.text = resp;
    });
}];
[task resume];
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved