当前位置: 首页 > 知识库问答 >
问题:

Android Retrofit2:如何将请求查询参数传递给响应?

谢阳成
2023-03-14

我依赖于retrofit2,该retrofit2配置为使用RxJava包装响应,并使用GSon解析它们。

我在用Reterfit做Rest服务。

@GET("search")
Observable<SearchResult> search(@Query("q") String query);

@GET("search")
Observable<SearchResult> search(@QueryMap Map<String, String> params);

@GET("search")
Observable<SearchResult> searchNext(@Query("q") String query, @Query("startKey") String startKey);

@GET("search")
Observable<SearchResult> searchNext(@QueryMap Map<String, String> params, @Query("startKey") String startKey);

search REST服务返回一个JSON

{
  "count": 2334,
  "nextBatchKey": "SADjdfsahoi023451sadfjlskdfj02134512",
  "results": [ .... ]
}
    null
Retrofit retrofit = new Retrofit.Builder()
    .client(okHttpClient) // added interceptors
    .baseUrl(baseUrl) // my base url
    .addConverterFactory(GsonConverterFactory.create(gson)) // custom type html" target="_blank">adapter factory
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .build();

它为我的接口生成服务,并使用GSON解析响应,并用RXJavaObservable包装它。

然后我获得服务:

MyService service = retrofit.create(MyService.class)

请注意,我不编写这个服务的代码,因为retrofit工作时,它使用我的接口(MyService)注释自动生成服务。

// obtain the service
MyService service = MyLibrarySDK.getService(context);
// perform the search operation
Observable<SearchResult> resultObservable =
    service.search(params); 
// then later result == the SearchResult
Observable<SearchResult> nextBatch =
    result.searchNext();

如果用户使用q=foo执行搜索调用,则不会在响应中接收到此信息。而我需要它。

由于referfit create the service,我不知道如何截获通过调用service.search()传递的方法参数。

解决这个问题的唯一方法是使用OKHTTP拦截器,将查询参数映射放置在ThreadLocal中,然后使用自定义的GSONTypeAdapter将这些参数注入到SearchResult对象中。

你有更好的/有创意的/优雅的主意吗?

共有1个答案

松博耘
2023-03-14

不要认为在结果上有searchnext(),而应该在服务上有searchnext()

尝试如下所示:

myservice.java

public class MyService {
    RestClient.GitApiInterface service = RestClient.getClient();
    String query;
    Observable<GitResult> resultObservable;

    public Observable<GitResult> getUsersByName(String query) {
        this.query = query;
        resultObservable = service.getUsersByName(query, 0).cache();
        return resultObservable;
    }

    public Observable<GitResult> searchNext() {
        Observable nextResultObservable = resultObservable
                .flatMap(new Func1<GitResult, Observable<?>>() {
                    @Override
                    public Observable<?> call(GitResult gitResult) {
                        return service.getUsersByName(query, gitResult.getNextPage());
                    }
                });

        return nextResultObservable;
    }
} 
final MyService service = new MyService();
// First load
service.getUsersByName("tom");
// consecutive calls
service.searchNext();
 类似资料:
  • 我正在使用SoundCloud api创建一个应用程序,并尝试附加用户输入的字符串值,但它在界面中显示为null,我如何在url中附加该值? MainActivity.java SCService.java 搜索的字符串在我的SoundCloud.java类 我想在GET参数中附加那个SCURL字符串,但它显示了SCURL的null值,我如何实现这一点? 更新:我如上所述更改了代码,但出现了此错误

  • 问题内容: 我试图找出将自定义数据传递给查询调用以使其在回调中可用的正确方法。我在nodejs(所有最新版本)中使用MySQL库。 我打电话给connection.query(sql,function(err,result){…}); 我找不到办法1)将自定义数据/参数传递给调用,以便2)在调用回调时可以使它可用。那么正确的做法是什么? 我有以下(伪代码): 从上面的代码,我需要能够将查询中使用的

  • 问题内容: 我有一个整数或字符串列表,需要将其作为Delphi DataSet的参数传递。怎么做? 这是一个例子。MyQuery类似于: 我将参数设置为列表或数组或其他内容: 它将导致此查询发送到sql服务器: 如果该解决方案也可以与字符串一起使用,则执行以下查询会更好: 变得: 我相信这是一个简单的问题,但是“ IN”并不是搜索网络的好关键字。 请回答如何在IDE中配置参数,查询以及如何传递参数

  • 问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。

  • 在变换的中间,我从表ABC中创建COL1、COL2和COL3、COL4、COL5。 我通常按如下方式转换这些类型的脚本,然后在查找组件中将列与col1到col5匹配: 我想检查:1-我的方法正确吗?我的意思是,如果记录的数量很高,那么我们可能会面临这个问题,然而,这个查询只返回单行记录。 2-如果我想使用第一种方法,我如何传递参数?我试着去读以前的帖子(以前的解决方案),但问题是我处于一个转换的中

  • 我写了一个代码来管理一个咖啡馆,所以在框架中我添加了一个JTable,每次我从JComboBox中选择一个项目,它都应该显示在JTable中。为此,我添加了一个按钮,对于它的操作,我确保每次单击它时,它都将从JComboBox中单击的项存储在数据库中,然后将从数据库中获取的项存储在JTable中。但问题是JTable有两列,而JComboBox中的选择只有一列。因此,另一列必须从其他数据库调用,这