正确使用HTTP协议和参数

时间:2012-06-06 10:38:14

标签: objective-c ios http client-server asihttprequest

我正在开发一个消息传递iPhone应用程序,使用HTTP从客户端向服务器发送和接收数据。

要使客户端与服务器通信,客户端会创建HTTP请求并使用相关参数填充它。

每个客户请求都包含以下参数:
“cmd”(命令)
“clientId”(用于标识客户端的唯一ID)
“一些命令特定数据”(命令的额外数据)

(1)将这些参数添加到HTTP POST请求的正确方法是什么?

到现在为止我做了如下:

- (void)sendTextMessage:(NSString *)text forClient:(NSString *)clientId
{
    NSString *url = SERVER_URL;

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];

    NSMutableData *body = [NSMutableData data];

    [body appendData:[[NSString stringWithFormat:@"cmd=%@&clientid=%@&msg=%@", 
                       @"sendmsg", 
                       clientId,
                       text] dataUsingEncoding:NSUTF8StringEncoding]];


    [request setHTTPBody:body];

    // send the request...
}

(2)此方法运行正常,但我不确定这应该如何使用HTTP,是否可以使用HTTP正文发送这些参数?

无论如何,因为我说它工作正常,所以我没有遇到问题,直到我添加了在我的应用程序中发送图片的选项... 这使得事情有点复杂,在哪里放置图像以及在哪里放置命令参数字符串?

所以我开始使用ASIHTTPRequest库,以便在发送图片时轻松实现 现在的问题是,(3)如何处理命令参数?我在哪里添加它们?

我最终将它们添加到URL本身(再次可能不是很好地使用HTTP),另一个问题是我无法将“text”参数添加到URL,因为它有空格。 所以我添加了“text”参数,如下所示:

 [request setPostValue:text forKey:@"msgText"];

(4)我甚至不知道它意味着什么?这是添加到HTTP标题?还是正文?

这是我使用ASIHTTPRequest发送带有文字的图片的方式:

- (void)sendMsgText:(NSString *)text andImage:(UIImage *)image forClient:(NSString *)clientId
{
    NSString *url = SERVER_URL;

    // add the command parameters to the url
    NSString *cmd = [NSString stringWithFormat:@"cmd=%@&clientid=%@", 
                        @"sendmsg", 
                        clientId];

    NSString *newUrl = [NSString stringWithFormat:@"%@?%@", url, cmd];

    // create HTTP request
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:newUrl]];

    // add the text
    [request setPostValue:text forKey:@"msgText"];
    // add the image
    NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
    [request addData:imageData withFileName:@"image.jpg" andContentType:@"image/jpeg" forKey:@"photos"];
    [request setRequestMethod:@"POST"];
    [request setDelegate:self];

    [request startAsynchronous];
}

对不起,我很抱歉,最后我有4个问题(粗体文字):
问题1,2是通用HTTP使用问题
问题3,4是具体的ASIHTTPRequest使用问题

0 个答案:

没有答案