HttpClient发送请求和接收参数

Posted nevegiveup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpClient发送请求和接收参数相关的知识,希望对你有一定的参考价值。

1、Client端: 

package com.linxin.jia.HttpClient;

import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.util.EntityUtils;

/*
    <!-- HttpClient依赖 -->
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5</version>
    </dependency>
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.5</version>
    </dependency>
    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
    </dependency>
*/
public class Main
{
    public static void main(String[] args)
    {
        TestPost();
        //TestGet();
    }

    private static void TestGet()
    {
        try
        {
            SSLClient client = new SSLClient();

            // get方式的传统传值
            //HttpGet get = new HttpGet("http://localhost:8080/demo/http?st=jiaxin");

            // restful 风格 url
            HttpGet get = new HttpGet("http://localhost:8080/demo/http1/jiaxin");
            get.setHeader("Accept","application/json;charset=utf-8");

            // 此处响应结果值为向上转型得到的值,如果需要获得更多的响应值,可以使用CloseableHttpResponse。
            HttpResponse response = client.execute(get);
            //CloseableHttpResponse response = client.execute(get);
            System.out.println("响应码:"+response.getStatusLine());

            System.out.println("响应body体:"+ EntityUtils.toString(response.getEntity()));
        }
        catch (Exception e)
        {

        }
    }

    private static void TestPost()
    {
        try
        {
            SSLClient client = new SSLClient();
            HttpPost post = new HttpPost("http://localhost:8080/demo/http2");
            post.setHeader("Accept","application/json;charset=utf-8");

            JSONObject params = new JSONObject();
            params.put("name","zhangsan");
            params.put("age","20");
            params.put("address","陕西理工大学");

            // 传值时传递的是json字符串,这样的好处是在服务端无需建立参数模型,直接接收String,便于后期维护。
            StringEntity stringEntity = new StringEntity(params.toJSONString(),"utf-8");
            post.setEntity(stringEntity);

            HttpResponse response = client.execute(post);

            System.out.println("响应码:"+response.getStatusLine());

            System.out.println("响应body体:"+EntityUtils.toString(response.getEntity()));
        }
        catch (Exception e)
        {

        }

    }
}

 

2、Service侧:

1、针对Spring Boot 时,服务端如何获取通过HttpClient传递的参数值

    @RequestMapping(value = {"/http0"})
    // get方式接收值,?传值
    public Map show0(@RequestParam(required = false) String st)
    {
        System.out.println("st is :"+st);
        JSONObject json = new JSONObject();
        json.put("name","zhangsan");
        json.put("age","20");
        return json;
    }

    @RequestMapping(value = {"/http1/{name}"})
    // get方式接收值,rest 风格
    public Map show1(@PathVariable("name") String st)
    {
        System.out.println("st is :"+st);
        JSONObject json = new JSONObject();
        json.put("name","zhangsan");
        json.put("age","20");
        return json;
    }

    @RequestMapping(value = {"/http2"},method = RequestMethod.POST)
    // 接收body体Json字符串
    public String show2(@RequestBody String st)
    {
        System.out.println("st is :"+st);

        return st;
    }

2、 针对Servlet的形式,如何接收传递的参数

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {

        PrintWriter out= resp.getWriter();

        String paramName = req.getParameter("name");
        String paramAge = req.getParameter("age");

        out.print("paramName = " + paramName +" , paramAge = "+paramAge);
        if (null != out)
        {
            out.close();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        PrintWriter out= resp.getWriter();
        // 通过流的形式,将请求Body体的数据读取出来。
        InputStream in = req.getInputStream();
        byte[] b = new byte[1024];
        StringBuilder sb = new StringBuilder();
        int len = -1;
        while( -1 != (len =in.read(b)))
        {
            byte[] temp = null;
            temp = Arrays.copyOf(b, len); // 针对最后一次数据读入,防止从流中读入的数据中包含空格。
            sb.append(new String(temp));
        }
        out.print(sb.toString());
        if (null != out)
        {
            out.close();
        }
        if (null != in)
        {
            in.close();
        }
    }

 

以上是关于HttpClient发送请求和接收参数的主要内容,如果未能解决你的问题,请参考以下文章

记录下httpclient 发送请求 服务端用@RequestBody 自动接收参数 报415

HttpClient使用小结

httpclient工具类,post请求发送json字符串参数,中文乱码处理

HttpClient介绍

HttpClient使用总结

HttpClient使用详解