2016-02-29 7 views
3

Salut j'ai un JSON pour envoyer au serveur (POST methord) {"country":"india","devicetype":"android"} il est sous forme modèle de données comme la clé de cette JSON est données-à-dire est le serveur accepte commeComment envoyer des données de formulaire dans retrofit2 Android

data={"country":"india","devicetype":"android"} je utilise retrofit j'utilise comme multipart cette

@Multipart 
@POST("initiate") 
@Headers({ 
     "Content-Type: application/json", 
     "Cache-Control: no-cache" 
}) 
Call<UserInfoServerResponse> getUserInfoRequest(@Part(value="data") UserInfo mUserInfo); 

ici UserInfo est le JSON, mais je reçois un message échec du serveur après que j'ai utilisé FormUrlEncoded methord

@FormUrlEncoded 
@POST("initiate") 
@Headers({ 
     "Content-Type: application/json", 
     "Cache-Control: no-cache" 
}) 
Call<UserInfoServerResponse> getUserInfoRequest(@Field(value="data",encoded = false) String mUserInfo); 

son eteint est même résultat de défaillance du serveur, mais les données envoyées au serveur est dans le formate

data=%7B%22country%22%3A%22india%22%2C%22devicetype%22%3A%22%22%7D 

Mon UserInfo.class

public class UserInfo { 


public String country; 

public String devicetype; 

public UserInfo(String country,String devicetype) { 

    this.country=country; 

    this.devicetype=devicetype; 
} 
} 

Mon adaptateur classe

RemoteRetrofitInterfaces mService; 
    Retrofit mRetrofit; 
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
     interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

     OkHttpClient client = new OkHttpClient.Builder() 
       .connectTimeout(20, TimeUnit.SECONDS) 
       .writeTimeout(20, TimeUnit.SECONDS) 
       .readTimeout(30, TimeUnit.SECONDS).addInterceptor(interceptor) 
       .build(); 

     mRetrofit = new Retrofit.Builder() 
       .baseUrl(AppConstant.HOST).addConverterFactory(GsonConverterFactory.create()) 
       .client(client) 
       .build(); 
     mService = mRetrofit.create(RemoteRetrofitInterfaces.class); 

    Call<UserInfoServerResponse> api = mService.getUserInfoRequest(new Gson().toJson(mUserInfo)); 

     api.enqueue(new Callback<UserInfoServerResponse>() { 
      @Override 
      public void onResponse(Call<UserInfoServerResponse> responseCall, Response<UserInfoServerResponse> response) { 

       if (response.body().status != null) { 
        if (response.body().status.equals("success")) { 
         Log.d(TAG, "success---"); 
        } 

       } else { 
        Log.d(TAG, "Failed---"); 

       } 


      } 

      @Override 
      public void onFailure(Call<UserInfoServerResponse> responseCall, Throwable t) { 
       t.printStackTrace(); 
      } 


     }); 

alors comment puis-je envoyer le JSON au serveur en utilisant la modernisation avec succès je suis passé par le retofit document et suivre quelques étapes, mais je ne reçois aucun résultat. quelqu'un peut me aider dans cette

Merci

+0

Déposez votre classe 'UserInfo' –

+0

essayer ajouter "Accepter: application/json" pour les en-têtes. –

+0

Où est votre code Retrofit RestAdapter? –

Répondre

6

J'ai finalement trouvé la solution espère que cela aidera d'autres

i trouver la solution à l'aide de retrofit FieldMap

.

@POST("initiate") 
@FormUrlEncoded 

Call<UserInfoServerResponse> getUserInfoRequest(@FieldMap Map<String,String> params); 

et dans la section adaptateur reste i changé les données de demande de chaîne à hashmap forme comme suit

Log.d(TAG, "sendUserInfo called"); 
UserInfo mInfo=new UserInfo("countyname","android"); 
     String request=new Gson().toJson(mUserInfo); 

     //Here the json data is add to a hash map with key data 
     Map<String,String> params = new HashMap<String, String>(); 
     params.put("data", request); 


     Call<UserInfoServerResponse> api = mService.getUserInfoRequest(params); 


     api.enqueue(new Callback<UserInfoServerResponse>() { 
      @Override 
      public void onResponse(Call<UserInfoServerResponse> responseCall, Response<UserInfoServerResponse> response) { 

       if (response.body().status != null) { 
        if (response.body().status.equals("success")) { 
         Log.d(TAG, "success---" + response.body()); 
        } 

       } else { 
        Log.d(TAG, "Failed---"); 

       } 


      } 

      @Override 
      public void onFailure(Call<UserInfoServerResponse> responseCall, Throwable t) { 
       t.printStackTrace(); 
      } 


     }); 

basilcally ce que j'ai utilisé est @FormUrlEncoded pour les données de formulaire et @FieldMap à mettre ma demande json comme valeur clé. Je suis la solution en suivant cette méthode, espérons que cela aidera quelqu'un :)

0

Les travaux de solution ci-dessus, mais est difficile à utiliser, une meilleure solution sera d'utiliser un convertisseur pour @Multipart formData

S'il vous plaît utiliser la Code beugler pour procéder à @Multipart FormData C'est parce que

"" is added to your posting strings

import java.io.IOException; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 

import okhttp3.MediaType; 
import okhttp3.RequestBody; 
import okhttp3.ResponseBody; 
import retrofit2.Converter; 
import retrofit2.Retrofit; 

/** 
* Created by kural on 10/27/17. 
*/ 

public class StringConverterFactory extends Converter.Factory { 
private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain"); 

public static StringConverterFactory create() { 
     return new StringConverterFactory(); 
     } 

@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; 

} 
} 

et dans votre client retrofit ajouter cette ligne

.addConverterFactory (StringConverterFactory.créer())

public class RetroFitClient { 
    private static Retrofit retrofit = null; 

    public static Retrofit getClient(String baseUrl) { 
     if (retrofit==null) { 
      HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
      interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
      OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build(); 

      /*retrofit = new Retrofit.Builder() 
        .baseUrl(baseUrl) 
        .client(client) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build();*/ 
      retrofit = new Retrofit.Builder() 
        .baseUrl(baseUrl) 
        .client(client) 
        .addConverterFactory(StringConverterFactory.create()) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 


     } 
     return retrofit; 
    }