如何从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),这些都没有。

谢谢。

使用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的响应。