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

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

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

网络服务:

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

然后在我的java中:

  Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://jquery.org") // .addConverterFactory(GsonConverterFactory.create()) .build(); WebService service = retrofit.create(WebService.class); Call signin = service.jquery(); Toast.makeText(this, signin.toString(), Toast.LENGTH_LONG).show(); 

我实际上只是尝试使用GET请求查询jquery.org/projects并返回它响应的String。 哪里不对?

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

谢谢。

  • 如何进行多个请求,并等待数据来自2.0中的所有请求 - android
  • Retofit2错误java.io.EOFException:行1列1的input结束
  • Retrofit 2使用HttpLoggingInterceptor.Level.BODY在日志中打印空响应主体
  • 在Retrofit + RxJava中链接请求
  • Retrofit和RxJava:如何结合两个请求并获得两个结果?
  • 使用Retrofit 2.0和Dagger 2设置dynamic基地址
  • 如何进行多个请求并等待数据来自retrofit 2.0中的所有请求 - android
  • 只用表单数据改造2
  • 使用Retrofit2将ScalarsConverterFactory添加到您的Retrofit.Builder。

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

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

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

    对于API调用,请使用:“

     Call  ***** 

    Android代码:

     .enqueue(new Callback() { @Override public void onResponse(Call call, Response 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(); } } 

    我看一下Retrofit库并注意到它根据Call的types类解析响应。 所以你有两个选择:第一:根据服务器的响应创建一个类。

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

     call.enqueue(new Callback() { @Override public void onResponse(Response response, Retrofit retrofit) { // handle success String result = response.body().string(); } @Override public void onFailure(Throwable t) { // handle failure } }); 

    要以Stringforms获取响应,您必须编写转换器并在初始化Retrofit时传递它。

    这是步骤。

    初始化改造。

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

    用于将Retrofit's ResponseBody转换为String转换器类

     public class ToStringConverterFactory extends Converter.Factory { private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain"); @Override public Converter responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { if (String.class.equals(type)) { return new Converter() { @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() { @Override public RequestBody convert(String value) throws IOException { return RequestBody.create(MEDIA_TYPE, value); } }; } return null; } } 

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

    您可以尝试以下方法:

    build.gradle文件:

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

    WebAPIService:

     @GET("/api/values") Call getValues(); 

    活动文件:

      Retrofit retrofit = new Retrofit.Builder() .baseUrl(API_URL_BASE) .build(); WebAPIService service = retrofit.create(WebAPIService.class); Call stringCall = service.getValues(); stringCall.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { Log.i(LOG_TAG, response.body()); } @Override public void onFailure(Call call, Throwable t) { Log.e(LOG_TAG, t.getMessage()); } }); 

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

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

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

    希望能帮助到你!

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

    如果你find了

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

    然后把它放在你的RestAdapter中

      .setLogLevel(RestAdapter.LogLevel.FULL) 

    例如:

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

    确保它的JsonObject不是JSONObject

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

    通过使用JsonObject您可以获得字符串格式的任何types的响应。