URL = baseUrl + 网络请求接口的注释设置(path)
类型具体使用path = 完整的url接口设置里是一个完整的url,创建Retrofit实例时不设置baseUrlpath = 绝对路径url=“http://host:port/apath” 其中 path=/apath baseUrl = “http://host:port/a/b”path=相对路径baseUrl=目录形式url="http://host:port/a/b/apath"其中 path= “apath” baseUrl=“http://host:port/a/b/”path=相对路径baseUrl=文件形式Url="http:host:port/a/b/apth"其中 path = "apath"baseUrl=“http://host:port/a/b”在网络请求接口中通过method,path,hasBody进行设置
//GET请求,传入变量id加到path对应位置,没有请求体 //method : 网络请求方式,区分大小写 //path : 网络请求地址路径 //hasBody : 是否有请求体 //{id} 表示一个变量 @HTTP(method = "GET",path = "blog/{id}",hasBody = false) Call<ResponseBody> getGetCall(@Path("id") int id);标记注解作用于网络请求接口文件
注解名称解释说明@FormUrlEncoded表示请求体是一个form表单,发送form-encoded数据每个键值对需要使用@Filed来注解键名,随后的对象需要提供值@Multipart表示请求体是一个支持文件上传的表单,发送form-encoded数据每个键值对使用@Part来注解键名,随后的对象需要提供值@Streaming表示返回的数据以流的形式返回适用于返回数据较大的场景(如果没有使用该注解,默认将数据全部载入内存,之后获取数据也是从内存中读取) //表示是一个表单格式的请求(Content-Type:application/x-www-form-urlencoded) //@Field("username") 表示将String name 的取值作为username的值 @POST("/form") @FormUrlEncoded Call<ResponseBody> postCall(@Field("username") String name,@Field("age") int age); //@Part后面支持三种类型:RequestBody,MultipartBody.Part,任意类型 //除了MultipartBody.Part外,其它类型都必须带上表单字段 //MultipartBody.Part中已经包含了表单字段 @POST("/form") @Multipart Call<ResponseBody> postCall2(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);使用
Retrofit postRetrofit = new Retrofit.Builder() .baseUrl(URL) .addConverterFactory(GsonConverterFactory.create()) .build(); GetRequest_Interface postInterface = postRetrofit.create(GetRequest_Interface.class); //@FormUrlEncoded Call<ResponseBody> postCall = postInterface.postCall("eyesee", 18); //Multipart File file = new File("http://www.baidu.com/"); //数据解析成表单数据 RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"),""); RequestBody name = RequestBody.create(MediaType.parse("multipart/form-data"),"eyesee"); RequestBody age = RequestBody.create(MediaType.parse("multipart/form-data"),"18"); MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", "test.txt", body); Call<ResponseBody> postCall2 = postInterface.postCall2(name, age, filePart);以post方式传递自定义数据类型给服务器 如果提交的是一个Map,作用相当于@Filed,要经过FormBody.Builder类处理成为符合Okhttp格式的表单
FormBody.Builder builder = new FormBody.Builder(); builder.add("key","value");请求接口
//表示是一个表单格式的请求(Content-Type:application/x-www-form-urlencoded) //@Field("username") 表示将String name 的取值作为username的值 @POST("/form") @FormUrlEncoded Call<ResponseBody> postCall(@Field("username") String name,@Field("age") int age); //@FiledMap,map的key作为表单的键 @POST("/form") @FormUrlEncoded Call<ResponseBody> postCall(@FieldMap Map<String,Object> map);使用
Retrofit retrofit = new Retrofit.Builder().baseUrl(URL).addConverterFactory(GsonConverterFactory.create()).build(); GetRequest_Interface anInterface = retrofit.create(GetRequest_Interface.class); //@Filed Call<ResponseBody> postCall = anInterface.postCall("eyesee", 14); //@FiledMap Map<String,Object> map = new HashMap<>(); map.put("username","eyesee"); map.put("age",14); Call<ResponseBody> postCall1 = anInterface.postCall(map);请求接口
//@Part后面支持三种类型:RequestBody,MultipartBody.Part,任意类型 //除了MultipartBody.Part外,其它类型都必须带上表单字段 //MultipartBody.Part中已经包含了表单字段 //与@Field功能相同,但是携带的参数类型更丰富,适用于文件上传的场景 @POST("/form") @Multipart Call<ResponseBody> parCall(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file); //@PartMap @POST("/form") @Multipart Call<ResponseBody> partCall(@PartMap Map<String,RequestBody> args,@Part MultipartBody.Part file); @POST("/form") @Multipart Call<ResponseBody> parCall(@PartMap Map<String,ResponseBody> args);具体使用
Retrofit retrofit = new Retrofit.Builder().baseUrl(URL).addConverterFactory(GsonConverterFactory.create()).build(); GetRequest_Interface anInterface = retrofit.create(GetRequest_Interface.class); MediaType textType = MediaType.parse("text/plain"); RequestBody name = RequestBody.create(textType, "eye"); RequestBody age = RequestBody.create(textType, "33"); RequestBody file = RequestBody.create(MediaType.parse("application/octet-stream"), "这里写文本内容"); //@Part MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", "test.txt", file); Call<ResponseBody> partCall = anInterface.parCall(name, age, filePart); //@PartMap Map<String,RequestBody> fileUpload = new HashMap<>(); fileUpload.put("name",name); fileUpload.put("age",age); //这里不会被当成文件,因为没有文件名,文件名包含在Content-Disposition请求头中,但是上面的filePart中有文件名 //fileUpload.put("file",file); Call<ResponseBody> partMapCall = anInterface.partCall(fileUpload, filePart);url地址的缺省值
//在使用时,实际url是http://host:post/users/{user}/repos //{user}是在调用请求接口时传入的参数 @GET("users/{user}/repos") Call<ResponseBody> getAuthor(@Path("user") String user);