2017-09-11 4 views
0

Je suis nouveau android et je ne sais pas comment POST en utilisant retrofitComment poster JSON en utilisant Retrofit 2 dans android?

J'ai mon propre serveur qui me renvoie des données, je dois chercher que l'on

Voici comment le corps URL ressemble enter image description here

Je dois envoyer le mot clé « nom de la ville » prise par edittext et passer à l'intérieur « ms_data de », par exemple mot-clé = « Inde »

C'est ce que je l'ai essayé jusqu'à présent ...

Rénovation classe Builder

public class RetrofitBuilder { 

public static Retrofit retrofit; 

public static final String BASE_URL = "my url"; 

public static Retrofit getApiData() 
{ 

    if(retrofit==null) 
    { 
     retrofit = new Retrofit.Builder().baseUrl(BASE_URL) 
        .addConverterFactory(GsonConverterFactory.create()).build(); 
    } 
    return retrofit; 
} 
} 

classe POJO

public class MessageFromServer { 

private String city_name; 

public MessageFromServer(String city_name) { 
      this.city_name = city_name; 
} 

public String getCity_name() { 
    return city_name; 
} 

public void setCity_name(String city_name) { 
    this.city_name = city_name; 
} 

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    MessageFromServer that = (MessageFromServer) o; 

    return city_name != null ? city_name.equals(that.city_name) : that.city_name == null; 

} 

@Override 
public int hashCode() { 
    return city_name != null ? city_name.hashCode() : 0; 
} 

@Override 
public String toString() { 
    return "MessageFromServer{" + 
      "city_name='" + city_name + '\'' + 
      '}'; 
} 
} 

classe RequestBean

public class JsonRequestBean { 

private String userId; 
private String sessionToken; 
private String clientType; 
private String msServiceType; 
private String msService; 
private String searchedLoc = null; 
private List<String> msdata = null; 




public List<String> getMsdata() { 
    return msdata; 
} 

public void setMsdata(List<String> msdata) { 
    this.msdata = msdata; 
} 


public JsonRequestBean() { 
} 

public JsonRequestBean(String userId, String sessionToken, String 
clientType, String msServiceType, String msService, String 
serachedLoc) { 
    this.userId = userId; 
    this.sessionToken = sessionToken; 
    this.clientType = clientType; 
    this.msServiceType = msServiceType; 
    this.msService = msService; 
    this.searchedLoc = serachedLoc; 
} 

public String getUserId() { 
    return userId; 
} 

public void setUserId(String userId) { 
    this.userId = userId; 
} 

public String getSessionToken() { 
    return sessionToken; 
} 

public void setSessionToken(String sessionToken) { 
    this.sessionToken = sessionToken; 
} 

public String getClientType() { 
    return clientType; 
} 

public void setClientType(String clientType) { 
    this.clientType = clientType; 
} 

public String getMsServiceType() { 
    return msServiceType; 
} 

public void setMsServiceType(String msServiceType) { 
    this.msServiceType = msServiceType; 
} 

public String getMsService() { 
    return msService; 
} 

public void setMsService(String msService) { 
    this.msService = msService; 
} 

public String getSerachedLoc() { 
    return searchedLoc; 
} 

public void setSerachedLoc(String serachedLoc) { 
    this.searchedLoc = serachedLoc; 
} 

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    JsonRequestBean that = (JsonRequestBean) o; 

    if (userId != null ? !userId.equals(that.userId) : that.userId != 
null) return false; 
    if (sessionToken != null ? !sessionToken.equals(that.sessionToken) 
: that.sessionToken != null) 
     return false; 
    if (clientType != null ? !clientType.equals(that.clientType) : 
that.clientType != null) 
     return false; 
    if (msServiceType != null ? 
!msServiceType.equals(that.msServiceType) : that.msServiceType != 
null) 
     return false; 
    if (msService != null ? !msService.equals(that.msService) : 
that.msService != null) 
     return false; 
    return searchedLoc != null ? searchedLoc.equals(that.searchedLoc) 
: that.searchedLoc == null; 

} 

@Override 
public int hashCode() { 
    int result = userId != null ? userId.hashCode() : 0; 
    result = 31 * result + (sessionToken != null ? 
sessionToken.hashCode() : 0); 
    result = 31 * result + (clientType != null ? clientType.hashCode() 
: 0); 
    result = 31 * result + (msServiceType != null ? 
msServiceType.hashCode() : 0); 
    result = 31 * result + (msService != null ? msService.hashCode() : 
0); 
    result = 31 * result + (searchedLoc != null ? 
searchedLoc.hashCode() : 0); 
    return result; 
} 

