zoukankan      html  css  js  c++  java
  • java 的http请求方式:HttpURLConnection和HttpClient

    1、要了解一些概念性的东西,比如Http的协议以及协议头等一些东东

    2、HttpURLConnection一般步骤:创建URL对象==》获取URL的HttpURLConnection对象实例==》设置HTTP请求使用的方法==》设置超时和消息头==》对服务器响应码判断==》获得服务器返回的输入流==》关掉HTTP连接

    2.1、GET请求示例

    //创建URL对象,xxx是服务器API
    URL url = new URL("xxx");
    //调用URL对象的openConnection( )来获取HttpURLConnection对象实例
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //请求方法为GET
    conn.setRequestMethod("GET");
    //设置连接超时为5秒
    conn.setConnectTimeout(5000);
    //服务器返回东西了,先对响应码判断
    if (conn.getResponseCode() == 200) {
        //用getInputStream()方法获得服务器返回的输入流
        InputStream in = conn.getInputStream();
        byte[] data = read(in); //流转换为二进制数组,read()自己写的是转换方法
        String html = new String(data, "UTF-8");
        System.out.println(html);
        in.close();
    }

    ps:上述步骤基于服务器接口正常的前提下,当然异常要另外处理,请求头按实际需要设置,得到服务器返回的输入流后按需要转换使用,另外有时候网络请求要开一条线程

    2.2、POST请求:POST请求大体和GET一致,只是设置相关参数的时候要注意设置允许输入、输出,还有POST方法不能缓存,要手动设置为false

    //创建URL对象,xxx是服务器API
    URL url = new URL("xxx");
    //调用URL对象的openConnection( )来获取HttpURLConnection对象实例
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //请求方法为GET
    conn.setRequestMethod("POST");
    //设置连接超时为5秒
    conn.setConnectTimeout(5000);
    //允许输入输出
    conn.setDoInput(true);
    conn.setDoOutput(true);
    //不能缓存
    conn.setUseCaches(false);
    //至少要设置的两个请求头
    conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
    //输出流包含要发送的数据,要注意数据格式编码
    OutputStream op=conn.getOutputStream();
    op.write(new String("name=zhylioooo").getBytes());
    //服务器返回东西了,先对响应码判断
    if (conn.getResponseCode() == 200) {
        //用getInputStream()方法获得服务器返回的输入流
        InputStream in = conn.getInputStream();
        byte[] data = read(in); //流转换为二进制数组,read()是转换方法
        String html = new String(data, "UTF-8");
        System.out.println(html);
        in.close();
    }

    3、HttpClient的使用步骤:创建HttpClient对象==》创建Http请求对象(GET、POST不同)==》设置请求参数==》执行请求==》获取响应对象==》对响应对象处理==》关闭相应对象==》关闭HttpClient

    3.1、GET

          //创建httpclient对象
                CloseableHttpClient httpclient = HttpClients.createDefault();
                //创建GET对象
                HttpGet httpget = new HttpGet("xxx");//xxx是服务器API
                //执行请求
                CloseableHttpResponse response = httpclient.execute(httpget);
                if(response.getStatusLine().getStatusCode()==200) {
                    HttpEntity entity = response.getEntity();
                    //所需内容都在entity里面,这里可以对数据操作
                    String detail = EntityUtils.toString(entity,"UTF-8");
                    System.out.println(detail);
                }
                response.close();
                httpclient.close();

    如果需要参数,可以用URIBuilder工具类来简化

    URI uri = new URIBuilder()
            .setScheme("https")
            .setHost("xxx")
            .setPath("/xxx")
            .setParameter("key1", "value1")
            .setParameter("key2", "value2")
            .build();
    HttpGet httpget = new HttpGet(uri);

    3.2、POST:POST一般用于提交一些特别的东西,内容多种多样,HttpClient针对不同内容提供了不同的数据容器,如最常见的字符串(StringEntity),字节数组(ByteArrayEntity),输入流(InputStreamEntity),和文件(FileEntity),请注意InputStreamEntity是不可重复的,因为它只能从底层数据流中读取一次。一般建议实现一个自定义HttpEntity类,而不是使用泛型InputStreamEntity。 FileEntity可以是一个很好的起点:

    File file = new File("xxx.txt");
    FileEntity entity = new FileEntity(file, 
        ContentType.create("text/plain", "UTF-8"));        
    HttpPost httppost = new HttpPost("xxx");
    httppost.setEntity(entity);

    POST最常见的提交表单数据:创建完HttpPost对象后,通过NameValuePair集合来存储等待提交的参数,并将参数传递到UrlEncodedFormEntity中,最后调用setEntity(entity)完成, HttpClient.execute(HttpPost)即可:

    List<NameValuePair> formparams = new ArrayList<NameValuePair>();
    formparams.add(new BasicNameValuePair("name", "zhylioooo"));
    formparams.add(new BasicNameValuePair("pswd", "123456"));
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
    HttpPost httppost = new HttpPost("xxx");
    httppost.setEntity(entity);

    4、一般实际开发很少自己写HttpURLConnection和HttpClient,都是用别人封装 好的第三方网络请求框架,例如:Volley,android-async-http,loopj等,因为网络操作涉及到 异步以及多线程,自己动手写的话很麻烦,所以实际开发还是直接用第三方。

    5、HttpClient用到的jar包:https://pan.baidu.com/s/1gfjHi2B

  • 相关阅读:
    IPC总结学习
    机器学习中的范数规则
    机器学习的几个误区-转载
    来几道大数据的面试题吧
    海量数据随机抽样问题(蓄水池问题)
    字符串类算法题目总结
    RPC学习
    如何做出健壮的系统设计
    关于bind函数和connect函数的测试结论
    [置顶] Codeforces Round #197 (Div. 2)(完全)
  • 原文地址:https://www.cnblogs.com/zhylioooo/p/7890906.html
Copyright © 2011-2022 走看看