HTTP Header

协议头的字段(Header),请求(request)或响应(response)。
协议头的字段,是以明文的格式传输的,以冒号分隔的键名/值对,最后以回车(CR)和换行(LF)符序列结尾。协议头部分的结束,是以一个空白的字段来标识的,结果就是,会传输两个连续的回车换行符对。 在标准的网络请求中没有针对每个协议头字段的名字和值的尺寸设置任何限制, 也没有限制字段的个数。然而 ,出于实际场景及安全性的考虑,大部分的服务器、客户端和代理软件都会实施一些限制。例如, 阿帕奇(Apache)2.3 服务器, 在默认情况下, 会限制每个字段的尺寸不超过 8190字节 , 同时,单个请求中最多可以有 100 个协议头字段。

1.请求字段(Request)

协议头字段

说明

示例

Accept

能够接受的回应内容类型(Content-Types)

Accept: text/plain

Accept-Charset

能够接受的字符集

Accept-Charset: utf-8

Accept-Encoding

能够接受的编码方式列表

Accept-Encoding:gzip, deflate

Accept-Language

能够接受的回应内容的自然语言列表(Content-Types)

Accept-Language: en-US

Authorization

用于超文本传输协议的认证的认证信息

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Cache-Control

用来指定在这次的请求/回复链中的所有缓存机制 都必须 遵守的指令

Cache-Control: no-cache

Cookie

之前由服务器通过 Set- Cookie)

Cookie: $Version=1; Skin=new;

Content-Length

以 八位字节数组 (8位的字节)表示的请求体的长度

Content-Length: 348

Content-Type

请求体的 多媒体类型 (用于POST和PUT请求中)

Content-Type: application/x-www-form-urlencoded

Range

仅请求某个实体的一部分。字节偏移以0开始。参考 字节服务 。

Range: bytes=500-999

User-Agent

浏览器的浏览器身份标识字符串

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0

2.Content-Type
  • application/x-www-form-urlencoded 数据被编码为名称/值对。这是标准的编码格式。
  • multipart/form-data 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
  • text/plain 数据以纯文本形式(text/json/xml/html)进行编码,其中不含任何控件或格式字符。

