我们的团队决定采用Retrofit 2.0,我正在做一些初步的研究.我是这个图书馆的新手.
我想知道如何使用我们的Android应用程序中的Retrofits 2.0interceptor添加自定义标头.有许多关于在Retrofit 1.X中使用添加标题的教程,但由于API在最新版本中发生了很大变化,我不确定如何在新版本中调整这些方法.此外,Retrofit尚未更新其新文档.interceptor
例如,在以下代码中,我应该如何实现Interceptor该类以添加额外的标头?此外,未记载的Chain对象究竟是什么?什么时候会intercept()被召唤?
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
// How to add extra headers?
return response;
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
Run Code Online (Sandbox Code Playgroud) 使用OkHttp我们可以发出HTTP请求然后从服务器获得响应
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
Run Code Online (Sandbox Code Playgroud)
然后用Gson lib将响应转换为我们需要的对象.
这是来自Square/OkHttp doc:
它的请求/响应API设计具有流畅的构建器和不变性.它支持同步阻塞调用和带回调的异步调用
我从stackOverFlow中读取
如果可用,Retrofit会自动使用OkHTTP
.
所以我的问题是究竟是什么改造?
什么改造可以做到OkHttp不能?!
我认为OkHttp和Gson解决了请求API问题,那么Retrofit为我们解决了什么问题?
我将向我的服务器(它是Rails应用程序)发送一个简单的get方法,并使用RxJava和Retrofit获取结果.我做的是:
我的界面:
public interface ApiCall {
String SERVICE_ENDPOINT = "https://198.50.214.15";
@GET("/api/post")
io.reactivex.Observable<Post> getPost();
}
Run Code Online (Sandbox Code Playgroud)
我的模型是这样的:
public class Post
{
@SerializedName("id")
private String id;
@SerializedName("body")
private String body;
@SerializedName("title")
private String title;
public String getId ()
{
return id;
}
public String getBody ()
{
return body;
}
public String getTitle ()
{
return title;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我在活动中所做的:
public class Javax extends AppCompatActivity {
RecyclerView rvListContainer;
postAdapter postAdapter;
List<String> messageList=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_javax);
rvListContainer=(RecyclerView)findViewById(R.id.recyclerView);
postAdapter=new …Run Code Online (Sandbox Code Playgroud) 在网络请求中使用Schedulers.newThread()vs 有什么好处.我见过许多使用的例子,但我想了解原因.Schedulers.io()Retrofitio()
示例情况:
observable.onErrorResumeNext(refreshTokenAndRetry(observable))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())...
Run Code Online (Sandbox Code Playgroud)
VS
observable.onErrorResumeNext(refreshTokenAndRetry(observable))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())...
Run Code Online (Sandbox Code Playgroud)
我见过的原因之一是 -
newThread()为每个工作单元创建一个新线程.io()将使用线程池
但是这个论点对应用程序的影响是什么?还有什么其他方面?
这个错误是什么?我怎样才能解决这个问题?我的应用正在运行,但无法加载数据.这是我的错误:使用JsonReader.setLenient(true)接受第1行第1列路径的格式错误的JSON $
这是我的片段:
public class news extends Fragment {
private RecyclerView recyclerView;
private ArrayList<Deatails> data;
private DataAdapter adapter;
private View myFragmentView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
myFragmentView = inflater.inflate(R.layout.news, container, false);
initViews();
return myFragmentView;
}
private void initViews() {
recyclerView = (RecyclerView) myFragmentView.findViewById(R.id.card_recycler_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity().getApplicationContext());
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(layoutManager);
data = new ArrayList<Deatails>();
adapter = new DataAdapter(getActivity(), data);
recyclerView.setAdapter(adapter);
new Thread()
{
public void run()
{
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() { …Run Code Online (Sandbox Code Playgroud) 我正在使用OAuth,每次发出请求时都需要将OAuth令牌放入标题中.我看到了@Header注释,但有没有办法让它参数化,所以我可以在运行时传入?
这是概念
@Header({Authorization:'OAuth {var}', api_version={var} })
你能在运行时传递它们吗?
@GET("/users")
void getUsers(
@Header("Authorization") String auth,
@Header("X-Api-Version") String version,
Callback<User> callback
)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Retrofit向Google GeoCode API发送请求.服务界面如下所示:
public interface FooService {
@GET("/maps/api/geocode/json?address={zipcode}&sensor=false")
void getPositionByZip(@Path("zipcode") int zipcode, Callback<String> cb);
}
Run Code Online (Sandbox Code Playgroud)
当我打电话给服务时:
OkHttpClient okHttpClient = new OkHttpClient();
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(Constants.GOOGLE_GEOCODE_URL).setClient(new OkClient(okHttpClient)).build();
FooService service = restAdapter.create(FooService.class);
service.getPositionByZip(zipCode, new Callback<String>() {
@Override public void success(String jsonResponse, Response response) {
...
}
@Override public void failure(RetrofitError retrofitError) {
}
});
Run Code Online (Sandbox Code Playgroud)
我收到以下stacktrace:
06-07 13:18:55.337: E/AndroidRuntime(3756): FATAL EXCEPTION: Retrofit-Idle
06-07 13:18:55.337: E/AndroidRuntime(3756): Process: com.marketplacehomes, PID: 3756
06-07 13:18:55.337: E/AndroidRuntime(3756): java.lang.IllegalArgumentException: FooService.getPositionByZip: URL query string "address={zipcode}&sensor=false" must not have replace …Run Code Online (Sandbox Code Playgroud) 所以Retrofit 2.0.0最近发布了,并没有真正的任何更新示例如何使用它,但我试图实现它的基本API调用.我得到了一个
java.lang.IllegalArgumentException: Unable to create converter for class`
Run Code Online (Sandbox Code Playgroud)
引起的
Caused by: java.lang.IllegalArgumentException: Could not locate converter for class orbyt.app.dataclass. Tried:
* retrofit.OkHttpBodyConverterFactory
Run Code Online (Sandbox Code Playgroud)
在尝试进行api调用时.
我正在使用高效的网络库改造,但是我无法处理包含单个前缀的Dynamic JSON, responseMessage后者object随机responseMessage变化,在某些情况下(动态),相同的prefix()会更改为String.
Json格式responseMessage的对象:
{
"applicationType":"1",
"responseMessage":{
"surname":"Jhon",
"forename":" taylor",
"dob":"17081990",
"refNo":"3394909238490F",
"result":"Received"
}
}
Run Code Online (Sandbox Code Playgroud)
responseMessage Json格式动态更改为类型字符串:
{
"applicationType":"4",
"responseMessage":"Success"
}
Run Code Online (Sandbox Code Playgroud)
对我来说问题是因为改造有内置的JSON解析我们必须为每个请求分配单个POJO!但遗憾的是,REST-API是使用动态JSON响应构建的,前缀将在成功(...)和失败(...)方法中随机更改为字符串到对象!
void doTrackRef(Map<String, String> paramsref2) {
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("http://192.168.100.44/RestDemo").build();
TrackerRefRequest userref = restAdapter.create(TrackerRefRequest.class);
userref.login(paramsref2,
new Callback<TrackerRefResponse>() {
@Override
public void success(
TrackerRefResponse trackdetailresponse,
Response response) {
Toast.makeText(TrackerActivity.this, "Success",
Toast.LENGTH_SHORT).show();
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(TrackerActivity.this, "No internet",
Toast.LENGTH_SHORT).show();
}
});
}
Run Code Online (Sandbox Code Playgroud)
POJO: …
我正在使用Retrofit库进行REST调用.我所做的大部分工作都很顺利,但出于某种原因,我遇到了将JSON时间戳字符串转换为java.util.Date对象的问题.进入的JSON看起来像这样.
{
"date": "2013-07-16",
"created_at": "2013-07-16T22:52:36Z",
}
Run Code Online (Sandbox Code Playgroud)
如何告诉Retrofit或Gson将这些字符串转换成java.util.Date objects?