1.需要掌握的注解字段
Get Post
Url
Query QueryMap Field FieldMap
Path Body Part MulltiPart
Header Headers FormUrlEncode
retrofit的简单实现:
依赖:
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
权限: <uses-permission android:name="android.permission.INTERNET"/>
代码:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.xxxx.com") // 添加请求地址
.addConverterFactory(GsonConverterFactory.create())//使用gson库解析
.build();
IFoodService iFoodService = retrofit.create(IFoodService.class);
Call<ResponseBody> call = iFoodService.getFoodList();
call.enqueue(new Callback<ResponseBody>() {
....此处忽略
1.Get
形式:url + 参数形式。 eg: http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1
@GET("/ios/cf/dish_list.php?stage_id=1&limit=20")
Call<ResponseBody> getFoodList(@Query("page") String page);
2.Post
发送post请求,一般通过表单发送字段
FormUrlEncoded标识本次请求是表单形式的传参
@FormUrlEncoded
@POST("v1/login")
Call<ResponseBody> userLogin(@Field("phone") String phone, @Field("password") String password);
3.Url
使用base url和端点url可以应对大多数API,但是应用中总会出现另类的API。在我的示例中,现在要获取天气,当然我只能找到一个免费的api了。
@Headers("apikey:b86c2269fe6588bbe3b41924bb2f2da2")
@GET
Call<WeatherWrapper> weather(@Url String url, @Query("cityname") String cityName);
4.Query QueryMap
主要用于get请求,把参数追加到url路径里。
@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);
5.Field FieldMap
主要用于post请求表单里的参数。可以对比以下两种方式的不同。
@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);
6.Path
接收一个字符串表示接口 path ,与 baseUrl 组成完整的 Url;
@GET("blog/{id}")Call<ResponseBody>getBlog(@Path("id")intid);
7.Body
使用 @Body 注解,指定一个对象作为 request body 。
@POST("users/new")Call<User>createUser(@BodyUser user);
8.Part MulltiPart
主要处理文件上传
@Multipart@POST("upload")Call<ResponseBody>uploadOneFile(@PartMultipartBody.Part body);
9.Header Headers
使用 @Headers 注解设置固定的请求头,所有请求头不会相互覆盖,即使名字相同。
使用 @Header 注解—动态更新请求头,匹配的参数必须提供给 @Header ,若参数值为 null ,这个头会被省略
// Headers的使用
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@Headers({ "Accept: application/vnd.github.v3.full+json","User-Agent: Retrofit-Sample-App"})
@GET("users/{username}")Call<User>
getUser(@Path("username") String username);
// Header的使用
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)