wake-up-neo.com

Wie bekomme ich eine String-Antwort von Retrofit2?

Ich mache Android und suche nach einer Möglichkeit, eine super einfache http GET/POST-Anfrage auszuführen. Ich bekomme immer einen Fehler:

Java.lang.IllegalArgumentException: Unable to create converter for class Java.lang.String

Internetservice:

public interface WebService {
    @GET("/projects")
    Call<String> jquery();
}

dann in meinem Java:

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://jquery.org")
       // .addConverterFactory(GsonConverterFactory.create())
        .build();

    WebService service = retrofit.create(WebService.class);
    Call<String> signin = service.jquery();

    Toast.makeText(this, signin.toString(), Toast.LENGTH_LONG).show();

Ich versuche buchstäblich nur, jquery.org/projects mit einer GET-Anfrage abzufragen und den String zurückzugeben, mit dem er antwortet. Was ist falsch?

Wenn ich versuche, einen benutzerdefinierten Konverter zu implementieren (ich habe ein paar Beispiele online gefunden), beklagt er sich, dass ich die abstrakte Methode convert (F) nicht implementiert habe, was bei keinem der Beispiele zutrifft.

Vielen Dank.

21
Matthew Darnell

Mit Retrofit2 fügen Sie ScalarsConverterFactory zu Ihrem Retrofit.Builder hinzu.

adapterBuilder = new Retrofit.Builder()
               .addConverterFactory(ScalarsConverterFactory.create())
               .addConverterFactory(GsonConverterFactory.create());

Um ScalarsCoverter zu verwenden, fügen Sie Ihrem Build Graddle folgende Abhängigkeit hinzu

compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0' //Adding Retrofit2

Für API-Aufrufe verwenden Sie: ``

Call <String> *****

Android-Code:

.enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        Log.i("Response", response.body().toString());
        //Toast.makeText()
        if (response.isSuccessful()){
            if (response.body() != null){
                Log.i("onSuccess", response.body().toString());
            }else{
                Log.i("onEmptyResponse", "Returned empty response");//Toast.makeText(getContext(),"Nothing returned",Toast.LENGTH_LONG).show();
            }
        }
47
Neyomal

Ich schaue mir die Retrofit-Bibliothek an und habe festgestellt, dass die Antwort entsprechend der Typklasse in Call<T> analysiert wird. Sie haben also zwei Möglichkeiten: 1st: Erstellen Sie eine Klasse entsprechend der Antwort des Servers.

Zweitens: Holen Sie sich die Antwort und behandeln Sie sie selbst (Nicht empfohlen, Retrofit behandelt sie bereits. Warum verwenden Sie Retrofit, da es auf diesen Job zugeschnitten ist)? Jedenfalls anstelle von Call<String> verwenden Sie Call<ResponseBody> und Call<ResponseBody> signin = service.jquery();, nachdem Sie Folgendes eingegeben haben 

call.enqueue(new Callback<ResponseBody>() {
  @Override
  public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
    // handle success
   String result = response.body().string();

  }

  @Override
  public void onFailure(Throwable t) {
    // handle failure
  }
});
7
ugur

Um die Antwort als String zu erhalten, müssen Sie einen converter schreiben und bei der Initialisierung von Retrofit übergeben.

Hier sind die Schritte.

Retrofit initialisieren.

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_URL_BASE)
                .addConverterFactory(new ToStringConverterFactory())
                .build();
        return retrofit.create(serviceClass);

Konverter-Klasse zum Konvertieren von Retrofit's ResponseBody in String

public class ToStringConverterFactory extends Converter.Factory {
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain");


    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
                                                            Retrofit retrofit) {
        if (String.class.equals(type)) {
            return new Converter<ResponseBody, String>() {
                @Override
                public String convert(ResponseBody value) throws IOException
                {
                    return value.string();
                }
            };
        }
        return null;
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations,
                                                          Annotation[] methodAnnotations, Retrofit retrofit) {

        if (String.class.equals(type)) {
            return new Converter<String, RequestBody>() {
                @Override
                public RequestBody convert(String value) throws IOException {
                    return RequestBody.create(MEDIA_TYPE, value);
                }
            };
        }
        return null;
    }
}

Nach der Ausführung von service.jquery(); enthält signin eine JSON-Antwort. 

4
FAЯAƸ

Sie können folgendes versuchen:

build.gradle file:

dependencies {
    ...
    compile 'com.squareup.retrofit2:retrofit:2.0.1'
    ...
}

WebAPIService:

@GET("/api/values")
Call<String> getValues();

Aktivitätsdatei:

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_URL_BASE)                    
                .build();

        WebAPIService service = retrofit.create(WebAPIService.class);

        Call<String> stringCall = service.getValues();
        stringCall.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                Log.i(LOG_TAG, response.body());
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.e(LOG_TAG, t.getMessage());
            }
        });

Ich habe mit meinem Webdienst (ASP.Net WebAPI) getestet:

public class ValuesController : ApiController
{
        public string Get()
        {
            return "value1";
        }
}

Android Logcat heraus: 04-11 15:17:05.316 23097-23097/com.example.multipartretrofit I/AsyncRetrofit2: value1

Ich hoffe es hilft!

3
BNK
    call.enqueue(new Callback<Object>() {
        @Override
        public void onResponse(@NonNull Call<Object> call, @NonNull Response<Object> response) {
            if (response.isSuccessful()) {
                Gson gson = new Gson();
                String successResponse = gson.toJson(response.body());
                Log.d(LOG_TAG, "successResponse: " + successResponse);
            } else {
                try {
                    if (null != response.errorBody()) {
                        String errorResponse = response.errorBody().string();
                        Log.d(LOG_TAG, "errorResponse: " + errorResponse);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onFailure(@NonNull Call<Object> call, @NonNull Throwable t) {
        }
    });
1

stellen Sie sicher, dass JsonObject kein JSONObject ist.

Call<JsonObject> call = api.getJsonData(url);
    call.enqueue(new Callback<JsonObject>() {
        @Override
        public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
            String str = response.body().toString();
            Log.e(TAG, "onResponse: " + str);
        }

        @Override
        public void onFailure(Call<JsonObject> call, Throwable t) {
            Log.e(TAG, "onFailure: " + t.getMessage());

        }
    });

Wenn Sie JsonObject verwenden, können Sie jede Art von Antwort im Zeichenfolgenformat erhalten.

0
Imran Samed
String body = new String(((TypedByteArray) response.getBody()).getBytes());

wenn du gefunden hast

Java.lang.ClassCastException: retrofit.client.UrlConnectionClient$TypedInputStream cannot be cast to retrofit.mime.TypedByteArray

dann legen Sie dies in Ihren RestAdapter

                .setLogLevel(RestAdapter.LogLevel.FULL)

zum Beispiel:

RestAdapter restAdapter = new RestAdapter.Builder()
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .setEndpoint(Root_url)
            .build();
0
Hardik Lakhani

dachte, es könnte zu spät sein, um zu antworten, benutze einfach response.body()?.string() und du wirst deine Antwort als Zeichenkette haben.

0
Joseph Daudi