无法使用 Retrofit 进行查询
Cannot Query with Retrofit
我正在使用 Retrofit,我想根据用户输入的搜索词查询 FlickR。我想确保我的设置正确,因为我对 Retrofit/REST 的经验有限。任何关于我的代码的教程、建议和评论都将不胜感激。
我已经标记了一些我不知道应该输入什么的项目 "UNSURE"。对于 REST,"q" 是否总是用于表示查询?
在一天结束时,我希望图像结果显示在 GridView 中并可供用户选择:
public class MainActivity extends AppCompatActivity {
private EditText mSearchTerm;
private Button mRequestButton;
private String mQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSearchTerm = (EditText) findViewById(R.id.ediText_search_term);
mRequestButton = (Button) findViewById(R.id.request_button);
mRequestButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mQuery = mSearchTerm.getText().toString();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.flickr.com/services/rest/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
Call<List<Photo>> call = apiInterface.getPhotos(mQuery);
call.enqueue(new Callback<List<Photo>>() {
@Override
public void onResponse(Call<List<Photo>> call, Response<List<Photo>> response) {
}
@Override
public void onFailure(Call<List<Photo>> call, Throwable t) {
}
});
}
});
}
//Synchronous vs. Asynchronous
public interface ApiInterface {
@GET("?&method=flickr.photos.search&tags=<mQuery>&api_key=1c448390199c03a6f2d436c40defd90e&format=json") //
Call<List<Photo>> getPhotos(@Query("q") String photoSearchTerm);
}
}
差不多。顺便说一句,您似乎在使用 Retrofit 1.9; Retrofit 2 可用,您可能想现在切换,因为我认为最终 1.9 将被弃用。
RestAdapter restAdapter=new RestAdapter.Builder()
.setEndpoint("http://api.flickr.com/services")
.setLogLevel(RestAdapter.LogLevel.FULL)//log your request
.build();
}
public interface ApiInterface {
@GET("/rest") //
void getPhotos(@Query("method") String method, @Query("api_key") String key, @Query ("user_id") String user, @Query("format") String format, @Query("city") String city, Callback<FlickrResponse> callback);
}
FlickrResponse
是一个 Java class,代表您期望的响应。您可以将一些示例 JSON 插入其中,然后根据需要调整结果:http://www.jsonschema2pojo.org/。可能还有一些其他细节不完全正确,但应该可以帮助您入门。如果您想避免每次都传递密钥和用户 ID 等,您可以研究请求拦截器。这样你就可以定义一个将它们注入请求的拦截器,你可以从接口中删除这些参数。
这里有一些关于迁移到 Retrofit 2 的信息:https://inthecheesefactory.com/blog/retrofit-2.0/en
我正在使用 Retrofit,我想根据用户输入的搜索词查询 FlickR。我想确保我的设置正确,因为我对 Retrofit/REST 的经验有限。任何关于我的代码的教程、建议和评论都将不胜感激。
我已经标记了一些我不知道应该输入什么的项目 "UNSURE"。对于 REST,"q" 是否总是用于表示查询?
在一天结束时,我希望图像结果显示在 GridView 中并可供用户选择:
public class MainActivity extends AppCompatActivity {
private EditText mSearchTerm;
private Button mRequestButton;
private String mQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSearchTerm = (EditText) findViewById(R.id.ediText_search_term);
mRequestButton = (Button) findViewById(R.id.request_button);
mRequestButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mQuery = mSearchTerm.getText().toString();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.flickr.com/services/rest/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiInterface apiInterface = retrofit.create(ApiInterface.class);
Call<List<Photo>> call = apiInterface.getPhotos(mQuery);
call.enqueue(new Callback<List<Photo>>() {
@Override
public void onResponse(Call<List<Photo>> call, Response<List<Photo>> response) {
}
@Override
public void onFailure(Call<List<Photo>> call, Throwable t) {
}
});
}
});
}
//Synchronous vs. Asynchronous
public interface ApiInterface {
@GET("?&method=flickr.photos.search&tags=<mQuery>&api_key=1c448390199c03a6f2d436c40defd90e&format=json") //
Call<List<Photo>> getPhotos(@Query("q") String photoSearchTerm);
}
}
差不多。顺便说一句,您似乎在使用 Retrofit 1.9; Retrofit 2 可用,您可能想现在切换,因为我认为最终 1.9 将被弃用。
RestAdapter restAdapter=new RestAdapter.Builder()
.setEndpoint("http://api.flickr.com/services")
.setLogLevel(RestAdapter.LogLevel.FULL)//log your request
.build();
}
public interface ApiInterface {
@GET("/rest") //
void getPhotos(@Query("method") String method, @Query("api_key") String key, @Query ("user_id") String user, @Query("format") String format, @Query("city") String city, Callback<FlickrResponse> callback);
}
FlickrResponse
是一个 Java class,代表您期望的响应。您可以将一些示例 JSON 插入其中,然后根据需要调整结果:http://www.jsonschema2pojo.org/。可能还有一些其他细节不完全正确,但应该可以帮助您入门。如果您想避免每次都传递密钥和用户 ID 等,您可以研究请求拦截器。这样你就可以定义一个将它们注入请求的拦截器,你可以从接口中删除这些参数。
这里有一些关于迁移到 Retrofit 2 的信息:https://inthecheesefactory.com/blog/retrofit-2.0/en