2016-08-26 5 views
0

Ich bin jetzt versuchen, JSON über diesen Link zu analysieren ("https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=fdac2e9676991ac53b34651adab52518&format=json&nojsoncallback=1&auth_token=72157671978046542-6e266595ffed01f8&api_sig=58e08d365779a8f2e946a2b5320199e2")Android: Probleme mit Retrofit 2 und Gson & JSON

Dies ist, was ich in meinem Java tun:

package com.example.karim.bluecrunch; 

import com.google.gson.annotations.SerializedName; 

public class SinglePhotoRetrofit { 
@SerializedName("id") 
public String id; 
@SerializedName("owner") 
public String owner; 
@SerializedName("secret") 
public String secret; 
@SerializedName("server") 
public String server; 
@SerializedName("farm") 
    public int farm;  

    @SerializedName("title") 
    public String title; 

    @SerializedName("ispublic") 
    public int ispublic; 

    @SerializedName("isfriend") 
    public int isfriend; 

    @SerializedName("isfamily") 
    public int isfamily; 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 
} 

und

package com.example.karim.bluecrunch; 

import com.google.gson.annotations.SerializedName;  
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by karim on 8/26/16. 
*/ 
public class PhotosRetrofit { 
    @SerializedName("page") 
    public int page; 

    @SerializedName("pages") 
    public int pages; 

    @SerializedName("perpage") 
    public int perpage; 

    @SerializedName("total") 
    public String total; 

    @SerializedName("photo") 
    public List<SinglePhotoRetrofit> photo; 

    @SerializedName("stat") 
    public String stat; 

    public List<SinglePhotoRetrofit> getPhoto() { 
     return photo; 
    } 

    public void setPhoto(List<SinglePhotoRetrofit> photo) { 
     this.photo = photo; 
    } 

    public String getTotal() { 
     return total; 
    } 

