【问题标题】:Objective-C : Post/Get Request using SocketObjective-C:使用 Socket 发布/获取请求
【发布时间】:2011-11-10 13:00:49
【问题描述】:

我知道如何使用 herehere 解释的任何 HTTPClient 发送 post/get 请求。但是现在我有一个连接到远程服务器的流套接字,我想使用这个套接字发送一个发布请求。

我以前从未这样做过,坦率地说,我从未考虑过通过套接字进行 POST/GET 的概念。但是我的谷歌搜索将我带到了this,这里的帖子是通过 java 套接字完成的..

我正在使用 Apple 提供的 CFSocket 库。在 Objective-C 中是否可以使用套接字进行 POST/GET 操作?

【问题讨论】:

    标签: ios objective-c sockets post


    【解决方案1】:

    好吧,我已经能够使用普通的 CFSocket 进行 GET/POST。

    -(bool) sendHTTPHeader{
        NSMutableString* requestString  =   [[NSMutableString alloc] init];
        NSString *pathString            =   [NSString stringWithFormat:@"/remote_function.jsp?argument1=%@&argument2=%@",arg1,arg2 ];
        [requestString appendFormat:@"GET %@ HTTP/1.x\r\n",pathString];
        [requestString appendFormat:@"HOST:%@",your_host_here];
        [requestString appendFormat:@"User-Agent:any\r\n"];
        [requestString appendFormat:@"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n\r\n"];
        /*If there are more parameters requested by server, put them here..*/
    
        const char* sendString          =   [requestString UTF8String];
    
        CFDataRef  data                 =   CFDataCreate(NULL, (const UInt8*)sendString, strlen(sendString));
        CFSocketError err               =   CFSocketSendData(clientSocket, NULL, data, 0);
        if (err != kCFSocketSuccess) {
            NSLog(@"Error in sending data to the server");
            CFRelease(data);
            return FALSE;
        }
        [requestString release];
        CFRelease(data);
        return TRUE;
    }
    

    现在在您的套接字回调函数中,您可以读取 http 响应..希望这对某人有所帮助..

    void socketCallback(CFSocketRef socket,CFSocketCallBackType type,CFDataRef address,const void *data,void *info){
        if (type == kCFSocketDataCallBack) {
            NSData *nsData              =   (NSData *)data;
            if ([nsData length] == 0) {
                NSLog(@"Connection dropped by remote socket");
                return;
            }
            //Control reaches here when there is a chunk of data to read
            CFDataRef df                =   (CFDataRef) data;
            int len                     =   CFDataGetLength(df);
            CFRange range               =   CFRangeMake(0,len);
            UInt8 buffer[len+1];
    
            if(len <= 0) {
                NSLog(@"No data read");
                return;        
            }
            memset((void*)buffer,0,sizeof(buffer));
            CFDataGetBytes(df, range, buffer);
            NSString *byteString            =   [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
            NSLog(@"byte string is : %@",byteString);
            [byteString release];
        }
    }
    

    【讨论】:

    • 赞成这个例子为我解决了一个问题(我有一个语法问题),但是我不得不稍微调整你的请求 - 我需要在“HOST”条目之后回车和换行。只是想我会提到它。没有它,我收到了一个错误的请求错误。
    【解决方案2】:

    【讨论】:

    • 感谢您的回复朋友,我的问题是关于如何使用普通的 CFSocket 进行 GET/POST 请求。我已经看过这两个链接,非常有帮助。但是在第二个链接中没有关于使用套接字发布/获取的内容。在第一个链接中,有关于 CFHTTP 的信息看起来很有希望。但是我已经使用普通的 CFSocket 完成了我的要求。看我的回答。我明天会接受我的回答,因为现在不允许我这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多