首页 文章

在iOS上发送HTTP POST请求

提问于
浏览
77

我正在尝试使用我正在开发的iOS应用程序发送HTTP Post但是推送从未到达服务器,尽管我确实获得了代码200作为响应(来自urlconnection) . 我从来没有得到服务器的响应,也没有服务器检测到我的帖子(服务器检测到来自android的帖子)

我确实使用ARC,但将pd和urlConnection设置为强 .

这是我发送请求的代码

NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
                                    initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",dk.baseURL,@"daantest"]]];
    [request setHTTPMethod:@"POST"];
    [request setValue:@"text/xml"
   forHTTPHeaderField:@"Content-type"];

    NSString *sendString = @"<data><item>Item 1</item><item>Item 2</item></data>";

    [request setValue:[NSString stringWithFormat:@"%d", [sendString length]] forHTTPHeaderField:@"Content-length"];

    [request setHTTPBody:[sendString dataUsingEncoding:NSUTF8StringEncoding]];
    PushDelegate *pushd = [[PushDelegate alloc] init];
    pd = pushd;
    urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:pd];
    [urlConnection start];

这是我代表的代码

#import "PushDelegate.h"

@implementation PushDelegate
@synthesize data;

-(id) init
{
    if(self = [super init])
    {
        data = [[NSMutableData alloc]init];
        [data setLength:0];
    }
    return self;
}


- (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten
{
    NSLog(@"didwriteData push");
}
- (void)connectionDidResumeDownloading:(NSURLConnection *)connection totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes
{
    NSLog(@"connectionDidResumeDownloading push");
}

- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL
{
    NSLog(@"didfinish push @push %@",data);
}

- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
{
    NSLog(@"did send body");
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [self.data setLength:0];
    NSHTTPURLResponse *resp= (NSHTTPURLResponse *) response;
    NSLog(@"got response with status @push %d",[resp statusCode]);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d
{
    [self.data appendData:d];

    NSLog(@"recieved data @push %@", data);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];

    NSLog(@"didfinishLoading%@",responseText);

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error ", @"")
                                message:[error localizedDescription]
                               delegate:nil
                      cancelButtonTitle:NSLocalizedString(@"OK", @"")
                      otherButtonTitles:nil] show];
    NSLog(@"failed &push");
}

// Handle basic authentication challenge if needed
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    NSLog(@"credentials requested");
    NSString *username = @"username";
    NSString *password = @"password";

    NSURLCredential *credential = [NSURLCredential credentialWithUser:username
                                                             password:password
                                                          persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}

@end

控制台始终仅打印以下行和以下行:

2013-04-01 20:35:04.341 ApprenticeXM[3423:907] did send body
2013-04-01 20:35:04.481 ApprenticeXM[3423:907] got response with status @push 200
2013-04-01 20:35:04.484 ApprenticeXM[3423:907] didfinish push @push <>

