Aşağıdaki Api'den yanıt almaya çalışıyorum:
https://api.github.com/users/username
Ancak yanıtı String
olarak nasıl alacağımı bilmiyorum, böylece JSONObject
i ayrıştırmak ve almak için String
i kullanabilirim.
Retrofit sürümü kullanıldı:
retrofit:2.0.0-beta1
Şimdiye kadar bunu denedim:
public interface GitHubService {
@GET("/users/{user}")
public String listRepos(@Path("user") String user,Callback<String> callback);
}
geri̇ geti̇ri̇li̇yor :
GitHubService service = retrofit.create(GitHubService.class);
service.listRepos("username", new Callback<String>() {
@Override
public void onResponse(Response response) {
System.out.println(response.toString());
}
@Override
public void onFailure(Throwable t) {
}
});
İstisna:
Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for class java.lang.String. Tried:
* retrofit.ExecutorCallAdapterFactory
at retrofit.Utils.resolveCallAdapter(Utils.java:67)
at retrofit.MethodHandler.createCallAdapter(MethodHandler.java:49)
Herhangi bir yardım gerçekten takdir edilecektir.
Güncelleme Retrofit'e, aşağıdaki orijinal cevabımdan daha az seremoni içeren bir String
yanıtına izin veren bir skaler dönüştürücü eklendi.
Örnek arayüz --
public interface GitHubService {
@GET("/users/{user}")
Call<String> listRepos(@Path("user") String user);
}
Güçlendirme oluşturucunuza ScalarsConverterFactory
ekleyin. Not: Eğer ScalarsConverterFactory
ve başka bir fabrika kullanıyorsanız, önce scalars fabrikasını ekleyin.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
// add other factories here, if needed.
.build();
Ayrıca gradle dosyanıza scalars dönüştürücüsünü de eklemeniz gerekecektir --
implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'
--- Orijinal Cevap (hala çalışıyor, sadece daha fazla kod) ---
JSON'u kendiniz işlemek için isteği kesmek istemenizin biraz garip göründüğü konusunda @CommonsWare ile aynı fikirdeyim. Çoğu zaman POJO ihtiyacınız olan tüm verilere sahiptir, bu nedenle JSONObject
diyarında dolaşmaya gerek yoktur. JSON'u manipüle etmeniz gerekiyorsa, özel bir gson TypeAdapter
veya bir retrofit Converter
kullanarak özel sorununuzun daha iyi çözülebileceğinden şüpheleniyorum. Bununla birlikte, retrofit, Gson aracılığıyla sadece JSON ayrıştırma işleminden daha fazlasını sağlar. Ayrıca REST isteklerinde yer alan diğer sıkıcı görevlerin çoğunu da yönetir. Özelliklerden birini kullanmak istememeniz, her şeyi çöpe atmanız gerektiği anlamına gelmez. Sadece ham akışı almak istediğiniz zamanlar vardır, işte bunu nasıl yapacağınız -
Öncelikle, Retrofit 2 kullanıyorsanız, Call
APIsini kullanmaya başlamalısınız. Tür parametresi olarak dönüştürülecek bir nesne göndermek yerine, okhttp'den
ResponseBody` kullanın --
public interface GitHubService {
@GET("/users/{user}")
Call<ResponseBody> listRepos(@Path("user") String user);
}
sonra çağrınızı oluşturabilir ve yürütebilirsiniz --
GitHubService service = retrofit.create(GitHubService.class);
Call<ResponseBody> result = service.listRepos(username);
result.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
e.printStackTrace();
}
});
Not Yukarıdaki kod, yanıt nesnesi üzerinde string()
işlevini çağırarak tüm yanıtı bir String olarak okur. Gövdeyi akışları alabilen bir şeye aktarıyorsanız, bunun yerine charStream()
çağırabilirsiniz. Bkz. ResponseBody
dokümanları.