@Override 
public String toString() { 
    return "JsonRequestBean{" + 
      "userId='" + userId + '\'' + 
      ", sessionToken='" + sessionToken + '\'' + 
      ", clientType='" + clientType + '\'' + 
      ", msServiceType='" + msServiceType + '\'' + 
      ", msService='" + msService + '\'' + 
      ", serachedLoc=" + searchedLoc + 
      '}'; 
} 

private class Msdata { 

    public String keyword; 

    public void setKeyword(String keyword) { 
     this.keyword = keyword; 
    } 
} 
} 

classe ResponseBean // pour récupérer et stocker afin que je puisse utiliser cependant j'ai besoin

public class JsonResponseBean { 

@SerializedName("city_name") 
@Expose 
public String cityName; 
@SerializedName("id") 
@Expose 
public String id; 


public JsonResponseBean(String cityName, String id) { 
    this.cityName = cityName; 
    this.id = id; 
} 

public void setCityName(String cityName) { 
    this.cityName = cityName; 
} 

public String getCityName() { 
    return cityName; 
} 

public String getId() { 
    return id; 
} 

public JsonResponseBean() { 
} 

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (o == null || getClass() != o.getClass()) return false; 

    JsonResponseBean that = (JsonResponseBean) o; 

    if (cityName != null ? !cityName.equals(that.cityName) : 
that.cityName != null) 
     return false; 
    return id != null ? id.equals(that.id) : that.id == null; 

} 

@Override 
public int hashCode() { 
    int result = cityName != null ? cityName.hashCode() : 0; 
    result = 31 * result + (id != null ? id.hashCode() : 0); 
    return result; 
} 


@Override 
public String toString() { 
    return "JsonRequestBean{" + 
      "cityName='" + cityName + '\'' + 
      ", id='" + id + '\'' + 
      '}'; 
} 
} 

// classe interne, vous pouvez voir l'image // i en utilisant la génération de l'jsonschema2pojo.org

class errorCode 
{ 
    @SerializedName("data") 
    @Expose 
    public List<JsonResponseBean> data = null; 
    @SerializedName("error_code") 
    @Expose 
    public String errorCode; 
    @SerializedName("message") 
    @Expose 
    public String message; 
    @SerializedName("status") 
    @Expose 
    public String status; 

} 

API classe

