标签: retrofit

如何使用拦截器在Retrofit 2.0中添加Headers?

我们的团队决定采用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)

java android retrofit

89
推荐指数
2
解决办法
6万
查看次数

当我们有OkHttp时,为什么要使用Retrofit

使用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为我们解决了什么问题?

java android retrofit okhttp

89
推荐指数
4
解决办法
4万
查看次数

无法为io.reactivex.Observable创建调用适配器

我将向我的服务器(它是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)

rx-java retrofit rx-android retrofit2 rx-java2

85
推荐指数
4
解决办法
3万
查看次数

使用Rxjava Schedulers.newThread()和Schedulers.io()进行改造

在网络请求中使用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()将使用线程池

但是这个论点对应用程序的影响是什么?还有什么其他方面?

android rx-java retrofit rx-android

83
推荐指数
1
解决办法
1万
查看次数

使用JsonReader.setLenient(true)在第1行第1列路径$接受格式错误的JSON

这个错误是什么?我怎样才能解决这个问题?我的应用正在运行,但无法加载数据.这是我的错误:使用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)

android json gson retrofit

82
推荐指数
5
解决办法
12万
查看次数

Android Retrofit参数化@Headers

我正在使用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)

java android annotations retrofit

81
推荐指数
4
解决办法
7万
查看次数

使用参数进行改造和GET

我正在尝试使用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)

android get retrofit

78
推荐指数
4
解决办法
10万
查看次数

(Retrofit)找不到类崩溃应用程序的转换器

所以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调用时.

java android retrofit

77
推荐指数
4
解决办法
3万
查看次数

如何在Retrofit中处理Dynamic JSON?

我正在使用高效的网络库改造,但是我无法处理包含单个前缀的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: …

android json gson retrofit

75
推荐指数
6
解决办法
5万
查看次数

将GSON序列化日期从json字符串改为java.util.date

我正在使用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

java android json gson retrofit

74
推荐指数
4
解决办法
6万
查看次数

标签 统计

retrofit ×10

android ×9

java ×5

gson ×3

json ×3

rx-android ×2

rx-java ×2

annotations ×1

get ×1

okhttp ×1

retrofit2 ×1

rx-java2 ×1