Android 改进2-动态URL
使用改装2,您可以在服务方法的注释中设置完整URL,如:Android 改进2-动态URL,android,retrofit,Android,Retrofit,使用改装2,您可以在服务方法的注释中设置完整URL,如: public interface APIService { @GET("http://api.mysite.com/user/list") Call<Users> getUsers(); } 公共接口服务{ @得到(”http://api.mysite.com/user/list") 调用getUsers(); } 但是,在我的应用程序中,我的Web服务的URL在编译时是未知的,应用程序会在下载的文件中检索它们,所
public interface APIService {
@GET("http://api.mysite.com/user/list")
Call<Users> getUsers();
}
公共接口服务{
@得到(”http://api.mysite.com/user/list")
调用getUsers();
}
但是,在我的应用程序中,我的Web服务的URL在编译时是未知的,应用程序会在下载的文件中检索它们,所以我想知道如何将Reformation 2与完整的动态URL一起使用
我试图设置一个完整的路径,如:
public interface APIService {
@GET("{fullUrl}")
Call<Users> getUsers(@Path("fullUrl") fullUrl);
}
new Retrofit.Builder()
.baseUrl("http://api.mysite.com/")
.build()
.create(APIService.class)
.getUsers("http://api.mysite.com/user/list"); // this url should be dynamic
.execute();
公共接口服务{
@获取(“{fullUrl}”)
调用getUsers(@Path(“fullUrl”)fullUrl);
}
新的改型.Builder()
.baseUrl(“http://api.mysite.com/")
.build()
.create(APIService.class)
.getUsers(“http://api.mysite.com/user/list"); // 此url应该是动态的
.execute();
但是在这里,改型并没有看到路径实际上是一个完整的URL,并且正在尝试下载http://api.mysite.com/http%3A%2F%2Fapi.mysite.com%2Fuser%2Flist
有没有关于我如何使用这种动态url进行改进的提示
谢谢你我想你用错了。以下是一段摘录自: 新:@Url参数注释允许传递端点的完整Url 因此,您的界面应该如下所示:
public interface APIService {
@GET
Call<Users> getUsers(@Url String url);
}
公共接口服务{
@得到
调用getUsers(@Url字符串Url);
}
从改型2.0.0-beta2开始,如果您有一个服务从该URL响应JSON:
以下操作不起作用:
public interface ClientService {
@GET("")
Call<List<Client>> getClientList();
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://myhost/mypath")
.addConverterFactory(GsonConverterFactory.create())
.build();
ClientService service = retrofit.create(ClientService.class);
Response<List<Client>> response = service.getClientList().execute();
公共接口ClientService{
@得到(“”)
调用getClientList();
}
改装改装=新改装.Builder()
.baseUrl(“http://myhost/mypath")
.addConverterFactory(GsonConverterFactory.create())
.build();
ClientService=reformation.create(ClientService.class);
响应=service.getClientList().execute();
但这没关系:
public interface ClientService {
@GET
Call<List<Client>> getClientList(@Url String anEmptyString);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://myhost/mypath")
.addConverterFactory(GsonConverterFactory.create())
.build();
ClientService service = retrofit.create(ClientService.class);
Response<List<Client>> response = service.getClientList("").execute();
公共接口ClientService{
@得到
调用getClientList(@Url字符串anEmptyString);
}
改装改装=新改装.Builder()
.baseUrl(“http://myhost/mypath")
.addConverterFactory(GsonConverterFactory.create())
.build();
ClientService=reformation.create(ClientService.class);
响应=service.getClientList(“”.execute();
您可以使用@Path
注释上的编码标志:
public interface APIService {
@GET("{fullUrl}")
Call<Users> getUsers(@Path(value = "fullUrl", encoded = true) String fullUrl);
}
公共接口服务{
@获取(“{fullUrl}”)
调用getUsers(@Path(value=“fullUrl”,encoded=true)字符串fullUrl);
}
- 这将防止用
替换%2F
/
- 但是,它不会将您从被替换为
的%3F
中解救出来,因此您仍然无法传入动态查询字符串?
public interface APIService {
@GET("users/{user_id}/playlists")
Call<List<Playlist> getUserPlaylists(@Path(value = "user_id", encoded = true) String userId);
}
公共接口服务{
@获取(“用户/{user_id}/播放列表”)
呼叫步骤1
Please define a method in Api interface like:-
@FormUrlEncoded
@POST()
Call<RootLoginModel> getForgotPassword(
@Url String apiname,
@Field(ParameterConstants.email_id) String username
);
}
步骤3
在活动中定义:-
final APIService request =ApiRequest.getClient().create(APIService.class);
Call<RootLoginModel> call = request.getForgotPassword("dynamic api
name",strEmailid);
final APIService request=apirest.getClient().create(APIService.class);
Call Call=request.getForgotPassword(“动态api
姓名”,Stremaild);
步骤-*1
电影列表行.xml
Api.java
导入org.json.JSONObject;
导入java.util.List;
2.电话;;
2.回拨;
导入2.http.Field;
导入2.http.FormUrlEncoded;
导入文件2.http.GET;
导入文件2.http.POST;
公共接口Api{
字符串BASE_URL=”https://simplifiedcoding.net/demos/";
@获得(“惊奇”)
调用getheros();
@FormUrlEncoded
@POST(“/登录”)
公共无效登录(@Field(“用户名”)字符串用户名,@Field(“密码”)字符串密码,回调);
}
java导入android.content.Context;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ImageView;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.squareup.picasso.picasso;
导入java.util.List;
公共类MoviesAdapter扩展了RecyclerView.Adapter{
私人名单电影名单;
语境;
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图标题、年份、类型;
公共图像视图ivImage;
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.title);
genre=(TextView)view.findViewById(R.id.genre);
年份=(TextView)view.findViewById(R.id.year);
ivImage=view.findviewbyd(R.id.ivImage);
ivImage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(context,“-”+moviesList.get(getAdapterPosition()).getName(),Toast.LENGTH_SHORT.show();
}
});
}
}
公共MoviesAdapter(列表moviesList,上下文){
this.moviesList=moviesList;
this.context=上下文;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.movie\u list\u行,父项,false);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
英雄电影=电影列表。获取(位置);
holder.title.setText(movie.getName());
holder.genre.setText(movie.getRealname());
holder.year.setText(movie.getTeam());
Picasso.get().load(“http://i.imgur.com/DvpvklR.png)转换为(holder.ivImage
final APIService request =ApiRequest.getClient().create(APIService.class);
Call<RootLoginModel> call = request.getForgotPassword("dynamic api
name",strEmailid);
step -*1
movie_list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:orientation="horizontal"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/row_padding_vertical"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/row_padding_vertical">
<ImageView
android:id="@+id/ivImage"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginRight="10dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:text="Hello"
android:textColor="@color/title"
android:textSize="16dp"
android:textStyle="bold" />
<TextView
android:id="@+id/genre"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:text="realName" />
</LinearLayout>
<TextView
android:id="@+id/year"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="Team"
android:textColor="@color/year" />
</LinearLayout>
Api.java
import org.json.JSONObject;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
public interface Api {
String BASE_URL = "https://simplifiedcoding.net/demos/";
@GET("marvel")
Call<List<Hero>> getHeroes();
@FormUrlEncoded
@POST("/login")
public void login(@Field("username") String username, @Field("password") String password, Callback<List<Hero>> callback);
}
MoviesAdapter.java import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import java.util.List;
public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {
private List<Hero> moviesList;
Context context;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, year, genre;
public ImageView ivImage;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
genre = (TextView) view.findViewById(R.id.genre);
year = (TextView) view.findViewById(R.id.year);
ivImage = view.findViewById(R.id.ivImage);
ivImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "-" + moviesList.get(getAdapterPosition()).getName(), Toast.LENGTH_SHORT).show();
}
});
}
}
public MoviesAdapter(List<Hero> moviesList,Context context) {
this.moviesList = moviesList;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Hero movie = moviesList.get(position);
holder.title.setText(movie.getName());
holder.genre.setText(movie.getRealname());
holder.year.setText(movie.getTeam());
Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(holder.ivImage);
}
@Override
public int getItemCount() {
return moviesList.size();
}
} main activity import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private List<Hero> movieList = new ArrayList<>();
private RecyclerView recyclerView;
private MoviesAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.recycler_view);
mAdapter = new MoviesAdapter(movieList,MainActivity.this);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
//calling the method to display the heroes
getHeroes();
}
private void getHeroes() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ApiInterface.BASE_URL)
.addConverterFactory(GsonConverterFactory.create()) //Here we are using the GsonConverterFactory to directly convert json data to object
.build();
ApiInterface api = retrofit.create(ApiInterface.class);
Call<List<Hero>> call = api.getHeroes();
call.enqueue(new Callback<List<Hero>>() {
@Override
public void onResponse(Call<List<Hero>> call, Response<List<Hero>> response) {
List<Hero> heroList = response.body();
//Creating an String array for the ListView
String[] heroes = new String[heroList.size()];
//looping through all the heroes and inserting the names inside the string array
for (int i = 0; i < heroList.size(); i++) {
//heroes[i] = heroList.get(i).getName();
movieList.add(new Hero( heroList.get(i).getName(), heroList.get(i).getRealname(), heroList.get(i).getTeam()));
}
mAdapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<List<Hero>> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
Hero.java
package com.example.owner.apipractice;
public class Hero {
private String name;
private String realname;
private String team;
public Hero(String name, String realname, String team) {
this.name = name;
this.realname = realname;
this.team = team;
}
private String firstappearance;
private String createdby;
private String publisher;
private String imageurl;
private String bio;
public Hero(String name, String realname, String team, String firstappearance, String createdby, String publisher, String imageurl, String bio) {
this.name = name;
this.realname = realname;
this.team = team;
this.firstappearance = firstappearance;
this.createdby = createdby;
this.publisher = publisher;
this.imageurl = imageurl;
this.bio = bio;
}
public String getName() {
return name;
}
public String getRealname() {
return realname;
}
public String getTeam() {
return team;
}
public String getFirstappearance() {
return firstappearance;
}
public String getCreatedby() {
return createdby;
}
public String getPublisher() {
return publisher;
}
public String getImageurl() {
return imageurl;
}
public String getBio() {
return bio;
}
}
public class ServiceGenerator {
public static String apiBaseUrl = "http://futurestud.io/api";
private static Retrofit retrofit;
private static Retrofit.Builder builder =
new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(apiBaseUrl);
private static OkHttpClient.Builder httpClient =
new OkHttpClient.Builder();
// No need to instantiate this class.
private ServiceGenerator() {
}
public static void changeApiBaseUrl(String newApiBaseUrl) {
apiBaseUrl = newApiBaseUrl;
builder = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(apiBaseUrl);
}
public static <S> S createService(Class<S> serviceClass, AccessToken token) {
String authToken = token.getTokenType().concat(token.getAccessToken());
return createService(serviceClass, authToken);
}
// more methods
// ...
}
public class DynamicBaseUrlActivity extends AppCompatActivity {
public static final String TAG = "CallInstances";
private Callback<ResponseBody> downloadCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_upload);
downloadCallback = new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.d(TAG, "server contacted at: " + call.request().url());
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d(TAG, "call failed against the url: " + call.request().url());
}
};
// first request
FileDownloadService downloadService = ServiceGenerator.create(FileDownloadService.class);
Call<ResponseBody> originalCall = downloadService.downloadFileWithFixedUrl();
originalCall.enqueue(downloadCallback);
// change base url
ServiceGenerator.changeApiBaseUrl("http://development.futurestud.io/api");
// new request against new base url
FileDownloadService newDownloadService = ServiceGenerator.create(FileDownloadService.class);
Call<ResponseBody> newCall = newDownloadService.downloadFileWithFixedUrl();
newCall.enqueue(downloadCallback);
}
}
class Application : Application() {
override fun onCreate() {
super.onCreate()
retrofitClient = RetrofitClient.instance
//api url
.setBaseUrl("https://reqres.in/")
//you can set multiple urls
// .setUrl("example","http://ngrok.io/api/")
//set timeouts
.setConnectionTimeout(4)
.setReadingTimeout(15)
//enable cache
.enableCaching(this)
//add Headers
.addHeader("Content-Type", "application/json")
.addHeader("client", "android")
.addHeader("language", Locale.getDefault().language)
.addHeader("os", android.os.Build.VERSION.RELEASE)
}
companion object {
lateinit var retrofitClient: RetrofitClient
}
}
retrofitClient.Get<GetResponseModel>()
//set base url
.setBaseUrlKey("example")
//set path
.setPath("api/users/2")
//set url params Key-Value or HashMap
.setUrlParams("KEY","Value")
.setResponseHandler(GetResponseModel::class.java,
object : ResponseHandler<GetResponseModel>() {
override fun onSuccess(response: Response<GetResponseModel>) {
super.onSuccess(response)
//handle response
}
}).run(this)
public interface NetworkAPIServices {
@POST()
Observable<JsonElement> executXYZServiceAPI(@Url String url,@Body AuthTokenRequestModel param);
@GET
Observable<JsonElement> executeInserInfo(@Url String url);
public Observable<JsonElement> executXYZServiceAPI(ModelObject object) {
return networkAPIServices.authenticateAPI("url",
object);
}
public Observable<JsonElement> executeInserInfo(String ID) {
return networkAPIServices.getBank(DynamicAPIPath.mergeUrlPath("url"+ID)));
}
@Provides
@Singleton
@Inject
@Named("provideRetrofit2")
Retrofit provideRetrofit(@Named("provideRetrofit2") Gson gson, @Named("provideRetrofit2") OkHttpClient okHttpClient) {
builder = new Retrofit.Builder();
if (BaseApplication.getInstance().getApplicationMode() == ApplicationMode.DEVELOPMENT) {
builder.baseUrl(NetworkURLs.BASE_URL_UAT);
} else {
builder.baseUrl(NetworkURLs.BASE_URL_PRODUCTION);
}
builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
builder.client(okHttpClient);
builder.addConverterFactory(GsonConverterFactory.create(gson));
return builder.build();
}