无法使用Retrofit进行查询

时间:2016-07-24 00:28:24

标签: java android retrofit flickr

我正在使用Retrofit,我想根据用户输入的搜索词来查询FlickR。我想确保我正确设置它,因为我对Retrofit / REST的经验有限。我的代码的任何教程,建议和评论将不胜感激。

我已经标记了一些“不确定”的项目,我不知道应该输入什么。使用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);
        }

    }

1 个答案:

答案 0 :(得分:2)

几乎。 BTW看起来像你正在使用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类,代表您期望的响应。您可以将一些示例JSON插入此中,然后根据需要调整结果:http://www.jsonschema2pojo.org/。可能还有一些其他细节不完全正确,但应该让你开始。如果您希望每次都避免传递密钥和用户ID等,您可以研究请求拦截器。这样您就可以定义一个将它们注入请求的拦截器,您可以从界面中删除这些参数。

以下是有关迁移到Retrofit 2的一些信息:https://inthecheesefactory.com/blog/retrofit-2.0/en