Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 189|回复: 0

[默认分类] Http Header里的Content-Type

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-26 13:58:04 | 显示全部楼层 |阅读模式
    之前一直分不清楚post请求里Content-Type方式,如
    1. application/x-www-form-urlencoded
    复制代码
    1. multipart/form-data
    复制代码
    。本文会介绍Content-Type有哪几种、插件Postman和RESTClient使用示例。文末还会介绍在PHP中CURL里需要注意的细节。
    简介
    Http Header里的Content-Type一般有这三种:
    1. application/x-www-form-urlencoded
    复制代码
    :数据被编码为名称/值对。这是标准的编码格式。
    1. multipart/form-data
    复制代码
    : 数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
    1. text/plain
    复制代码
    : 数据以纯文本形式(text/json/xml/HTML)进行编码,其中不含任何控件或格式字符。postman软件里标的是RAW。
    form的
    1. enctype
    复制代码
    属性为编码方式,常用有两种:
    1. application/x-www-form-urlencoded
    复制代码
    1. multipart/form-data
    复制代码
    ,默认为
    1. application/x-www-form-urlencoded
    复制代码

    当action为get时候,浏览器用
    1. x-www-form-urlencoded
    复制代码
    的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串追加到url后面,用
    1. ?
    复制代码
    分割,加载这个新的url。
    当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有
    1. type=file
    复制代码
    的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有
    1. type=file
    复制代码
    的话,就要用到multipart/form-data了。
    当action为post且Content-Type类型是
    1. multipart/form-data
    复制代码
    ,浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件
    1. name
    复制代码
    )等信息,并加上分割符(boundary)。
    Postman使用示例及分析
    Postman是一款功能强大的网页调试与发送网页HTTP请求的工具。
    可以在这里下载。官网:https://www.getpostman.com/
    这里要请求的是百度短网址的API。

    生成短网址
    请求:向
    1. http://dwz.cn/create.php
    复制代码
    发送post请求,发送数据包括
    1. url=长网址
    复制代码
    返回:json格式的数据
    1. status!=0
    复制代码
    出错,查看
    1. err_msg
    复制代码
    获得错误信息(UTF-8编码)
    成功,返回生成的短网址
    1. tinyurl
    复制代码
    字段

    1、使用
    1. application/x-www-form-urlencoded
    复制代码
    方式:

    这种方式用的比较多。下面是发送预览:

    实际发送的内容:

    2、使用
    1. multipart/form-data
    复制代码
    方式:
    这里也可以指定为
    1. multipart/form-data
    复制代码
    方式。

    一般上传文件才会使用这种方式。下面是发送预览:

    实际发送的内容:

    3、使用
    1. text/plain
    复制代码
    方式:
    一般向服务端发送json数据会使用这种方式。百度短网址API不支持这种方式,这里仅作演示。

    实际发送的内容:

    RESTClient使用示例及分析
    REST Client是一个用于测试REST服务的firefox插件。
    相比Postman,界面简单很多。
    REST Client默认的
    1. Content-Type
    复制代码
    1. text/plain
    复制代码
    方式。如果想使用
    1. application/x-www-form-urlencoded
    复制代码
    或者
    1. multipart/form-data
    复制代码
    方式,需要点击菜单
    1. Headers > Custom Header
    复制代码
    进行添加:

    示例:使用
    1. application/x-www-form-urlencoded
    复制代码
    方式:

    如果使用了
    1. multipart/form-data
    复制代码
    方式,想添加文件,可以点击菜单
    1. File > Load Request
    复制代码
    进行添加。
    PHP里使用CURL需要注意Content-Type细节
    看示例:
    生成短网址
    1. [code]<?php  
    2. $ch = curl_init();
    3. curl_setopt($ch, CURLOPT_URL, "http://dwz.cn/create.php");
    4. curl_setopt($ch, CURLOPT_POST,true);
    5. curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
    6. $data = array("url"=>"http://www.baidu.com/");
    7. //$data = http_build_query($data); //建议加上,否则使用multipart/form-data类型
    8. curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
    9. $strRes = curl_exec($ch);
    10. curl_close($ch);
    11. $arrResponse=json_decode($strRes, true);
    12. if($arrResponse["status"] != 0){
    13.     echo $arrResponse["err_msg"]."\n";
    14. }
    15. echo $arrResponse["tinyurl"]."\n";
    复制代码
    [/code]
    这里的
    1. $data = http_build_query($data);
    复制代码
    可选,建议加上。最终我们通过
    1. $_POST
    复制代码
    读取到数据。
    1. http_build_query
    复制代码
    作用就是把参数转成URL-encode 之后的请求字符串,这个和
    1. application/x-www-form-urlencoded
    复制代码
    方式是一致的。
    为什么不使用
    1. http_build_query
    复制代码
    方法也可以使用
    1. $_POST
    复制代码
    获取到数据呢?
    有个说法是:

    使用数组提供 post 数据时,CURL 组件大概是为了兼容
    1. @filename
    复制代码
    这种上传文件的写法,默认把
    1. Content-Type
    复制代码
    设为了
    1. multipart/form-data
    复制代码
    。虽然对于大多数服务器并没有影响,但是还是有少部分服务器不兼容。

    PHP参考手册里介绍
    1. curl_setopt
    复制代码
    时说道:

    CURLOPT_POSTFIELDS
    全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似"para1=val1&para2=val2&..."或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。

    注释里:

    Note:
    传递一个数组到 CURLOPT_POSTFIELDS ,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。

    总结:
    使用 CURL 并且参数为数据时,向服务器提交数据的时候,HTTP头会发送
    1. Content_type: application/x-www-form-urlencoded
    复制代码
    。这个是正常的网页
    1. <form>
    复制代码
    提交表单时,浏览器发送的头部。而
    1. multipart/form-data
    复制代码
    我们知道这是用于上传文件的表单。包括了 boundary 分界符,会多出很多字节。在没有需要上传文件的情况下,尽量对
    1. post
    复制代码
    提交的数据进行
    1. http_build_query
    复制代码
    处理,然后再发送出去,能实现更好的兼容性,更小的请求数据包。
    当然,如果是发送json数据,发送之前就需要使用
    1. json_encode($data)
    复制代码
    了,使用
    1. text/plain
    复制代码
    方式。
    Http Header一览
    1. Requests Header
    复制代码
    1. Responses Header
    复制代码

    1. Requests Header
    复制代码
    包含Accept、Accept-Charset、Cookie、Content-Type、Referer等内容。
    详见:在线HTTP接口测试
    或者查看HTTP/1.1: Header Field Definitions
    资料:
    1、Http请求中Content-Type讲解以及在Spring MVC中的应用 - 木小鱼的笔记 - 博客频道 - CSDN.NET
    http://blog.csdn.net/blueheart20/article/details/45174399
    2、PHP中CURL的CURLOPT_POSTFIELDS参数使用细节_php技巧_脚本之家
    http://www.jb51.net/article/48185.htm
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-12 00:31 , Processed in 0.411225 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表