2016-07-24 66 views
1

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

    } 

回答

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/。可能有一些其他細節不完全正確,但應該讓你開始。如果您希望避免每次傳遞密鑰和用戶標識等,可以研究請求攔截器。這樣你就可以定義一個攔截器,將它們注入到請求中,並且你可以從接口中刪除這些參數。

下面是有關遷移到2改造的一些信息:https://inthecheesefactory.com/blog/retrofit-2.0/en

+0

感謝您的幫助。我會試驗它,但是我注意到你刪除了我的查詢的照片搜索部分。我基於這個文檔:https://www.flickr.com/services/api/flickr.photos.search.html – tccpg288

+1

我建議你學習一些關於HTTP/REST的更多信息。 「?」之後的所有內容是查詢參數。 nasch將method = flickr.photos.search轉換爲方法參數。所以你需要調用getPhotos(「flickt.photos.search」)來獲得相同的方法值。另一個是搜索中的下一個字段。我建議你使用http客戶端來測試它,以瞭解發生了什麼,比如郵遞員(瀏覽器插件)或捲曲。 – Lxu

+0

非常感謝,您對http/REST教程有任何建議嗎?我已閱讀了一些內容,但綜合教程將會有所幫助。 – tccpg288