public interface APIRequest { 

@Headers({"Content-Type: application/json","Accept: 
application/json"}) 
@POST("/lfs/city_name") 
Call<JsonResponseBean> locData (@Body JsonRequestBean mRequest); 
} 

DisplayActivity où je reçois les données réelles

// dès que je l'ouvre activty, onfailure sera appelé

public class DisplayActivity extends AppCompatActivity { 


public static TextView tvM,tvN; 
private Button btnFetch; 
private EditText etCity; 
private static final String TAG = "DisplayActivity"; 
private static final String VALUE = "displaytest"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_display); 

    init(); 

    Intent i = getIntent(); 
    String text = i.getStringExtra("HESRU"); 
    tvN.setText(text); 
    String city_name = etCity.getText().toString(); 
    final List<String> cityList = new ArrayList<>() ; 
    cityList.add(city_name); 
    Log.d(TAG, "onCreate: city name-"+city_name); 


    btnFetch.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Retrofit retrofit = RetrofitBuilder.getApiData(); 
      APIRequest service = retrofit.create(APIRequest.class); 

      JsonRequestBean jsonRequestBean = new JsonRequestBean(); 
      jsonRequestBean.setClientType("mobile"); 
      jsonRequestBean.setMsServiceType("search"); 
      jsonRequestBean.setMsService("locality"); 
      jsonRequestBean.setMsdata(cityList); 

      Call<JsonResponseBean> responseBeanCall = 
service.locData(jsonRequestBean); 
      responseBeanCall.enqueue(new Callback<JsonResponseBean>() 
{ 
       @Override 
       public void onResponse(Call<JsonResponseBean> call, 
Response<JsonResponseBean> response) { 
        Log.d(TAG, "onResponse: 
"+response.isSuccessful()); 
        Log.d(TAG, "onResponse:, responebody--- 
"+response.body()); 
       } 

       @Override 
       public void onFailure(Call<JsonResponseBean> call, 
Throwable t) { 
        Log.e(TAG, "onFailure: message"+t.getMessage()); 
        t.printStackTrace(); 
        Toast.makeText(DisplayActivity.this, "something 
went wrong", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    }); 


} 
public void init() { 
    tvM = (TextView) findViewById(R.id.textViewMSG); 
    tvN = (TextView) findViewById(R.id.txtViewName); 
    btnFetch = (Button) findViewById(R.id.buttonfetch); 
    etCity = (EditText) findViewById(R.id.etCity); 
} 

S'il vous plaît aider à résoudre ce problème, je trouve que je devrais utiliser HttpURLConnection, mais je ne sais pas comment faire.

+0

Pouvez-vous poster le message d'échec? –

+0

09-11 16: 40: 26.158 8720-8720/com.example.testdata E/DisplayActivity: onFailure: fin du flux message sur la connexion {url, proxy = DIRECT hostAddress =/url cipherSuite = aucun protocole = http/1.1} – Suhas

+0

Avez-vous besoin de logcat complet? Si oui, je ne sais pas comment publier ça! Je peux faire si vous me guidez – Suhas

Répondre

2

Procédez comme suit:

1.) Tout d'abord créer modal class (MyRequestClass) pour votre demande de poste de http://www.jsonschema2pojo.org/

2.) Créez également modal (MyResponseClass) pour votre réponse du serveur du même site.

3.Définissez les valeurs que vous souhaitez envoyer à votre serveur en créant l'objet MyRequestClass.

4.) puis appuyez sur api en utilisant cette méthode dans votre interface:

@POST("/provider/filter") 
Call<MyResponseClass> sendDataToServer(@Body MyRequestClass myModal); 
+0

Je l'ai fait en utilisant même, mais n'a pas pu obtenir les données – Suhas

+0

Etes-vous en train d'envoyer des valeurs dans l'entête? –

+0

Oui, j'ai aussi ajouté des en-têtes. k HttpUrlConnections devrait être utilisé mais je ne suis pas sûr – Suhas

0

supprimer /. de la méthode POST comme URL de base de retrofit se termine par /. de sorte que votre url est maintenant baseurl // LFS/CITY_NAME

@POST("lfs/city_name")<----- change 
Call<JsonResponseBean> locData (@Body JsonRequestBean mRequest); 

ajouter des en-têtes pour demander

public class RetrofitClient { 

    private static final String TAG = "RetrofitClient"; 

    public static Retrofit getClient() { 
     Retrofit retrofit = null; 
     HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); 
// set your desired log level 
     logging.setLevel(HttpLoggingInterceptor.Level.BODY); 



     OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
     httpClient.addInterceptor(logging); 
     httpClient.addInterceptor(new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws IOException { 
       Request original = chain.request(); 

       // Request customization: add request headers 
       Request.Builder requestBuilder = original.newBuilder() 
         .header("Licence", BuildConfig.Licence); // <-- this is the important line 

       Request request = requestBuilder.build(); 
       return chain.proceed(request); 
      } 
     }); 

     if (retrofit==null) { 
      Log.d(TAG, "getClient: base url "+ BuildConfig.base_url); 
      retrofit = new Retrofit.Builder() 
        .baseUrl(BuildConfig.base_url) 
        .client(httpClient.build()) 

        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 
     } 
     return retrofit; 
    } 

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

     if (retrofit==null) { 
      retrofit = new Retrofit.Builder() 
        .baseUrl(BuildConfig.admin_base_url) 
        .client(client) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 
     } 
     return retrofit; 
    } 
} 
+0

Je devrais ajouter les en-têtes savoir? et ça marche pour moi! – Suhas

+0

si votre API a besoin d'en-têtes oui vous devriez –

+0

si votre API n'a pas besoin d'en-tête essayez de l'envoyer en utilisant https://futurestud.io/tutorials/retrofit-send-data-form-urlencoded –

0

votre classe de réponse est erronée. il devrait être:

Response{ 
private Data[] data; 

public Data[] getData() 
{ 
    return data; 
} 

public void setData (Data[] data) 
{ 
    this.data = data; 
} 

@Override 
public String toString() 
{ 
    return "ClassPojo [data = "+data+"]"; 
} 

public class Data 
{ 
    private String id; 

private String city_name; 

public String getId() 
{ 
    return id; 
} 

public void setId (String id) 
{ 
    this.id = id; 
} 

public String getCity_name() 
{ 
    return city_name; 
} 

public void setCity_name (String city_name) 
{ 
    this.city_name = city_name; 
} 

@Override 
public String toString() 
{ 
    return "ClassPojo [id = "+id+", city_name = "+city_name+"]"; 
} 
} 
} 

appel retrofit:

@POST("/lfs/city_name") 
Call<Response> locData (@Body JsonRequestBean mRequest); 
} 

une valeur ajoutée à l'aide de mots clés méthode setter

+0

Ok je vais essayer et vous faire savoir – Suhas