2016-10-10 6 views
0

私はRetrofitでhttps://newsapi.org/v1/articlesからJSONデータを取得しようとしていますが、これは初めてのことです。これまではかなり混乱していました。nullオブジェクトを取得するのはなぜですか?

私が知る限り、私は成功した接続を確立することができました。しかし、何らかの理由で私がまだ識別できなかったため、RetrofitはJSON文字列のデータをNewsAPIクラスにマッピングしません。

私が現在使用しているコードを投稿し、誰かがこれを理解するのを助けることを期待しています。ありがとう!

Activity.java

final TextView tvTest = (TextView) findViewById(R.id.tvTest); 
String url = "https://newsapi.org"; 

NewsAPI_Interface client = NewsAPI_Adapter.createService(NewsAPI_Interface.class); 
Call<List<NewsAPI>> call = client.getData("techcrunch", "APIkeygoeshere"); 

call.enqueue(new Callback<List<NewsAPI>>() { 
      @Override 
      public void onResponse(Call<List<NewsAPI>> call, Response<List<NewsAPI>> response) { 
       if (response.body() != null) { 
        tvTest.setText(response.body().toString()); 

        for (NewsAPI news: response.body()) { 
         System.out.println(news.source + " (" + news.status + ")"); 
         tvTest.setText(news.source + " (" + news.status + ")"); 
        } 
       } else { 
        tvTest.setText("It's null, " + response.errorBody().toString() + ", " + call.request().url()); 
       } 
      } 

      @Override 
      public void onFailure(Call<List<NewsAPI>> call, Throwable t) { 
       tvTest.setText("An error ocurred!"); 
      } 
     }); 

NewsAPI.java

public class NewsAPI { 
    String status; 
    String source; 

public NewsAPI (String status, String source) { 
     this.status = status; 
     this.source = source; 
    } 
} 

NewsAPI_Interface.java

public interface NewsAPI_Interface { 
    @GET("/v1/articles") 
    Call<List<NewsAPI>> getData(@Query("source") String source, @Query("api_Key") String api_key); 
} 

NewsAPI_Adapter.java

私が言うことができるものから、
+0

私が思い出したように、 'onResponse'メソッドから' response.body() 'を1回しか使用できません。 –

+0

あなたはproguardを使用していますか? –

+0

また、私が右を読んでいるなら '@Query(" api_Key ")'は 'apiKey'でなければなりません。 https://newsapi.org/ –

答えて

1

は、私が正常に接続

あなたのエラーが出力されることでしょうどこさて、あなたは、ここでのThrowableを無視しているを確立することができました。

@Override 
public void onFailure(Call<List<NewsAPI>> call, Throwable t) { 
    tvTest.setText("An error ocurred!"); 
} 

あなたが期待している応答は、この

{ 
    "status": "ok", 
    "source": "techcrunch", 
    ... 

よう{に見えるオブジェクト、ないListが起動し、そのため、あなたは違った自分のインタフェースを定義する必要があります。次に、APIキーがapiKeyというURLに追加されているので、それを変更します。

public interface NewsAPI_Interface { 
    @GET("/v1/articles") 
    Call<NewsAPI> getData(@Query("source") String source, @Query("apiKey") String api_key); 
} 

(レトロフィットではなく、あなたがArticleクラスの別のオブジェクトを定義する必要があります。しかし、それはGsonの問題である)

最後に、私はresponse.body()は一度だけ呼び出されるべきであることを読んでどこかを覚えています。

Call<NewsAPI> call = client.getData("techcrunch", "APIkeygoeshere"); 

call.enqueue(new Callback<NewsAPI>() { 
    @Override 
    public void onResponse(Call<List<NewsAPI>> call, Response<List<NewsAPI>> response) { 
     final NewsAPI responseBody = response.body(); 
     if (responseBody != null) { 
      tvTest.setText(responseBody.toString()); 

      String news = news.source + " (" + news.status + ")"; 
      Log.i("responseBody", news); 
      tvTest.setText(news); 

     } else { 
      tvTest.setText("It's null, " + response.errorBody().toString() + ", " + call.request().url()); 
     } 
    } 

    @Override 
    public void onFailure(Call<List<NewsAPI>> call, Throwable t) { 
     tvTest.setText("An error ocurred!"); 
     Log.e("news Error", t.getMessage()); 
    } 
}); 

運が良かった!

+1

ありがとう、私は今働いている!また、 'NewsAPI'クラスのそれぞれの変数に' ArrayList 'を使用して、JSON配列がマップされるために必要だった欠落した' Articles'クラスを実装しました。将来の参照のためにここに残しておきます。 – KaiZ

+0

こんにちはカルズ私はあなたがどのように応答からArrayList を得たか、私は同じポイントをフォローしている、私は同じAPIを使用しています –

関連する問題