2015-12-09 41 views
3

我想在一個URL一個POST調用,並且作爲迴應,我只是得到一個字符串「OK」或「否」 .. 所以我這裏有我的界面是這樣的:改造與字符串響應

public interface registerAPI 
{ 
    @FormUrlEncoded 
    @POST("addDevice.php") 
    Call<String> insertUser(
      @Field("name") String devicename, 
      @Field("username") String regid); 
} 

所以我只想給POST方法兩個參數,並且我想要一個String。在服務器上的PHP腳本中,有這樣的事情:

<?php 
if(...) 
    echo "ok"; 
else 
    echo "no"; 

所以我把我的Android手機上:

Retrofit adapter = new Retrofit.Builder() 
         .baseUrl("http://root.url.net/") 
         .addConverterFactory(GsonConverterFactory.create()) //I dont want this.. 
         .build(); 

       registerAPI api = adapter.create(registerAPI.class); 

       Call<String> call = api.insertUser(name,regid); 
       call.enqueue(new Callback<String>() 
       { 
        @Override 
        public void onResponse(Response<String> response, Retrofit retrofit) 
        { 
         Log.i("Error",response.message()); 
        } 

        @Override 
        public void onFailure(Throwable t) 
        { 
         Log.d("Error", " Throwable is " +t.toString()); 

        } 
       }); 

所以,當我運行此,在Throwable的,我得到的以下信息:

Unable to create converter for class java.lang.String 

我是否必須爲自己的字符串響應編寫自己的轉換器?我該怎麼做?還是有更好的方法來做到這一點?

Regards

回答

4

好的答案是寫一個自己的轉換器。就像這樣:

public final class ToStringConverterFactory extends Converter.Factory { 

      @Override 
      public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) { 
       //noinspection EqualsBetweenInconvertibleTypes 
       if (String.class.equals(type)) { 
        return new Converter<ResponseBody, Object>() { 

         @Override 
         public Object convert(ResponseBody responseBody) throws IOException { 
          return responseBody.string(); 
         } 
        }; 
       } 

       return null; 
      } 

      @Override 
      public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) { 
       //noinspection EqualsBetweenInconvertibleTypes 
       if (String.class.equals(type)) { 
        return new Converter<String, RequestBody>() { 

         @Override 
         public RequestBody convert(String value) throws IOException { 
          return RequestBody.create(MediaType.parse("text/plain"), value); 
         } 
        }; 
       } 

       return null; 
      } 
     } 

你有這個稱呼它:

Retrofit adapter = new Retrofit.Builder() 
         .baseUrl("http://root.url.net/") 
         .addConverterFactory(new ToStringConverterFactory()) 
         .build(); 

       registerAPI api = adapter.create(registerAPI.class); 

       Call<String> call = api.insertUser(name,regid); 

你得到這個迴應:

call.enqueue(new Callback<String>() 
       { 
        @Override 
        public void onResponse(Response<String> response, Retrofit retrofit) 
        { 
         Log.i("http","innen: " + response.message()); 
         Log.i("http","innen: " + response.body()); // here is your string!! 
        } 

        @Override 
        public void onFailure(Throwable t) 
        { 
         Log.d("http", " Throwable " +t.toString()); 

        } 
       }); 
3

@Klatschen你的答案是正確的,在Retrofit2的abstarct功能已經改變。

public final class StringConverterFactory extends Converter.Factory { 
@Override 
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) { 
    //noinspection EqualsBetweenInconvertibleTypes 
    if (String.class.equals(type)) { 
     return new Converter<ResponseBody, Object>() { 

      @Override 
      public Object convert(ResponseBody responseBody) throws IOException { 
       return responseBody.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(MediaType.parse("text/plain"), value); 
      } 
     }; 
    } 
    return null; 
} 

}