66

我正在使用 Retrofit 和 Robospice 在我的 android 应用程序中进行 API 调用。所有@POST 方法都工作得很好,在URL 中没有任何参数的@GET 命令也是如此,但是我不能让任何@GET 调用最终使用参数!

例如,如果我的 API 路径是“my/api/call/”并且我希望 URL 中有 2 个参数“param1”和“param2”,那么 get 调用将如下所示:

http://www.example.com/my/api/call?param1=value1¶m2=value2

所以我设置了我的@GET接口,如下所示:

@GET("/my/api/call?param1={p1}&param2={p2}")
Response getMyThing(@Path("p1")
String param1, @Path("p2")
String param2);

但我收到一条错误消息,提示
“请求网络执行期间发生异常:/my/api/call?param1={p1}&param2={p2}方法 getMyThing 上的 URL 查询字符串”“可能没有替换块。”

我究竟做错了什么?

4

6 回答 6

137

您应该使用以下语法:

@GET("/my/API/call")
Response getMyThing(
    @Query("param1") String param1,
    @Query("param2") String param2);

仅当您知道键和值并且它们是固定的时,才在 URL 中指定查询参数。

于 2013-11-14T10:27:56.520 回答
21

如果你有一堆 GET 参数,另一种将它们传递到你的 url 的方法是 HashMap。

class YourActivity extends Activity {

    private static final String BASEPATH = "http://www.example.com";

    private interface API {
        @GET("/thing")
        void getMyThing(@QueryMap Map<String, String>, new Callback<String> callback);
    }

    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.your_layout);

       RestAdapter rest = new RestAdapter.Builder().setEndpoint(BASEPATH).build();
       API service      = rest.create(API.class);

       Map<String, String> params = new HashMap<String, String>();
       params.put("foo", "bar");
       params.put("baz", "qux");
       // ... as much as you need.

       service.getMyThing(params, new Callback<String>() {
           // ... do some stuff here.
       });
    }
}

调用的 URL 将是http://www.example.com/thing/?foo=bar&baz=qux

于 2014-11-11T15:17:47.943 回答
9

您可以创建一个参数映射并将其发送如下:

Map<String, String> paramsMap = new HashMap<String, String>();
paramsMap.put("p1", param1);
paramsMap.put("p2", param2);

// Inside call
@GET("/my/api/call")
Response getMyThing(@QueryMap Map<String, String> paramsMap);
于 2018-12-14T06:22:13.257 回答
6

不要在 GET-URL 中编写查询参数。像这样做:

@GET("/my/api/call")
Response getMyThing(@Query("param1") String param1,
                    @Query("param2") String param2);
于 2013-11-14T10:30:30.857 回答
2

使用 Java

@GET("/my/api/call")
Response getMyThing(@Query("p1")
String param1, @Query("p2")
String param2);

使用 Kotlin 协程

 @GET("/my/api/call")
 suspend fun getSearchProduct(@Query("p1") p1: String , @Query("p2") p2: String )
于 2021-05-02T10:26:02.383 回答
0

这是您可以使用的最佳方式:

@GET("api_link_put_here")
    apiResponse getMyData(
            @Query("first_param") String firstParam,
            @Query("second_param") String secondParam
    );

这将自动像这样工作: http ://baseurl.com/api_link_put_here?first_param=firstParam&second_param=secondParam

于 2022-02-09T12:49:55.150 回答