美文网首页网络
Retrofit的基本使用(poth,get)请求以及上传文件的

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

作者: 君袅 | 来源:发表于2019-02-17 21:20 被阅读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);
    
        }
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/jjsneqtx.html