`
suko
  • 浏览: 75194 次
  • 性别: Icon_minigender_1
  • 来自: 富安
社区版块
存档分类
最新评论

HTTP请求如何带参

 
阅读更多
HTTP请求如何带参

转载自:http://www.cnblogs.com/xirihanlin/archive/2011/12/05/2276772.html,谢谢作者分享

这两天正好作一份API的接口文档,关于HTTP request如何传递参数不是很清楚,这里转载了他人的文档,让我明白了很多。。
http://tomfish88.iteye.com/category/138221?show_full=true

----------------

HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉 HTTP协议。一个最简单的调用如下:

import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;

public class Test {
    public static void main(String[] args) {

       // 核心应用类
       HttpClient httpClient = new DefaultHttpClient();

        // HTTP请求
        HttpUriRequest request =
                new HttpGet("http://localhost/index.html");

        // 打印请求信息
        System.out.println(request.getRequestLine());
        try {
            // 发送请求,返回响应
            HttpResponse response = httpClient.execute(request);

            // 打印响应信息
            System.out.println(response.getStatusLine());
        } catch (ClientProtocolException e) {
            // 协议错误
            e.printStackTrace();
        } catch (IOException e) {
            // 网络异常
            e.printStackTrace();
        }
    }
}

如果HTTP服务器正常并且存在相应的服务,则上例会打印出两行结果:

    GET http://localhost/index.html HTTP/1.1
    HTTP/1.1 200 OK

核心对象httpClient的调用非常直观,其execute方法传入一个request对象,返回一个response对象。使用 httpClient发出HTTP请求时,系统可能抛出两种异常,分别是ClientProtocolException和IOException。第一种异常的发生通常是协议错误导致,如在构造HttpGet对象时传入的协议不对(例如不小心将”http”写成”htp”),或者服务器端返回的内容不符合HTTP协议要求等;第二种异常一般是由于网络原因引起的异常,如HTTP服务器未启动等。
从实际应用的角度看,HTTP协议由两大部分组成:HTTP请求和HTTP响应。那么HttpClient程序包是如何实现HTTP客户端应用的呢?实现过程中需要注意哪些问题呢?
HTTP请求

HTTP 1.1由以下几种请求组成:GET, HEAD, POST, PUT, DELETE, TRACE and OPTIONS, 程序包中分别用HttpGet, HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, and HttpOptions 这几个类创建请求。所有的这些类均实现了HttpUriRequest接口,故可以作为execute的执行参数使用。
所有请求中最常用的是GET与POST两种请求,与创建GET请求的方法相同,可以用如下方法创建一个POST请求:

HttpUriRequest request = new HttpPost(
        "http://localhost/index.html");


HTTP请求格式告诉我们,有两个位置或者说两种方式可以为request提供参数:request-line方式与request-body方式。
request-line

request-line方式是指在请求行上通过URI直接提供参数。
(1)
我们可以在生成request对象时提供带参数的URI,如:

HttpUriRequest request = new HttpGet(
        "http://localhost/index.html?param1=value1&param2=value2");

(2)
另外,HttpClient程序包为我们提供了URIUtils工具类,可以通过它生成带参数的URI,如:

URI uri = URIUtils.createURI("http", "localhost", -1, "/index.html",
    "param1=value1&param2=value2", null);
HttpUriRequest request = new HttpGet(uri);
System.out.println(request.getURI());

上例的打印结果如下:

    http://localhost/index.html?param1=value1&param2=value2

(3)
需要注意的是,如果参数中含有中文,需将参数进行URLEncoding处理,如:

String param = "param1=" + URLEncoder.encode("中国", "UTF-8") + "&param2=value2";
URI uri = URIUtils.createURI("http", "localhost", 8080,
"/sshsky/index.html", param, null);
System.out.println(uri);

上例的打印结果如下:

    http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD&param2=value2

(4)
对于参数的URLEncoding处理,HttpClient程序包为我们准备了另一个工具类:URLEncodedUtils。通过它,我们可以直观的(但是比较复杂)生成URI,如:

List params = new ArrayList();
params.add(new BasicNameValuePair("param1", "中国"));
params.add(new BasicNameValuePair("param2", "value2"));
String param = URLEncodedUtils.format(params, "UTF-8");
URI uri = URIUtils.createURI("http", "localhost", 8080,
"/sshsky/index.html", param, null);
System.out.println(uri);

上例的打印结果如下:

    http://localhost/index.html?param1=%E4%B8%AD%E5%9B%BD&param2=value2

request-body

与request-line方式不同,request-body方式是在request-body中提供参数,此方式只能用于POST请求。在 HttpClient程序包中有两个类可以完成此项工作,它们分别是UrlEncodedFormEntity类与MultipartEntity类。这两个类均实现了HttpEntity接口。
(1)
使用最多的是UrlEncodedFormEntity类。通过该类创建的对象可以模拟传统的HTML表单传送POST请求中的参数。如下面的表单:

<form action="http://localhost/index.html" method="POST">
    <input type="text" name="param1" value="中国"/>
    <input type="text" name="param2" value="value2"/>
    <inupt type="submit" value="submit"/>
</form>

我们可以用下面的代码实现:

List formParams = new ArrayList();
formParams.add(new BasicNameValuePair("param1", "中国"));
formParams.add(new BasicNameValuePair("param2", "value2"));
HttpEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");

HttpPost request = new HttpPost(“http://localhost/index.html”);
request.setEntity(entity);

当然,如果想查看HTTP数据格式,可以通过HttpEntity对象的各种方法取得。如:

List formParams = new ArrayList();
formParams.add(new BasicNameValuePair("param1", "中国"));
formParams.add(new BasicNameValuePair("param2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "UTF-8");

System.out.println(entity.getContentType());
System.out.println(entity.getContentLength());
System.out.println(EntityUtils.getContentCharSet(entity));
System.out.println(EntityUtils.toString(entity));

上例的打印结果如下:

    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    39
    UTF-8
    param1=%E4%B8%AD%E5%9B%BD&param2=value2

(2)
除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为 multipart/form-data。在HttpClient程序扩展包(HttpMime)中专门有一个类与之对应,那就是 MultipartEntity类。此类同样实现了HttpEntity接口。如下面的表单:

<form action="http://localhost/index.html" method="POST"
        enctype="multipart/form-data">
    <input type="text" name="param1" value="中国"/>
    <input type="text" name="param2" value="value2"/>
    <input type="file" name="param3"/>
    <inupt type="submit" value="submit"/>
</form>

我们可以用下面的代码实现:

MultipartEntity entity = new MultipartEntity();
entity.addPart("param1", new StringBody("中国", Charset.forName("UTF-8")));
entity.addPart("param2", new StringBody("value2", Charset.forName("UTF-8")));
entity.addPart("param3", new FileBody(new File("C:\\1.txt")));

HttpPost request = new HttpPost(“http://localhost/index.html”);
request.setEntity(entity);
分享到:
评论

相关推荐

    java代码-使用java解决带参发送post方式的http请求的源代码

    java代码-使用java解决带参发送post方式的http请求的源代码 ——学习参考资料:仅用于个人学习使用!

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    Apache HttpClient库提供了一种强大的方法来执行HTTP请求,无论是简单的GET请求还是复杂的带有表单参数的POST请求。本文将通过具体的代码示例,详细介绍如何使用Java HttpClient来发送这两种类型的请求。 #### 二、...

    kettle抽取http请求,发送json参数.docx

    kettle抽取http请求,发送json参数 在数据integration和ETL(Extract, Transform, Load)过程中,kettle是一个常用的数据抽取工具。下面通过一个示例,来说明如何使用kettle抽取http请求,发送json参数。 标题解释...

    Spring boot如何配置请求的入参和出参json数据格式

    在Spring Boot应用中,处理HTTP请求的入参和出参通常是通过模型绑定和自定义转换器来实现的。本文将详细讲解如何配置JSON数据格式,以便于解析和序列化日期等复杂类型的数据。 首先,针对请求入参的JSON数据格式...

    Android AndBase框架使用封装好的函数完成Http请求(三)

    在Android开发中,网络请求是应用与服务器交互的重要部分,AndBase框架提供了一种便捷的方式来完成Http请求。本文主要探讨如何使用AndBase框架进行无参和有参的Http Get及Post请求。 首先,我们来看如何使用AndBase...

    无参数的post请求

    无参数的POST请求,顾名思义,就是不通过HTTP请求体(body)传递任何数据的POST请求。尽管它被称为“无参数”,但实际上仍然可以通过其他方式向服务器传递必要的信息,例如通过请求头(header)或者查询字符串...

    orcle发起get请求

    在Oracle环境中,利用PL/SQL进行HTTP请求(特别是GET请求)是一项非常实用的功能。这不仅能够帮助我们实现与外部Web服务的交互,还能拓展Oracle数据库的功能边界。以下是对给定文件中的代码进行的详细解析。 #### ...

    Unity 中通过UnityWebRequest 以GET形式传authorization 的参数请求数据。

    Unity 中通过UnityWebRequest 以GET形式传authorization 的参数请求数据。 注意: 以Header头文件的形式发送请求,authorization要放入请求头部。 以头文件形式发起请求进行Token验证,token为Authorization中的...

    https带参数的post和get.docx

    这将发送如下HTTP请求: ``` POST http://www.example.com HTTP/1.1 Content-Type: application/json;charset=utf-8 {"title":"test","sub":[1,2,3]} ``` 总结一下,GET请求通常用于获取资源,其参数显示在URL中,...

    post调用接口(附带身份验证和自带参数的方式)

    if (responseCode == HttpURLConnection.HTTP_OK) { System.out.println("请求成功"); // 在这里处理响应数据 } else { System.out.println("请求失败,状态码:" + responseCode); } } } ``` 这个Java示例...

    python requests 库请求带有文件参数的接口实例

    #### 二、带有文件参数的HTTP请求分析 在某些场景下,我们需要通过HTTP请求上传文件到服务器,这时就需要使用到`files`参数。不同于普通的`data`参数,`files`参数需要特殊的处理方式。 #### 三、实例代码详解 ...

    service_java接口远程调用_get、post、带参数远程调用_

    服务类中会包含执行HTTP请求的方法,可能包括设置请求头、处理响应等逻辑。 4. **使用库封装HTTP请求**: - `HttpURLConnection`是Java标准库的一部分,适合简单的需求,但功能相对有限。对于更复杂的场景,推荐...

    java发送httpPost请求实现

    用java编写了http Post的请求代码,通过发送请求的 URL,获取远程资源的响应结果,入参为json字符串。使用到httpPost,CloseableHttpClient

    Android-OkHttp的请求拦截器实现请求拦截打印日志到logcat

    在Android开发中,网络编程是不可或缺的一部分,而OkHttp作为一款高效的HTTP客户端库,被广泛应用于Android应用中。本文将详细讲解如何利用OkHttp的请求拦截器(Interceptor)实现请求的拦截并打印日志到logcat,这...

    PB如何提交WEB请求包含中文参数的解决方案全过程.docx

    PB 提交 WEB 请求包含中文参数的解决方案全过程 PB 是 PowerBuilder 的缩写,这是一种流行的开发工具,但是在提交 WEB 请求包含中文参数时,会出现乱码问题。本文将详细介绍如何解决这个问题,包括使用 GETURL 和 ...

    Feign发送Get请求时,采用POJO对象传递参数的最终解决方案.docx

    在Spring Cloud技术栈中,Feign作为一种声明式的HTTP客户端框架,极大地简化了微服务间的HTTP请求调用过程,使其几乎如同调用本地方法一般方便。然而,在实际开发过程中,Feign并非完全无懈可击,开发者经常会遇到...

    用maven创建基于wink的rest服务(二)-携带参数的get请求

    在本教程中,我们将深入探讨如何使用Maven构建一个基于Wink框架的RESTful服务,特别是处理带有参数的GET请求。Wink是Apache的一个开源项目,它提供了实现RESTful Web服务的一系列工具和库,而Maven则是一个流行的...

    Java如何实现URL带请求参数(get/post)及得到get和post请求url和参数列表的方法

    在Java编程中,处理HTTP请求,特别是GET和POST方式,是常见的任务。本文将深入探讨如何在Java中实现URL带请求参数(GET/POST)以及如何获取这两种请求的URL和参数列表。 首先,我们来看如何发送带有参数的GET和POST...

    Java Spring Controller 获取请求参数的几种方法详解

    在Java Spring MVC框架中,Controller是处理HTTP请求的核心组件,它负责接收客户端发送的数据并进行业务逻辑处理。本文将详细讲解在Spring Controller中获取请求参数的六种常见方法。 1. **直接作为方法参数** 当...

Global site tag (gtag.js) - Google Analytics