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)
我看一下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)
您可以尝试以下方法:
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
希望能帮助到你!
要以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响应。
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)