如何从Retrofit2获取字符串响应?

Mat*_*ell 30 java android http retrofit2

我正在做android,寻找一种方法来做一个超级基本的http GET/POST请求.我一直收到错误:

java.lang.IllegalArgumentException: Unable to create converter for class java.lang.String
Run Code Online (Sandbox Code Playgroud)

网络服务:

public interface WebService {
    @GET("/projects")
    Call<String> jquery();
}
Run Code Online (Sandbox Code Playgroud)

然后在我的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();
Run Code Online (Sandbox Code Playgroud)

我实际上只是尝试使用GET请求查询jquery.org/projects并返回它响应的String.怎么了?

如果我尝试实现一个自定义转换器(我在网上找到了一些例子),它抱怨我没有实现抽象方法convert(F),这些都没有.

谢谢.

Ney*_*mal 59

使用Retrofit2将ScalarsConverterFactory添加到您的Retrofit.Builder.

adapterBuilder = new Retrofit.Builder()
               .addConverterFactory(ScalarsConverterFactory.create())
               .addConverterFactory(GsonConverterFactory.create());
Run Code Online (Sandbox Code Playgroud)

要使用ScalarsCoverter,请将以下依赖项添加到构建渐变

compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0' //Adding Retrofit2
Run Code Online (Sandbox Code Playgroud)

对于API调用:``

Call <String> *****
Run Code Online (Sandbox Code Playgroud)

Android代码:

.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();
            }
        }
Run Code Online (Sandbox Code Playgroud)

  • ScalarsConverterFactory到底是什么? (3认同)
  • 优秀的答案...添加单行.addConverterFactory(ScalarsConverterFactory.create())解决了我的问题.... (2认同)

ugu*_*gur 8

我看一下Retrofit库,发现它根据里面的类型类解析响应Call<T>.所以你有两个选择:第一:根据服务器的响应创建一个类.

第二:获得响应并自行处理(不推荐Retrofit已经处理过.所以为什么要使用Retrofit,因为它是为这项工作量身定做的).无论如何,而不是Call<String>使用,Call<ResponseBody>Call<ResponseBody> signin = service.jquery();在此之后提出以下内容

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
  }
});
Run Code Online (Sandbox Code Playgroud)


BNK*_*BNK 5

您可以尝试以下方法:

build.gradle文件:

dependencies {
    ...
    compile 'com.squareup.retrofit2:retrofit:2.0.1'
    ...
}
Run Code Online (Sandbox Code Playgroud)

WebAPIService:

@GET("/api/values")
Call<String> getValues();
Run Code Online (Sandbox Code Playgroud)

活动文件:

        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());
            }
        });
Run Code Online (Sandbox Code Playgroud)

我已经使用我的Web服务(ASP.Net WebAPI)进行了测试:

public class ValuesController : ApiController
{
        public string Get()
        {
            return "value1";
        }
}
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助到你!


FAЯ*_*ЯAƸ 5

要以String形式获取响应,您必须编写一个转换器,并在初始化时传递它Retrofit

步骤如下。

初始化改造。

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_URL_BASE)
                .addConverterFactory(new ToStringConverterFactory())
                .build();
        return retrofit.create(serviceClass);
Run Code Online (Sandbox Code Playgroud)

转换转换器类Retrofit's ResponseBody,以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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且执行后service.jquery();signin将包含JSON响应。


Aha*_*kat 5

    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) {
        }
    });
Run Code Online (Sandbox Code Playgroud)