    public void setTotal(String total) { 
     this.total = total; 
    } 
}` 

und hier ist meine Schnittstelle

package com.example.karim.bluecrunch; 

import java.util.List;  
import retrofit2.Call; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 
import retrofit2.http.GET; 
import retrofit2.http.Path; 
import retrofit2.http.Query; 

/** 
* Created by karim on 8/26/16. 
*/ 
public interface HandleRetrofit { 
/* 
https://api.flickr.com/services/rest/?method=flickr.photos.search 
&api_key=6d5c5a20d108f8f56f324394d3e2381f 
&format=json 
&nojsoncallback=1 
&auth_token=72157672948729705-c211cbcbcac8bb30 
&api_sig=bd73bb34b0f29390a80c6ffdbb376c97 

*/ 
    @GET("rest/?") 
    Call<PhotosRetrofit> Photos (
      @Query("method") String method, 
      @Query("api_key") String key, 
      @Query("format") String format, 
      @Query("nojsoncallback") int call_back, 
      @Query("auth_token") String token, 
      @Query("api_sig") String sig 
    ); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("https://api.flickr.com/services/") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
} 

und meine MainActivity sieht aus wie ->

package com.example.karim.bluecrunch; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 

public class MainActivity extends AppCompatActivity {  

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

       /* 
https://api.flickr.com/services/rest/?method=flickr.photos.search 
&api_key=fdac2e9676991ac53b34651adab52518 
&format=json&nojsoncallback=1 
&auth_token=72157671978046542-6e266595ffed01f8 
&api_sig=58e08d365779a8f2e946a2b5320199e2 
*/ 
       final String API_KEY = "fdac2e9676991ac53b34651adab52518"; 
       final String METHOD = "flickr.photos.search"; 
       final String AUTH_TOKEN = "72157671978046542-6e266595ffed01f8"; 
       final String API_SIG = "58e08d365779a8f2e946a2b5320199e2"; 
       final String FORMAT = "json"; 
       final int CALL_BACK = 1; 

     HandleRetrofit handleRetrofit = HandleRetrofit.retrofit.create(HandleRetrofit.class); 
     Call<PhotosRetrofit> call = handleRetrofit.Photos(METHOD,API_KEY,FORMAT,CALL_BACK,AUTH_TOKEN,API_SIG); 
     call.enqueue(new Callback<PhotosRetrofit>() { 
        @Override 
        public void onResponse(Call<PhotosRetrofit> call, Response<PhotosRetrofit> response) { 
         Log.d("MainActivity", "Status Code = " + response.code()); 
         TextView textView = (TextView) findViewById(R.id.photoTitle); 

         PhotosRetrofit photosRetrofit = response.body(); 

         textView.setText(photosRetrofit.total+"\n");  

         Log.w("---___---Respones","Hereeeeeeeeeeeeeeeeeeee"); 
        } 

        @Override 
        public void onFailure(Call<PhotosRetrofit> call, Throwable t) { 
         Toast.makeText(MainActivity.this,"Error :"+t.getMessage(),Toast.LENGTH_LONG).show(); 
         Log.w("---___--- Error ",t.getMessage()); 
        } 
       });  
    } 
} 

es in meinem Textview null zurück, ich habe auch versucht, mehr und mehr auf verschiedene Daten abrufen, aber ich habe auf das schlägt fehl.

+0

Diese Frage kann derzeit nicht bearbeitet werden, aus diesem Grund: 'Bei" Links Bei ideone.com muss Code beigefügt werden, bitte den gesamten Code mit der Code-Toolbar oder der Tastenkombination STRG + K um 4 Leerzeichen einrücken tcut. Für weitere Bearbeitungshilfe klicken Sie auf das Symbol [?] In der Symbolleiste. "'. Bitte bearbeiten Sie die Frage. – halfer

+0

(Um zu verdeutlichen, fügen Sie bitte Ihren Code _to_ die Frage, anstatt auf Links auf einer Pasteboard zeigen. Der Inhaltsfilter gibt es für eine Grund, und ist nicht zum Umgehen) – halfer

+0

Es ist verdrahtet! Ich ziehe es vor, meine Codes in Verbindungen hinzuzufügen, weil es ihnen mehr klar als das Einfügen sie hier zeigt! Also, warum Stackoverflow erzwingen Sie mich auf das !! –

Antwort

0

erstellen eine andere Klasse:

public class Photos{ 
    public PhotosRetrofit photos; 
} 

Aktualisieren Sie Ihre Schnittstelle:

Call<Photos> Photos (...) 

Aktivität Update:

Call<Photos> call = handleRetrofit.Photos(METHOD,API_KEY,FORMAT,CALL_BACK,AUTH_TOKEN,API_SIG); 
call.enqueue(new Callback<Photos>() { 
    @Override 
    public void onResponse(Call<Photos> call, Response<Photos> response) { 
     TextView textView = (TextView) findViewById(R.id.photoTitle); 
     PhotosRetrofit photosRetrofit = response.body().photos; 
     textView.setText(photosRetrofit.total+"\n"); 
    .... 
+0

Sie sind der beste Mann der Welt !!, Sie rettete mein Leben! Finalyyyyyyyyyyyyyyyy, ich t Funktioniert !! Aber ich möchte Sie nur ein wenig fragen 2 Fragen 1- Warum Sie darüber nachdenken, muss es ein anderes Modell für die Handhabung von PhotosRerofit sein (Obwohl in JSON Formant, gibt es nur eine PhotosRerofit Daten) 2- Wenn ich übergeben möchte Fotos zu Glide Library Recycler View verwenden, Was genau ich brauche oder in einer anderen Bedeutung, was ich an Glide Parameter weitergeben werde, um meine von Flickr-API abgerufenen Fotos anzuzeigen –

+0

Über Modell. Ich kann Ihnen nur empfehlen, Fotos in PhotosRetrofit und alte PhotosRetrofit in Photos umzubenennen. Dann können Sie die Photos-Klasse als interne Klasse von PhotosRetroft deklarieren.Also, Sie Code wird somehin wie folgt aussehen: öffentliche Klasse PhotosRetrofit { öffentliche Klasse Fotos { @SerializedName ("Seite") öffentliche int-Seite; @SerializedName ("Seiten") öffentliche int-Seiten; .... } öffentliche Fotos Fotos; } Über api. ich arbeite ne mit flickr api. Aber Sie können über URL dort bereit sein: https://www.flickr.com/services/api/misc.urls.html –

+0

So wird der letzte Link wie folgt aussehen: https://farm9.staticflickr.com /8162/29170354321_741f107275_z.jpg –

0

Mithilfe von @Query werden der URL Parameter hinzugefügt. Dies führt zu doppelten Parametern und die API akzeptiert Ihre Anfrage nicht. Entweder haben Sie eine URL, die die Parameter nicht enthält, oder verwenden Sie @Path.

Siehe in der Dokumentation unter "URL-Manipulation" http://square.github.io/retrofit/

EDIT: Ich denke, ich falsch verstanden. Sie sollten @Query verwenden, aber nicht die Abfrage-Pfade themself Zum Beispiel sind:

@GET("rest/?&format=json&nojsoncallback=1") 
Call<PhotosRetrofit> Photos (
    @Query("method") String method, 
    @Query("api_key") String key, 
    @Query("auth_token") String token, 
    @Query("api_sig") String sig 
); 

Der @Query Wert sollte der genaue Wert sein, dass der Abfrage-Pfad enthalten sollte.

+0

Vielen Dank für Ihre Antwort Aber eigentlich habe ich '@ Path' verwendet aber Logcat zeigt mir diese Nachricht " java.lang.RuntimeException: Kann nicht starten ComponentInfo {com.example.karim.bluecrunch/com.example.karim .bluecrunch.MainActivity}: java.lang.IllegalArgumentException: URL-Abfragezeichenfolge "method = {method} & api_key = {schlüssel} & format = json & nojsoncallback = 1 & auth_token = {token} & api_sig = {sig}" darf keinen replace-block haben. Für dynamische Abfrageparameter benutze '@ Query'" Also, ich schalte '@ Path' zu' @ Query', ich wäre mehr dankbar, wenn du mir in diesem Fall die richtige Anweisung für '@ Path' zeigst. –

+0

Sorry ich glaube Ich missverstand Sie sollten in der Tat @Query verwenden.Außerdem nicht die URL enthalten bereits die 'method =', 'key =', 'auth_token =', ect Teile. –

+0

Also bin ich sicher über die Verbindung passieren, weil Wenn Sie sich meine MainActivity in diesen beiden Zeilen ansehen: - Log.d ("MainActivity", "Statuscode =" + response.code()); - Log.w ("---___--- Antworten “,‚Hereeeeeeeeeeeeeeeeeeee‘);! Und Beide sind auf meinem Logcat gezeigt Aber das Problem ist, Textview null Text im Innern zeigt Bitte beachten sie, das ist mein erstes Mal zu verwenden, Flickr-API und ich bin mir nicht sicher, ob ich es richtig verwende oder nicht. –