1.前言

最近迷恋WEB方面的技术,虽然自己是一个嵌入式工程师,但是我深知若需要把传感器终端的数据推送至“平台”必然会和WEB技术打交道。在工作中发现嵌入式工程师喜欢 二进制形式的协议,例如MODBUS。虽然这些协议使用广泛,但是使用这些协议需要在服务器侧专门做一个复杂的解析程序,之后再把数据搬入数据库,这便带来了升级或修改的风险。如果可以使用现有的 HTTP 表单手段或 JSON+RESTFUL手段,是不是可以简化嵌入式推送数据至互联网的过程。答案是可以,那就从PHP表单开始“复习”吧。

2.最简单PHP表单

在这里创建一个welcome.html的文件,文件内容如下:
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>

在这个非常简单的HTML文件中具有两个文本框,两个的名称分别是name和age,该表单的提交方法为POST,welcome.php会处理该提交内容,或通过网页显示或通过存储至数据库。
再创建一个welcome.php的文件,文件内容如下:
<html>
<body>
Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old.
</body>
</html>

提交的表单有两个内容,一个名称为name另一个名称为age。在PHP中可以通过全局数据$_POST["name"]或$_POST["age"]表示,例如$_POST["name"]表示xukai,$_POST["age"]表示26。运行一下welcome.html那么整个过程和结果也就一目了然了。(但是这之前需要安装apache和PHP,如果是windows平台的话可以使用wampserver这样的集成安装包)。


 
图1 welcome.html


 
图2 welcome.php执行结果

3.使用cURL提交表单

如果只运行welcome.html,查看welcome.php的运行结果那么整个表单处理过程依然显得非常模糊。此时可使用cURL工具手动提交表单,这相当于代替welcome.html直接提交表单内容。提交表单需要通过HTTP协议的POST方法,使用cURL工具时默认为GET方法,使用其他方法需要使用-X修饰符,之后跟上HTTP方法名称,例如POST或PUT。另外表单的内容通过&连接,例如name=xukai&age=26。cURL命令具体内容
curl -X  POST --data "name=xukai&age=26" 
http://localhost/welcome.php
执行结果:
<html>
<body>
Welcome xukai.<br />
You are 26 years old.
</body>
</html>

4.HTTP通信抓包分析

通过cURL工具可以熟悉表单的提交方法,但是除了表单内容之外还包括了HTTP请求头和HTTP请求属性等部分。通过网络抓包工具,HTTP请求和响应的具体内容如下:

<Http请求>
POST /welcome.php HTTP/1.1
User-Agent: curl/7.29.0
Host: localhost
Accept: */*
Content-Length: 17
Content-Type: application/x-www-form-urlencoded name=xukai&age=26

<Http响应>
HTTP/1.1 200 OK
Date: Wed, 18 Dec 2013 13:49:15 GMT
Server: Apache/2.4.4 (Win32) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Content-Length: 81
Content-Type: text/html <html>
<body>
Welcome xukai.<br />
You are 26 years old.
</body>
</html>

在HTTP请求中
POST /welcome.php HTTP/1.1中POST为请求方法,/welcome.php为文件地址,HTTP/1.1为HTTP协议版本编号。User-Agent: curl/7.29.0表示代理器的名称,该属性非必须。Host: localhost为远程主机名称,在这里在localhost意为本机,此处也可以为192.168.1.106或者example.com等合法地址或域名,该属性为必须。Accept: */*表示接受内容,该属性非必须。Content-Length: 17表示被提交表单的长度,该属性为必须。Content-Type: application/x-www-form-urlencoded表示表单的编码格式,该属性为必须。name=xukai&age=26为表单内容,属于HTTP请求内容部分。HTTP请求属性和HTTP请求内容之间存在一个空行。

在HTTP响应中
HTTP/1.1 200 OK表示请求成功。

5.总结

通过一个简单的例子复习PHP表单技术,通过cURL工具和HTTP抓包工具分析HTTP请求和响应,为MCU提交表单做技术准备。

6.参考博文




