HTTP Header简介

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];
                 }
             }
         }
     }];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容