• [Android] Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用


    本文是 Android RxJava2+Retrofit2+OkHttp3 的使用(一) --基础篇 Retrofit2 的使用

    本文的目标是用 Retrofit写一个网络请求:

    本文以从获取天气预报接口 (具体接口查看上文 免费天气预报接口)为例,讲解 Retrofit2 的使用

    废话不多说,开撸

    一、添加依赖

    在build.gradle文件中添加如下配置

    //retrofit2
    compile 'com.squareup.retrofit2:retrofit:2.3.0'//导入retrofit
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'//转换器,请求结果转换成Model

    二、创建Bean

    根据接口返回的JSon数据,使用GsonFormat插件自动创建 WeatherBean 文件 (GsonFormat插件 的安装方法和其余插件安装方法并无二致)

    1)打开链接http://t.weather.sojson.com/api/weather/city/101030100,然后复制返回的json数据

    2)新建WeatherBean.java ,然后 Alt + Delete ,选择GsonFormat,将复制到的JSON数据赋值进去,点击 “确定” 生成 即可

    这是我自动生成的文件:

    package com.jack.basemvp.bean;
    
    import java.util.List;
    
    /**
     * 由GsonFormat 生成
     */
    public class WeatherBean {
    
        /**
         * time : 2019-04-20 19:11:47
         * cityInfo : {"city":"天津市","cityId":"101030100","parent":"天津","updateTime":"18:32"}
         * date : 20190420
         * message : Success !
         * status : 200
         * data : {"shidu":"46%","pm25":49,"pm10":87,"quality":"良","wendu":"14","ganmao":"极少数敏感人群应减少户外活动","yesterday":{"date":"19","sunrise":"05:32","high":"高温 18.0℃","low":"低温 11.0℃","sunset":"18:51","aqi":58,"ymd":"2019-04-19","week":"星期五","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"},"forecast":[{"date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃","sunset":"18:52","aqi":64,"ymd":"2019-04-20","week":"星期六","fx":"东北风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"21","sunrise":"05:29","high":"高温 20.0℃","low":"低温 12.0℃","sunset":"18:53","aqi":72,"ymd":"2019-04-21","week":"星期日","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"22","sunrise":"05:27","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:54","aqi":89,"ymd":"2019-04-22","week":"星期一","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"23","sunrise":"05:26","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:55","aqi":91,"ymd":"2019-04-23","week":"星期二","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"24","sunrise":"05:25","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"18:56","aqi":66,"ymd":"2019-04-24","week":"星期三","fx":"东风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"25","sunrise":"05:23","high":"高温 19.0℃","low":"低温 12.0℃","sunset":"18:57","aqi":41,"ymd":"2019-04-25","week":"星期四","fx":"东南风","fl":"<3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"26","sunrise":"05:22","high":"高温 21.0℃","low":"低温 12.0℃","sunset":"18:58","ymd":"2019-04-26","week":"星期五","fx":"东南风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"27","sunrise":"05:21","high":"高温 21.0℃","low":"低温 10.0℃","sunset":"18:59","ymd":"2019-04-27","week":"星期六","fx":"南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"28","sunrise":"05:19","high":"高温 23.0℃","low":"低温 12.0℃","sunset":"19:00","ymd":"2019-04-28","week":"星期日","fx":"北风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"29","sunrise":"05:18","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"19:01","ymd":"2019-04-29","week":"星期一","fx":"北风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"30","sunrise":"05:17","high":"高温 23.0℃","low":"低温 14.0℃","sunset":"19:02","ymd":"2019-04-30","week":"星期二","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"01","sunrise":"05:15","high":"高温 24.0℃","low":"低温 16.0℃","sunset":"19:03","ymd":"2019-05-01","week":"星期三","fx":"东南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"02","sunrise":"05:14","high":"高温 25.0℃","low":"低温 15.0℃","sunset":"19:04","ymd":"2019-05-02","week":"星期四","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"03","sunrise":"05:13","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:05","ymd":"2019-05-03","week":"星期五","fx":"西南风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"04","sunrise":"05:12","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:06","ymd":"2019-05-04","week":"星期六","fx":"东南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"}]}
         */
    
        private String time;
        private CityInfoBean cityInfo;
        private String date;
        private String message;
        private int status;
        private DataBean data;
    
        public String getTime() {
            return time;
        }
    
        public void setTime(String time) {
            this.time = time;
        }
    
        public CityInfoBean getCityInfo() {
            return cityInfo;
        }
    
        public void setCityInfo(CityInfoBean cityInfo) {
            this.cityInfo = cityInfo;
        }
    
        public String getDate() {
            return date;
        }
    
        public void setDate(String date) {
            this.date = date;
        }
    
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    
        public int getStatus() {
            return status;
        }
    
        public void setStatus(int status) {
            this.status = status;
        }
    
        public DataBean getData() {
            return data;
        }
    
        public void setData(DataBean data) {
            this.data = data;
        }
    
        public static class CityInfoBean {
            /**
             * city : 天津市
             * cityId : 101030100
             * parent : 天津
             * updateTime : 18:32
             */
    
            private String city;
            private String cityId;
            private String parent;
            private String updateTime;
    
            public String getCity() {
                return city;
            }
    
            public void setCity(String city) {
                this.city = city;
            }
    
            public String getCityId() {
                return cityId;
            }
    
            public void setCityId(String cityId) {
                this.cityId = cityId;
            }
    
            public String getParent() {
                return parent;
            }
    
            public void setParent(String parent) {
                this.parent = parent;
            }
    
            public String getUpdateTime() {
                return updateTime;
            }
    
            public void setUpdateTime(String updateTime) {
                this.updateTime = updateTime;
            }
        }
    
        public static class DataBean {
            /**
             * shidu : 46%
             * pm25 : 49.0
             * pm10 : 87.0
             * quality : 良
             * wendu : 14
             * ganmao : 极少数敏感人群应减少户外活动
             * yesterday : {"date":"19","sunrise":"05:32","high":"高温 18.0℃","low":"低温 11.0℃","sunset":"18:51","aqi":58,"ymd":"2019-04-19","week":"星期五","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"}
             * forecast : [{"date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃","sunset":"18:52","aqi":64,"ymd":"2019-04-20","week":"星期六","fx":"东北风","fl":"<3级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"21","sunrise":"05:29","high":"高温 20.0℃","low":"低温 12.0℃","sunset":"18:53","aqi":72,"ymd":"2019-04-21","week":"星期日","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"22","sunrise":"05:27","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:54","aqi":89,"ymd":"2019-04-22","week":"星期一","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"23","sunrise":"05:26","high":"高温 26.0℃","low":"低温 16.0℃","sunset":"18:55","aqi":91,"ymd":"2019-04-23","week":"星期二","fx":"南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"24","sunrise":"05:25","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"18:56","aqi":66,"ymd":"2019-04-24","week":"星期三","fx":"东风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"25","sunrise":"05:23","high":"高温 19.0℃","low":"低温 12.0℃","sunset":"18:57","aqi":41,"ymd":"2019-04-25","week":"星期四","fx":"东南风","fl":"<3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"26","sunrise":"05:22","high":"高温 21.0℃","low":"低温 12.0℃","sunset":"18:58","ymd":"2019-04-26","week":"星期五","fx":"东南风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"27","sunrise":"05:21","high":"高温 21.0℃","low":"低温 10.0℃","sunset":"18:59","ymd":"2019-04-27","week":"星期六","fx":"南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"28","sunrise":"05:19","high":"高温 23.0℃","low":"低温 12.0℃","sunset":"19:00","ymd":"2019-04-28","week":"星期日","fx":"北风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"29","sunrise":"05:18","high":"高温 22.0℃","low":"低温 12.0℃","sunset":"19:01","ymd":"2019-04-29","week":"星期一","fx":"北风","fl":"3-4级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"30","sunrise":"05:17","high":"高温 23.0℃","low":"低温 14.0℃","sunset":"19:02","ymd":"2019-04-30","week":"星期二","fx":"东南风","fl":"3-4级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"01","sunrise":"05:15","high":"高温 24.0℃","low":"低温 16.0℃","sunset":"19:03","ymd":"2019-05-01","week":"星期三","fx":"东南风","fl":"<3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"02","sunrise":"05:14","high":"高温 25.0℃","low":"低温 15.0℃","sunset":"19:04","ymd":"2019-05-02","week":"星期四","fx":"东南风","fl":"3-4级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"03","sunrise":"05:13","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:05","ymd":"2019-05-03","week":"星期五","fx":"西南风","fl":"4-5级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"04","sunrise":"05:12","high":"高温 24.0℃","low":"低温 14.0℃","sunset":"19:06","ymd":"2019-05-04","week":"星期六","fx":"东南风","fl":"<3级","type":"阴","notice":"不要被阴云遮挡住好心情"}]
             */
    
            private String shidu;
            private double pm25;
            private double pm10;
            private String quality;
            private String wendu;
            private String ganmao;
            private YesterdayBean yesterday;
            private List<ForecastBean> forecast;
    
            public String getShidu() {
                return shidu;
            }
    
            public void setShidu(String shidu) {
                this.shidu = shidu;
            }
    
            public double getPm25() {
                return pm25;
            }
    
            public void setPm25(double pm25) {
                this.pm25 = pm25;
            }
    
            public double getPm10() {
                return pm10;
            }
    
            public void setPm10(double pm10) {
                this.pm10 = pm10;
            }
    
            public String getQuality() {
                return quality;
            }
    
            public void setQuality(String quality) {
                this.quality = quality;
            }
    
            public String getWendu() {
                return wendu;
            }
    
            public void setWendu(String wendu) {
                this.wendu = wendu;
            }
    
            public String getGanmao() {
                return ganmao;
            }
    
            public void setGanmao(String ganmao) {
                this.ganmao = ganmao;
            }
    
            public YesterdayBean getYesterday() {
                return yesterday;
            }
    
            public void setYesterday(YesterdayBean yesterday) {
                this.yesterday = yesterday;
            }
    
            public List<ForecastBean> getForecast() {
                return forecast;
            }
    
            public void setForecast(List<ForecastBean> forecast) {
                this.forecast = forecast;
            }
    
            public static class YesterdayBean {
                /**
                 * date : 19
                 * sunrise : 05:32
                 * high : 高温 18.0℃
                 * low : 低温 11.0℃
                 * sunset : 18:51
                 * aqi : 58.0
                 * ymd : 2019-04-19
                 * week : 星期五
                 * fx : 东南风
                 * fl : 3-4级
                 * type : 阴
                 * notice : 不要被阴云遮挡住好心情
                 */
    
                private String date;
                private String sunrise;
                private String high;
                private String low;
                private String sunset;
                private double aqi;
                private String ymd;
                private String week;
                private String fx;
                private String fl;
                private String type;
                private String notice;
    
                public String getDate() {
                    return date;
                }
    
                public void setDate(String date) {
                    this.date = date;
                }
    
                public String getSunrise() {
                    return sunrise;
                }
    
                public void setSunrise(String sunrise) {
                    this.sunrise = sunrise;
                }
    
                public String getHigh() {
                    return high;
                }
    
                public void setHigh(String high) {
                    this.high = high;
                }
    
                public String getLow() {
                    return low;
                }
    
                public void setLow(String low) {
                    this.low = low;
                }
    
                public String getSunset() {
                    return sunset;
                }
    
                public void setSunset(String sunset) {
                    this.sunset = sunset;
                }
    
                public double getAqi() {
                    return aqi;
                }
    
                public void setAqi(double aqi) {
                    this.aqi = aqi;
                }
    
                public String getYmd() {
                    return ymd;
                }
    
                public void setYmd(String ymd) {
                    this.ymd = ymd;
                }
    
                public String getWeek() {
                    return week;
                }
    
                public void setWeek(String week) {
                    this.week = week;
                }
    
                public String getFx() {
                    return fx;
                }
    
                public void setFx(String fx) {
                    this.fx = fx;
                }
    
                public String getFl() {
                    return fl;
                }
    
                public void setFl(String fl) {
                    this.fl = fl;
                }
    
                public String getType() {
                    return type;
                }
    
                public void setType(String type) {
                    this.type = type;
                }
    
                public String getNotice() {
                    return notice;
                }
    
                public void setNotice(String notice) {
                    this.notice = notice;
                }
            }
    
            public static class ForecastBean {
                /**
                 * date : 20
                 * sunrise : 05:30
                 * high : 高温 16.0℃
                 * low : 低温 10.0℃
                 * sunset : 18:52
                 * aqi : 64.0
                 * ymd : 2019-04-20
                 * week : 星期六
                 * fx : 东北风
                 * fl : <3级
                 * type : 小雨
                 * notice : 雨虽小,注意保暖别感冒
                 */
    
                private String date;
                private String sunrise;
                private String high;
                private String low;
                private String sunset;
                private double aqi;
                private String ymd;
                private String week;
                private String fx;
                private String fl;
                private String type;
                private String notice;
    
                public String getDate() {
                    return date;
                }
    
                public void setDate(String date) {
                    this.date = date;
                }
    
                public String getSunrise() {
                    return sunrise;
                }
    
                public void setSunrise(String sunrise) {
                    this.sunrise = sunrise;
                }
    
                public String getHigh() {
                    return high;
                }
    
                public void setHigh(String high) {
                    this.high = high;
                }
    
                public String getLow() {
                    return low;
                }
    
                public void setLow(String low) {
                    this.low = low;
                }
    
                public String getSunset() {
                    return sunset;
                }
    
                public void setSunset(String sunset) {
                    this.sunset = sunset;
                }
    
                public double getAqi() {
                    return aqi;
                }
    
                public void setAqi(double aqi) {
                    this.aqi = aqi;
                }
    
                public String getYmd() {
                    return ymd;
                }
    
                public void setYmd(String ymd) {
                    this.ymd = ymd;
                }
    
                public String getWeek() {
                    return week;
                }
    
                public void setWeek(String week) {
                    this.week = week;
                }
    
                public String getFx() {
                    return fx;
                }
    
                public void setFx(String fx) {
                    this.fx = fx;
                }
    
                public String getFl() {
                    return fl;
                }
    
                public void setFl(String fl) {
                    this.fl = fl;
                }
    
                public String getType() {
                    return type;
                }
    
                public void setType(String type) {
                    this.type = type;
                }
    
                public String getNotice() {
                    return notice;
                }
    
                public void setNotice(String notice) {
                    this.notice = notice;
                }
            }
        }
    }

    三、创建Api接口文件 WeatherApi.java

    package com.jack.basemvp.api;
    
    import com.jack.basemvp.bean.WeatherBean;
    
    import java.util.Map;
    
    import io.reactivex.Observable;
    import retrofit2.Call;
    import retrofit2.http.GET;
    import retrofit2.http.Path;
    import retrofit2.http.QueryMap;
    
    public interface WeatherApi {
        String BASE_URL = "http://t.weather.sojson.com/";
    
        /**
         * 普通方式
         *
         * @param cityId
         * @return
         */
        //get 传一个参数
        @GET("api/weather/city/{cityId}")
        Call<WeatherBean> weatherInfo(@Path("cityId") int cityId);
    
        //get 传多个参数 用 & 拼接
        @GET("api/weather/city/101030100?")
        Call<WeatherBean> weatherInfo2(@QueryMap Map<String, String> params);
    
    }

    四、主UI界面中使用

    RequestCommonActivity.java

    package com.jack.basemvp.activity;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import com.jack.basemvp.R;
    import com.jack.basemvp.api.NewsRxApi;
    import com.jack.basemvp.bean.WeatherBean;
    import com.jack.basemvp.api.WeatherApi;
    import com.jack.basemvp.util.http.RetrofitServiceManager;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    import io.reactivex.Observable;
    import io.reactivex.Observer;
    import io.reactivex.android.schedulers.AndroidSchedulers;
    import io.reactivex.annotations.NonNull;
    import io.reactivex.disposables.Disposable;
    import io.reactivex.schedulers.Schedulers;
    import okhttp3.OkHttpClient;
    import retrofit2.Call;
    import retrofit2.Callback;
    import retrofit2.Response;
    import retrofit2.Retrofit;
    import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
    import retrofit2.converter.gson.GsonConverterFactory;
    
    public class RequestCommonActivity extends AppCompatActivity implements View.OnClickListener {
        private TextView tv_result;
        private Button btn_req1, btn_req2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_request_common);
    
            initView();
        }
    
        private void initView() {
            tv_result = (TextView) findViewById(R.id.tv_result);
            btn_req1 = (Button) findViewById(R.id.btn_req1);
            btn_req2 = (Button) findViewById(R.id.btn_req2);
            btn_req1.setOnClickListener(this);
            btn_req2.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_req1:
                    requestWeather1();
                    break;
                case R.id.btn_req2:
                    requestWeather2();
                    break;
            }
        }
    
        //get 请求 传一个参数到url中
        private void requestWeather1() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(WeatherApi.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            WeatherApi api = retrofit.create(WeatherApi.class);
            int cityId = 101030100; //城市ID
            api.weatherInfo(cityId).enqueue(new Callback<WeatherBean>() {
                @Override
                public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
                    try {
                        //date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃",
                        WeatherBean.DataBean.ForecastBean todayBean = response.body().getData().getForecast().get(0);
                        tv_result.setText(
                                "date1:" + todayBean.getDate() + "
    "
                                        + "high:" + todayBean.getHigh() + "
    "
                                        + "low:" + todayBean.getLow() + "
    "
                        );
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
                @Override
                public void onFailure(Call<WeatherBean> call, Throwable t) {
                }
            });
        }
    
        //get 请求 传一个参数到url中
        private void requestWeather2() {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(WeatherApi.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            Map<String, String> params = new HashMap<>();
            params.put("rand", "1");
            params.put("key", "4ea58de8a7573377cec0046f5e2469d5");
    
            retrofit.create(WeatherApi.class).weatherInfo2(params).enqueue(new Callback<WeatherBean>() {
                @Override
                public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
                    try {
                        //date":"20","sunrise":"05:30","high":"高温 16.0℃","low":"低温 10.0℃",
                        WeatherBean.DataBean.ForecastBean todayBean = response.body().getData().getForecast().get(0);
                        tv_result.setText(
                                "date2:" + todayBean.getDate() + "
    "
                                        + "high:" + todayBean.getHigh() + "
    "
                                        + "low:" + todayBean.getLow() + "
    "
                        );
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
                @Override
                public void onFailure(Call<WeatherBean> call, Throwable t) {
                }
            });
        }
    
    
    }

    界面布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="activity.RequestCommonActivity">
    
        <Button
            android:id="@+id/btn_req1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="普通请求-接口1"
            android:textAllCaps="false" />
    
        <Button
            android:id="@+id/btn_req2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="普通请求-接口2"
            android:textAllCaps="false" />
    
        <TextView
            android:id="@+id/tv_result"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="结果展示" />
    
    </LinearLayout>

    本博客地址: wukong1688

    本文原文地址:https://www.cnblogs.com/wukong1688/p/10745942.html

    转载请著名出处!谢谢~~

  • 相关阅读:
    VisualVM工具的使用
    jstack的使用
    JVM内存溢出的定位与分析
    初识JVM
    JVM运行参数
    VIM 常用命令
    python3 简单抓取图片2
    python3 抓取图片
    node.js GET 请求简单案例
    node.js 爬虫
  • 原文地址:https://www.cnblogs.com/wukong1688/p/10745942.html
Copyright © 2020-2023  润新知