PHP再学习1——cURL表单提交、HTTP请求和响应分析的更多相关文章

  1. [学习笔记]--Jfinal 表单提交附件

    近期.项目里面用到了Jfinal 里面的上传附件. Jfinal 的Controller 里面提供了一个 getFile系列方法提供文件上传. 我这里呢,是文件上传和表单參数一起提交. 页面类似下图: ...

  2. 20151223jquery学习笔记--Ajax表单提交

    传统的表单提交, 需要多次跳转页面, 极大的消耗资源也缺乏良好的用户体验. 而这款form.js 表单的 Ajax 提交插件将解决这个问题.一. 核心方法官方网站: http://malsup.com ...

  3. Java EE之servlet处理表单提交的请求

    1.在源包下新建一个Servlet页,取名为LoginServlet: package weinidingServlet;                            //该Servlet所 ...

  4. SpringMVC学习笔记:表单提交 参数的接收

    SpringMVC可以接收原生form表单和json格式数据 有一个名为Book的model,其中的属性如下: 字符串类型的name,数字类型的price,数组类型的cover,集合类型的author ...

  5. Linux curl 表单登录或提交与cookie使用

    本文主要讲解通过curl 实现表单提交登录.单独的表单提交与表单登录都差不多,因此就不单独说了. 说明:针对curl表单提交实现登录,不是所有网站都适用,原因是有些网站后台做了限制或有其他校验.我们不 ...

  6. Javascript高级编程学习笔记(74)—— 表单(2)表单提交及重置

    表单提交 表单的很大一部分作用就是帮助用户完成和服务器的交互 所以表单提交是表单中比较重要的部分 虽然现如今的大部分应用场景都使用 AJAX 的异步请求来代替表单,但是仍有部分操作需要使用表单来完成, ...

  7. JavaWeb学习日记----表单提交方式

    1.表单提交方式 (1) 使用input控件中的submit提交 代码如下: <!DOCTYPE html> <html lang="en"> <he ...

  8. 在客户端先通过JS验证后再将表单提交到服务器

    问题:想要在客户端先通过JS验证后再将表单提交到服务器 参考资料: jQuery 事件 - submit() 方法 试验过程: 服务器端使用PHP <html> <head> ...

  9. Linux curl 模拟form表单提交信息和文件

    Linux curl 模拟form表单提交信息和文件   curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大 ...

随机推荐

  1. 8款PHP调试工具

    Web 开发并不是一项轻松的任务,有超级多服务端脚本语言提供给开发者,但是当前 PHP 因为具有额外的一些强大的功能而越来越流行.PHP 是最强大的服务端脚本语言之一,同时也是 web 开发者和设计者 ...

  2. android webview js alert对话框 不能弹出 解决办法

    在配置了webview的 setting属性后,以前设置的都是可以直接弹出来的,今天写一个小demo时候莫名其妙的发现alert怎么也出来,即使设置了这么多也不行: webSettings.setJa ...

  3. Java Web编程的主要组件技术——Struts核心组件

    参考书籍:<J2EE开源编程精要15讲> Struts配置文件struts-config.xml Struts核心文件,可配置各种组件,包括Form Beans.Actions.Actio ...

  4. Java知识点:instanceof关键字

    介绍 格式:a instanceof B,其中a是一个variable(设a所指向的对象的类型命名为A,即A是一个type. 功能:判断A是否 is-a B. 当a=null时,始终返回false. ...

  5. I.MX6 开启 1000Mb/s interface

    /*********************************************************************** * I.MX6 开启 1000Mb/s interfa ...

  6. django访问静态文件

    DJANGO 1.6 静态文件处理 添加 STATICFILES_DIRS = (os.path.abspath('static'),) 新建static目录

  7. 【Java学习笔记】Hello world

    package aaa; public class aaa { public static void main(String args[]){ System.out.println("hel ...

  8. Jabber/XMPP协议与架构

    一.概述 由Jeremie Miller于1998年开始这个项目.Jabber是一个开放源码形式组织产生的网络实时通信协议,第一个公开版本于2000年5月发行.Jabber已经由IETF XMPP协议 ...

  9. Andorid-Fragment生命周期

    官网帮助文档链接: http://developer.android.com/guide/components/fragments.html Fragment的生命周期: Fragment与Activ ...

  10. hdu 2870(dp求最大子矩阵)

    题意:让你求的是由同一字母组成的最大子矩阵,w可以变成a或者b,x可以变成b或者c,y可以变成a或者c,z可以变成a或者b或者c. 分析:这是hdu 1506.hdu 1505的加强版,具体的分析看我 ...