7 回答

  • 1

    下面的代码描述了一个使用 POST 方法的简单示例 . (如何通过 POST 方法传递数据)

    在这里,我描述了如何使用POST方法 .

    1. 使用实际用户名和密码设置发布字符串 .

    NSString *post = [NSString stringWithFormat:@"Username=%@&Password=%@",@"username",@"password"];
    

    2. 使用 NSASCIIStringEncoding 对帖子字符串进行编码,以及需要以NSData格式发送的帖子字符串 .

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    

    您需要发送数据的实际长度 . 计算帖子字符串的长度 .

    NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]];
    

    3. 创建一个Urlrequest,其中包含 HTTP 方法,http Headers 字段等所有属性,其中包含帖子字符串的长度 . 创建 URLRequest 对象并初始化它 .

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    

    设置要将数据发送到该请求的URL .

    [request setURL:[NSURL URLWithString:@"http://www.abcde.com/xyz/login.aspx"]];
    

    现在,设置 HTTP 方法(POST或GET) . 在代码中写下这一行 .

    [request setHTTPMethod:@"POST"];
    

    设置 HTTP Headers 字段,其中包含发布数据的长度 .

    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    

    还要为HTTP标头字段设置编码值 .

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    

    使用postData设置urlrequest的 HTTPBody .

    [request setHTTPBody:postData];
    

    4. 现在,创建URLConnection对象 . 使用URLRequest初始化它 .

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    

    它返回初始化的url连接,并开始加载url请求的数据 . 您可以使用 if/else 语句检查是否正确完成 URL 连接,如下所示 .

    if(conn) {
        NSLog(@"Connection Successful");
    } else {
        NSLog(@"Connection could not be made");
    }
    

    5. 要从HTTP请求接收数据,可以使用URLConnection类参考提供的委托方法 . 代表方法如下 .

    // This method is used to receive the data which we get using post method.
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data
    
    // This method receives the error report in case of connection is not made to server. 
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
    
    // This method is used to process the data after connection has made successfully.
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    

    Also Refer This and This documentation for POST 方法 .

    以下是源代码为HTTPPost Method.的最佳示例

  • 178

    我不确定为什么,但是一旦我注释掉以下方法,它就会起作用:

    connectionDidFinishDownloading:destinationURL:
    

    此外,我认为您不需要NSUrlConnectionDownloadDelegate协议中的方法,只需要来自NSURLConnectionDataDelegate的方法,除非您需要一些下载信息 .

  • 1

    下面是我在日志库中使用的方法:https://github.com/goktugyil/QorumLogs

    此方法填写Google表单中的html表单 . 希望它可以帮助使用Swift的人 .

    var url = NSURL(string: urlstring)
    
    var request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "POST"
    request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding)
    var connection = NSURLConnection(request: request, delegate: nil, startImmediately: true)
    
  • 0
    -(void)sendingAnHTTPPOSTRequestOniOSWithUserEmailId: (NSString *)emailId withPassword: (NSString *)password{
    //Init the NSURLSession with a configuration
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];
    
    //Create an URLRequest
    NSURL *url = [NSURL URLWithString:@"http://www.example.com/apis/login_api"];
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
    
    //Create POST Params and add it to HTTPBody
    NSString *params = [NSString stringWithFormat:@"email=%@&password=%@",emailId,password];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
    
    //Create task
    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        //Handle your response here
        NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
         NSLog(@"%@",responseDict);
    }];
       [dataTask resume];
    }
    
  • 1

    **使用参数发布API并使用url验证如果json响应键具有状态:“success”

    NSString *string= [NSString stringWithFormat:@"url?uname=%@&pass=%@&uname_submit=Login",self.txtUsername.text,self.txtPassword.text];
        NSLog(@"%@",string);
        NSURL *url = [NSURL URLWithString:string];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
        [request setHTTPMethod:@"POST"];
        NSURLResponse *response;
        NSError *err;
        NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
        NSLog(@"responseData: %@", responseData);
        NSString *str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
        NSLog(@"responseData: %@", str);
            NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData
                                                             options:kNilOptions
                                                               error:nil];
        NSDictionary* latestLoans = [json objectForKey:@"status"];
        NSString *str2=[NSString stringWithFormat:@"%@", latestLoans];
        NSString *str3=@"success";
        if ([str3 isEqualToString:str2 ])
        {
            [self performSegueWithIdentifier:@"move" sender:nil];
            NSLog(@"successfully.");
        }
        else
        {
            UIAlertController *alert= [UIAlertController
                                     alertControllerWithTitle:@"Try Again"
                                     message:@"Username or Password is Incorrect."
                                     preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
                                                       handler:^(UIAlertAction * action){
                                                           [self.view endEditing:YES];
                                                       }
                                 ];
            [alert addAction:ok];
            [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor redColor]];
            [self presentViewController:alert animated:YES completion:nil];
            [self.view endEditing:YES];
          }
    

    JSON响应:{"status":"success","user_id":"58",_ "user_name":"dilip","result":"You have been logged in successfully"}工作代码

    **

  • 0

    在iOS上发送HTTP POST请求(目标c):

    -(NSString *)postexample{
    
    // SEND POST
    NSString *url = [NSString stringWithFormat:@"URL"];
    NSString *post = [NSString stringWithFormat:@"param=value"];
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]];
    
    
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setHTTPMethod:@"POST"];
    [request setURL:[NSURL URLWithString:url]];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];
    
    NSError *error = nil;
    NSHTTPURLResponse *responseCode = nil;
    
    //RESPONDE DATA 
    NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error];
    
    if([responseCode statusCode] != 200){
        NSLog(@"Error getting %@, HTTP status code %li", url, (long)[responseCode statusCode]);
        return nil;
    }
    
    //SEE RESPONSE DATA
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Response" message:[[NSString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];
    
    return [[NSString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding];
    }
    
  • 0

    Using Swift 3 or 4 you can access these http request for sever communication.

    //对于要请求的POST数据

    func postAction()  {
    //declare parameter as a dictionary which contains string as key and value combination. considering inputs are valid
    let parameters = ["id": 13, "name": "jack"] as [String : Any]
    //create the url with URL
    let url = URL(string: "www.requestURL.php")! //change the url
    //create the session object
    let session = URLSession.shared
    //now create the URLRequest object using the url object
    var request = URLRequest(url: url)
    request.httpMethod = "POST" //set http method as POST
    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body
    } catch let error {
        print(error.localizedDescription)
    }
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    //create dataTask using the session object to send data to the server
    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
        guard error == nil else {
            return
        }
        guard let data = data else {
            return
        }
        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                print(json)
                // handle json...
            }
        } catch let error {
            print(error.localizedDescription)
        }
    })
    task.resume() }
    

    //用于从请求中获取数据

    func GetRequest()  {
        let urlString = URL(string: "http://www.requestURL.php") //change the url
    
        if let url = urlString {
            let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
                if error != nil {
                    print(error ?? "")
                } else {
                    if let responceData = data {
                        print(responceData) //JSONSerialization
                        do {
                            //create json object from data
                            if let json = try JSONSerialization.jsonObject(with:responceData, options: .mutableContainers) as? [String: Any] {
                                print(json)
                                // handle json...
                            }
                        } catch let error {
                            print(error.localizedDescription)
                        }
                    }
                }
            }
            task.resume()
        }
    }
    

    //用于从请求中获取图像或视频等下载内容

    func downloadTask()  {
        // Create destination URL
        let documentsUrl:URL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first as URL!
        let destinationFileUrl = documentsUrl.appendingPathComponent("downloadedFile.jpg")
        //Create URL to the source file you want to download
        let fileURL = URL(string: "http://placehold.it/120x120&text=image1")
        let sessionConfig = URLSessionConfiguration.default
        let session = URLSession(configuration: sessionConfig)
        let request = URLRequest(url:fileURL!)
    
        let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in
            if let tempLocalUrl = tempLocalUrl, error == nil {
                // Success
                if let statusCode = (response as? HTTPURLResponse)?.statusCode {
                    print("Successfully downloaded. Status code: \(statusCode)")
                }
    
                do {
                    try FileManager.default.copyItem(at: tempLocalUrl, to: destinationFileUrl)
                } catch (let writeError) {
                    print("Error creating a file \(destinationFileUrl) : \(writeError)")
                }
    
            } else {
                print("Error took place while downloading a file. Error description: %@", error?.localizedDescription ?? "");
            }
        }
        task.resume()
    
    }
    

相关问题