网络

Retrofit的基本使用(poth,get)请求以及上传文件的

2019-02-17  本文已影响44人  君袅

了解

image
image image

1.依赖(因为他是给予okhttp之上的,所以必须带着okhttp的依赖)一般使用的是Retrofit 与rxjava的结合使用起来方便,不用切换线程 所以带上rxjava的依赖一起添加

implementation 'com.squareup.okhttp3:okhttp:3.10.0'                   //okhttp
implementation 'com.squareup.retrofit2:retrofit:2.4.0'              //retrofit
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'      //把 网络数据  通过gson  变为  对象

 //rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.0.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.amitshekhar.android:rx2-android-networking:1.0.0'

权限: <uses-permission android:name="android.permission.INTERNET"/>

2.使用说明首先要创建一个接口

image

get请求无参

    public interface IFoodService{
        @GET("wxnew/?key=52b7ec3471ac3bec6846577e79f20e4c&num=10&page=10.com")
        Observable<ResponseBody> getCall();
    }
##

get中分页加载和fragment复用不同请求数据一起使用(千万要注意path的只能在Query的前面是一个"坑")

 //https://www.wanandroid.com/
    @GET("project/list/{page}/json?")
    Observable<TiXi_TiaoMu> getNeiCall(@Path("page")String page,@Query("cid")String cid);

get有参数的

@GET("/ios/cf/dish_list.php?stage_id=1&limit=20")
Call<ResponseBody> getFoodList(@Query("page") String page);

get有参以Map形式

@GET("/ios/cf/dish_list.php?stage_id=1&limit=20")
Call<ResponseBody> getFoodList(@Query("page") String page);
 
Call<ResponseBody> getFoodList(@QueryMap Map<String, String> options);

get有变量

    public interface IFoodService {
        //get请求且有变量是使用
        @GET("20/{page}")
        Call<ResponseBody> pathData(@Path("page") String a);
    }

get拼接url使用

    public interface IFoodService {
        //拼接url使用
        @GET()
        Call<ResponseBody> urlData(@Url String url);
    }

posh的请求

@FormUrlEncoded //表单请求
@POST("v1/login")
Call<ResponseBody> userLogin(@Field("phone") String phone, @Field("password") String password);

或者

@FormUrlEncoded
@POST("book/reviews")
Call<String> addReviews(@FieldMap Map<String, String> fields);


Url

使用base url和端点url可以应对大多数API,但是应用中总会出现另类的API。在我的示例中,现在要获取天气,当然我只能找到一个免费的api了。

@Headers("apikey:b86c2269fe6588bbe3b41924bb2f2da2")
@GET
Call<WeatherWrapper> weather(@Url String url, @Query("cityname") String cityName);

3.接口的注释就已经确定好请求代码的方式,而剩下的代码一样(一般使用的是Retrofit 与rxjava的结合使用起来方便,不用切换线程)

 Retrofit build = new Retrofit.Builder()
                .baseUrl("http://api.tianapi.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        IFoodService iFoodService = build.create(IFoodService.class);
        Observable<ResponseBody> call = iFoodService.getCall();
        call.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {
                        try {
                            String string = responseBody.string();
                            Log.e("zll", "onNext: "+string );
       
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });

4.上传文件

1.权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

2.需要进入手机内存所以要加动态获取权限

        /**
         * 动态获取权限,Android 6.0 新特性,一些保护权限,除了要在AndroidManifest中声明权限,还要使用如下代码动态获取
         */
        if (Build.VERSION.SDK_INT >= 23) {
            int REQUEST_CODE_CONTACT = 101;
            String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            //验证是否许可权限
            for (String str : permissions) {
                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                    //申请权限
                    this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
                    return;
                }
            }
        }

1.接口

    public interface IFoodService{
        /**
         *
         * @param requestBody  上传参数  post
         * @param multipartBody  上传多媒体文件  file
         * @return
         */
        @Multipart
        @POST("study/public/file_upload.php")
        Call<ResponseBody> getCall(@Part("key")RequestBody requestBody,
                         @Part MultipartBody.Part multipartBody
                                         );
    }

2.方法

    private void initData() {
        // 1.获取文件
        String filePath = Environment.getExternalStorageDirectory() + File.separator + "aa.jpg";
        File file = new File(filePath);
        if (file.exists()) {
            Log.d("zll", "exists: " + true);
        }
//        2 文件类型请求对象类型
        RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"),file);
        // 3.文件上传 多媒体对象
        MultipartBody.Part multipartBody = MultipartBody.Part.createFormData("file",file.getName(),requestBody);
//        4.  post普通参数  key (文件夹的名字)  img
        RequestBody postParams =RequestBody.create(MediaType.parse("text/plain"), "img");

        Retrofit build = new Retrofit.Builder()
                .baseUrl("http://yun918.cn/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        IFoodService iFoodService = build.create(IFoodService.class);
        Call<ResponseBody> call = iFoodService.getCall(postParams, multipartBody);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    String string = response.body().string();
                    tv.setText(string);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
    }
image

retrofit的poth以字符串形式请求

    private void post() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("channelId", "b9240eee3b0211e8b64c00163e30445d");
            jsonObject.put("cursor", "0");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ApiService.mBaseUrl4)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        ApiService apiService = retrofit.create(ApiService.class);
        RequestBody body = RequestBody.create(
                MediaType.parse("application/octet-stream"), jsonObject.toString());
        Observable<ResponseBody> news = apiService.postNews(body);
        news.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(ResponseBody responseBody) {
                        try {
                            Log.d(TAG, "onNext: " + responseBody.string());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: " + e.toString());
                    }

                    @Override
                    public void onComplete() {
                    }
                });
    }


    public interface ApiService {
        String mBaseUrl4 = "https://www.firstgainfo.com/firstga/app/";

        @POST("news/upListNews")
        @Headers("Content-Type:application/json")
        Observable<ResponseBody> postNews(@Body RequestBody requestBody);

    }
上一篇下一篇

猜你喜欢

热点阅读