HTTP

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

TCP/IP通信协议:

计算机网络体系结构分层



不难看出,TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。

(1)请求方法URI协议/版本

请求的第一行是“方法URL协议版本”:GET/sample.jsp HTTP/1.1

以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。

根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。

URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。

(2)请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。

Accept:image/gif.image/jpeg.*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)

Accept-Encoding:gzip,deflate.

(3) 请求正文

请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:

username=jinqiao&password=1234

在以上的例子的HTTP请求中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。

响应消息包括状态行、若干头部行和附属体(html数据实体)。

状态行包括:HTTP协议版本号、状态码、状态码的文本描述信息。如:HTTP/1.1 200 OK

状态码由一个三位数组成,状态码大体有5种含义:

1. 1xx。信息,请求收到,继续处理。

2. 2xx。成功。200请求成功;206断点续传。

3. 3xx。重定向。一般跳转到新的地址。

4. 4xx。客户端错误。404文件不存在

5. 5xx。服务器错误。500内部错误。
一次HTTP操作称为一个事务,其工作过程可分为四步:

1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

  2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

  3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

  4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

  5、释放 TCP连接;

  6、浏览器将该 html 文本并显示内容;  

http调用工具:

1、application/json

String param = JSONObject.fromObject(jsonMap).toString();

public static String callChannelInterface(String url,String param) throws IOException {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    // 设置请求的header
    httppost.addHeader("Content-type", "application/json");

    // 设置请求的参数
    StringEntity entity = new StringEntity(param.toString(), "utf-8");
    httppost.setEntity(entity);

    HttpResponse response = httpclient.execute(httppost);
    if (response.getStatusLine().getStatusCode() == 200) {
        /*读返回数据*/
        String conResult = EntityUtils.toString(response.getEntity());
        if(conResult!=null && !conResult.equals("[]") && StringUtils.isNotBlank(conResult) && StringUtils.isNotBlank(conResult)){
            return conResult;
        }else{
            return "返回数据为空";
        }
    } else {
        String err = response.getStatusLine().getStatusCode()+"";
        return "发送失败"+err;
    }
}

2、plain/text

String param = JSONObject.fromObject(jsonMap).toString()

public static String callChannelTextInterface(String url,String param) throws IOException {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    // 设置请求的header
    httppost.addHeader("Content-type", "plain/text");

    // 设置请求的参数
    StringEntity entity = new StringEntity(param.toString(), "utf-8");
    httppost.setEntity(entity);

    HttpResponse response = httpclient.execute(httppost);
    if (response.getStatusLine().getStatusCode() == 200) {
        /*读返回数据*/
        String conResult = EntityUtils.toString(response.getEntity());
        if(conResult!=null && !conResult.equals("[]") && StringUtils.isNotBlank(conResult) && StringUtils.isNotBlank(conResult)){
            return conResult;
        }else{
            return "返回数据为空";
        }
    } else {
        String err = response.getStatusLine().getStatusCode()+"";
        return "发送失败"+err;
    }
}

3、application/x-www-form-urlencoded

public static String callChannelFormData(String url,Map<String,String> param) throws IOException {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    // 设置请求的header
    httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
    // 设置请求的参数
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    for (String key : param.keySet()) {
        nameValuePairs.add(new BasicNameValuePair(key, param.get(key))); //请求接口的参数
    }
    StringEntity entity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
    httppost.setEntity(entity);
    HttpResponse response = httpclient.execute(httppost);
    if (response.getStatusLine().getStatusCode() == 200) {
        /*读返回数据*/
        String conResult = EntityUtils.toString(response.getEntity());
        if(conResult!=null && !conResult.equals("[]") && StringUtils.isNotBlank(conResult) && StringUtils.isNotBlank(conResult)){
            return conResult;
        }else{
            return "返回数据为空";
        }
    } else {
        String err = response.getStatusLine().getStatusCode()+"";
        return "发送失败"+err;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值