1.什麼是網絡接口
2.調取網絡接口的基本流程
3.調取網絡接口的方式
4.Android發起網絡請求的方式
5.Retrofit的使用
1.爲什麼使用Retrofit
2.如何使用
首先我們需要一個接口
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
在Get中寫的是url的後綴如http://write.blog.csdn.net/postedit的postedit,在{}中被@Path的屬性代替。Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.create(GitHubService.class);
你也可以加入Query參數:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
public class LoginUser {
public String loginname;
public String password;
public LoginUser(String loginname, String password) {
this.loginname = loginname;
this.password = password;
}
}
那麼在接口中寫的方法就是這樣的:
@POST("NewLifeBeta/TeaLogin")
Call<UserEntity> login(@Body LoginUser loginUser);
關於提交json數據的詳細方法我在另一篇博客中有詳細說明。@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
注意:@FormUrlEncoded代表該次請求爲表單提交,方法中的@Field參數代表表單的鍵值對,@Field括號內爲key,外面的參數爲value。
還需要一個保存結果的實體類
public class UserEntity {
@SerializedName("resultCode")
private int resultCode;
@SerializedName("resultMessage")
private String resultMessage;
@SerializedName("data")
private User user;
public UserEntity(int resultCode, String resultMessage, User user) {
this.resultCode = resultCode;
this.resultMessage = resultMessage;
this.user = user;
}
public int getResultCode() {
return resultCode;
}
public void setResultCode(int resultCode) {
this.resultCode = resultCode;
}
public String getResultMessage() {
return resultMessage;
}
public void setResultMessage(String resultMessage) {
this.resultMessage = resultMessage;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
注意:如果你想讓返回的json數據直接解析到對應的屬性上,你就要引入retrofit的轉換工廠,這裏推薦gson工廠,在project structure中搜索retrofit找到converter-gson導入即可,然後在屬性上方註釋@SerializedName("data"),括號內爲json的解析字段。
正式開始調用
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("url")
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitWork retrofitWork = retrofit.create(RetrofitWork.class);
Call<UserEntity> login = retrofitWork.login(loginUser);
login.enqueue(this);
@Override
public void onResponse(Call<UserEntity> call, Response<UserEntity> response) {
Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<UserEntity> call, Throwable t) {
Toast.makeText(MainActivity.this, "fail" + t.toString(), Toast.LENGTH_SHORT).show();
}
注意:1.addConverterFactory(GsonConverterFactory.create())爲轉換工廠,需要導入對應的包。6.常見案例(具有實驗室特色)
1.僞表單提交
@FormUrlEncoded
@POST("/ReturnSoftContent_json.aspx")
Call<AboutUsEntity> aboutUs(@Field("contenttype") JSONObject jsonObject);
2.真表單提交(method + parament)
@FormUrlEncoded
@POST("Users.aspx")
Call<RemoteDataResult<UserEntity>> login(@Field("method") String method
, @Field("parament") JSONObject jsonObject);
3.單純的json提交
@POST("NewLifeBeta/TeaLogin")
Call<UserEntity> login(@Body LoginUser loginUser);
這種方法我在上文中有詳細描述。