网络基础学习笔记三

128 阅读3分钟

Android 网络基础学习笔记三

三、 java原生代码网络请求(根据api发送请求,提交评论、带参请求)

提交评论

  • api: "/post/comment"

  • 访问后台地址和端口(模拟器同一电脑访问): " http: //10.0.2.2:9102 "
    创建变量:static final String BaseUrl = "http://10.0.2.2:9102"

  • 创建连接,URL对象: URL url = new URL(BaseUrl + "/post/comment");

  • 准备数据:

CommentItem commentItem = new CommentItem("888888888","学到了!");  //自定义Bean类,传两个参数
Gson gson = new Gson();
String jsonStr = gson.toJson(commentItem); //Gson对象将bean类对象转为json字段;
byte[] bytes = jsonStr.getBytes("UTF-8");

Log.d("jsonStr = ",jsonStr);
Log.d("bytes.length = ", String.valueOf(bytes.length));

connection.setRequestProperty("Content-Length", String.valueOf(bytes.length));  //报头所要传的信息

提交评论的完整代码:

  1. 创建连接,指定提交评论的api,设置相关参数;
  2. 准备评论内容,转为json字符串;
  3. 传输数据;
  4. 获取返回数据;
//提交评论请求
    public void postRequest(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OutputStream outputStream = null;
                InputStream inputStream = null;
                try {
                    URL url = new URL(BaseUrl + "/post/comment");
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("POST");  //请求方式  由后台文档给出
                    connection.setConnectTimeout(10000);  //超时
                    //给报头??必须的吗?   尝试过后,是必须的,设置发送请求和接收数据的格式,与代码中的一致才能发送成功;
                    connection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
                    connection.setRequestProperty("Accept", "application/json, text/plain, */*");

                    //准备请求内容
                    CommentItem commentItem = new CommentItem("888888888","学到了!");
                    Gson gson = new Gson();
                    String jsonStr = gson.toJson(commentItem);
                    byte[] bytes = jsonStr.getBytes("UTF-8");
                    Log.d("jsonStr = ",jsonStr);
                    Log.d("bytes.length = ", String.valueOf(bytes.length));

                    connection.setRequestProperty("Content-Length", String.valueOf(bytes.length));

                    //连接
                    connection.connect();
                    //传输数据
                    outputStream = connection.getOutputStream();
                    outputStream.write(bytes);
                    outputStream.flush();

                    //那结果
                    int responseCode = connection.getResponseCode();
                    Log.d(TAG,"responseCode = " + responseCode);
                    if (responseCode== HttpURLConnection.HTTP_OK) {
                        inputStream = connection.getInputStream();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                        Log.d(TAG,"BufferedReader -> " + reader.readLine());

                    }

                } catch (java.io.IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        if (outputStream != null) {
                            outputStream.close();
                        }
                        if (inputStream != null) {
                            inputStream.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }


提交带参请求

方法:get

接口api:/get/param

参数:

  • keyword 关键字
  • page 页码
  • order 0 顺序 1 逆序

提交带参请求的使用情境之一为网页中的搜索,在此例中,如图:

阳光沙滩网站的搜索

搜索关键字:“数据”,网址跳转为: https: //www. sunofbeach.net/ search? keyword=数据& type=article & page=1

请求格式为:baseUrl + api + ? + key=value + & + key2=value2 (有key和value的话就以"&"隔开)

  • 网页上显示出来的网址请求格式有区别,请求时应该用服务器地址+":"+端口号+api+信息
  1. 准备带参数据:
        Map<String,String> params = new HashMap<>();
        params.put("keyword","我才是关键字");
        params.put("page","12");
        params.put("order","0");
  1. 包装带参数据:带参数据需要打包成规定格式的字符串
        if (params != null && params.size() > 0) {
                StringBuilder sBuilder = new StringBuilder("?");
                Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
                while (iterator.hasNext()) {
                    Map.Entry<String, String> next = iterator.next();
                    sBuilder.append(next.getKey());
                    sBuilder.append("=");
                    sBuilder.append(next.getValue());
                    if (iterator.hasNext()) {
                        sBuilder.append("&");
                    }
                }
                String paramsData = sBuilder.toString();
                Log.d(TAG,"data result ->" + paramsData);
            }
  1. 创建URL:
    String BaseUrl = "http://10.0.2.2:9102";
    String api = "/get/param";
    url = new URL(BaseUrl + api + paramsData);
  1. 创建连接(省略介绍)

完整代码:

    //提交带参请求;
    public void getWithParams(View view) {
        Map<String,String> paramsMap = new HashMap<>();
        paramsMap.put("keyword","我才是关键字");
        paramsMap.put("page","12");
        paramsMap.put("order","0");
        startRequest(paramsMap,"GET","/get/param");
    }

    private void startRequest(final Map<String, String> params, final String method, final String api) {
        new Thread(new Runnable() {
            @Override
            public void run() {

                //把流挪到try外面,方便关掉;
                BufferedReader reader = null;

                try {
                    URL url = null;
                    //包装参数数据(网页的请求网址): baseUrl + api + ? + key=value + & + key2=value2 (有key和value的话就以"&"隔开)
                    // 例:https: //www.sunofbeach.net/search?keyword=数据&type=article&page=1
                    if (params != null && params.size() > 0) {
                        StringBuilder sBuilder = new StringBuilder("?");
                        Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
                        while (iterator.hasNext()) {
                            Map.Entry<String, String> next = iterator.next();
                            sBuilder.append(next.getKey());
                            sBuilder.append("=");
                            sBuilder.append(next.getValue());
                            if (iterator.hasNext()) {
                                sBuilder.append("&");
                            }
                        }
                        String paramsData = sBuilder.toString();
                        Log.d(TAG,"data result ->" + paramsData);

                        url = new URL(BaseUrl + api + paramsData);

                    }else {
                        url = new URL(BaseUrl + api);
                    }

                    //建立连接
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod(method);
                    connection.setRequestProperty("Accept-Language","zh-CH,zh;q=0.9");
                    connection.setRequestProperty("Accept","*/*");
                    connection.setConnectTimeout(10000);
                    connection.connect();

                    //拿到返回值
                    int responseCode = connection.getResponseCode();
                    if (responseCode == HttpURLConnection.HTTP_OK) {
                        reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        String json = reader.readLine();
                        Log.d(TAG,"json:\r\n >>>  " + json);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        if (reader != null) {
                            reader.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();

    }