form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded 和multipart/form-data,默认为application/x-www-form-urlencoded。

  • 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用?分割,加载这个新的url。当action为pos时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file`的话,就要用到multipart/form-data了。
  • 当action为post且Content-Type类型是multipart/form-data,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name )等信息,并加上分割符(boundary)。

应用场景1

1.2请求地址 https://zkapp.f3322.net:8087 Appid = TaxiManager01 1.3请求方式 通过HTTP的Get、Post方式进行数据请求,查询数据使用Get方式,增加、修改、删除数据使用Post的方式 1.4返回数据格式说明 返回数据采用以下统一规范的JSON格式: { "Status": "1", "Message": "登录成功", "ErrorCode": "", "Data": "" } 本文以下的接口描述的输出参数是指Data内JSON对象或JSON对象数组的属性。 1.5客户端服务接口通讯协议的安全 1.5.1通讯协议 本服务端采用安全套接字层超文本传输协议HTTPS,确保数据传输过程安全。 1.5.2身份认证 本服务端采用类Basic认证方案,在HTTPS协议头加入属性Authorization,其值由认证方案和base64编码后的用户名和APP ID组成。(除登录以外每次请求必须在协议头添加身份认证) 1)认证方式(暂定) 参数介绍: userid = ghml//用户名 appid = TaxiManager01//分配给的APPID 编码规则: a)用:号连接用户名和APPID gmhl:TaxiManager01 b)对a)得到的字符串进行base64编码 Z21obDpUYXhpTWFuYWdlcjAx c)认证方案和b)编码后字符串进行连接 Basic Z21obDpUYXhpTWFuYWdlcjAx(注意Basic和base64字符串之间有1个空格) d)加入请求的协议头(Java ok http示例) Request request = new Request.Builder() .url("https://localhost:8088/api/v1/account/login") .get() .addHeader("authorization", "Basic Z21obDpUYXhpTWFuYWdlcjAx") .build() 注意事项:帐号登陆以后有效时间为2个小时,每次请求都会刷新有效时间,超过2个小时没任何操作,需要重新登陆。

应用场景2

调整图片大小

//调整图片大小
+ (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{
    UIGraphicsBeginImageContext(size);
    [img drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}

//判断图片是否达到一定尺寸,达到则做处理(主要用于发送图片到服务器时使用, 如店铺编辑, 上传图片)
+ (NSData *) handleImageBySize:(UIImage *) image
{
    NSData * imageData = UIImageJPEGRepresentation(image,1);
    NSInteger imageSize = [imageData length] / 1024 + 30; //KB
    if(imageSize < 200)
        return imageData;
    
    CGFloat imageW = 800;
    CGFloat imageH = 800;
    UIImage *handImage = image;
    if(image.size.width > imageW || image.size.height > imageH)
    {
        CGFloat scale = image.size.width / image.size.height; //比例
        
        if(image.size.width > image.size.height)
        {
            //横向图片
            imageH = imageW / scale;
            handImage = [self scaleToSize:image size:CGSizeMake(imageW, imageH)];
        }
        else
        {
            imageW = imageH * scale;
            handImage = [self scaleToSize:image size:CGSizeMake(imageW, imageH)];
        }
    }
    
    return UIImageJPEGRepresentation(handImage, 0.3);
}
复制代码
//带图片的提交模式
- (void) submitImageDataSoapCallWithMethodName:(NSString *)methodName params:(NSDictionary *)paramsDictionary{
    
    NSString *requestFile = [self getRequestFile];
    
    methodName = [NSString stringWithFormat:@"%@?memberId=%@", methodName, appDelegate.appInteraction.memberId];
    NSString *soapURLString = [NSString stringWithFormat:@"%@/%@/%@",defaultWebServiceUrl,requestFile,methodName];
    
    NSString *utf8ParamValue = [soapURLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"URL = %@", soapURLString);
    
    NSURL *url = [[NSURL alloc] initWithString:utf8ParamValue];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setTimeoutInterval:120];
    
    //分界线的标识符
    NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
    //分界线 --AaB03x
    NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
    //结束符 AaB03x--
    NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
    
    //http body的字符串
    NSMutableString *body=[[NSMutableString alloc]init];
    
    NSMutableData *postData = [NSMutableData data];
    for (NSString *param in [paramsDictionary keyEnumerator]) {
        if ([[paramsDictionary objectForKey:param] isKindOfClass:[UIImage class]]) {
            NSData *imageData = [Common handleImageBySize:[paramsDictionary objectForKey:param]];

            if (imageData) {
                
                 NSMutableString *imgbody = [[NSMutableString alloc] init];
                 添加分界线,换行
                 [imgbody appendFormat:@"%@\r\n",MPboundary];
                 [imgbody appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.png\"\r\n", param, param];
                 //声明上传文件的格式
                 [imgbody appendFormat:@"Content-Type: application/octet-stream; charset=utf-8\r\n\r\n"];
                 //
                 //[imgbody appendString:@"Content-Type:image/png\r\n"];
                 
                 //将body字符串转化为UTF8格式的二进制
                 //[myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
                 [postData appendData:[imgbody dataUsingEncoding:NSUTF8StringEncoding]];
                 //将image的data加入
                 [postData appendData:imageData];
                 [postData appendData:[ @"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
            }
        }
        else
        {
            //添加分界线,换行
            [body appendFormat:@"%@\r\n",MPboundary];
            //添加字段名称,换2行
            [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",param];
            //[body appendString:@"Content-Transfer-Encoding: 8bit"];
            //添加字段的值
            [body appendFormat:@"%@\r\n",[paramsDictionary objectForKey:param]];
            
        }
        
    }
    
    //将body字符串转化为UTF8格式的二进制
    [postData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
    
    //声明结束符:--AaB03x--
    NSString *end=[[NSString alloc]initWithFormat:@"%@\r\n",endMPboundary];
    //加入结束符--AaB03x--
    [postData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
    
    //设置HTTPHeader中Content-Type的值
    NSString *content=[[NSString alloc] initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
    //设置HTTPHeader
    [request setValue:content forHTTPHeaderField:@"Content-Type"];
    
    //[request setValue:@"keep-alive" forHTTPHeaderField:@"connection"];
    //[request setValue:@"UTF-8" forHTTPHeaderField:@"Charsert"];
    //设置Content-Length
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[postData length]] forHTTPHeaderField:@"Content-Length"];
    //设置http body
    [request setHTTPBody:postData];
    //http method
    [request setHTTPMethod:@"POST"];
    
    
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
     {
         isTimeout = NO;
         if( connectionError)
         {
             [self interfaceError:connectionError];
         }
         else
         {
             if(data)
             {
                 NSError *error;
                 NSString *AXMLString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                 NSLog(@"AXMLString=%@", AXMLString);
                 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
                 
                 if(error != nil)
                 {
                     //NSLog(@"error = %@", error);//有误
                     [self interfaceError:error];
                 }
                 else
                 {
                     if(! isCancel)
                         [self.delegate requestFinishedMessage:dic];
                 }
             }
         }
     }];
}
复制代码