2017-11-20 5 views
0

Android에서 네트워킹을 위해 Retrofit을 처음 사용했습니다. 지금까지 필자는 String을 PHP 서버에 보내는 코드를 작성했습니다. 서버가 시스템 ID와 암호 ("systemid = id & password = password")가 포함 된 문자열을 가져 오도록 구성되었습니다. 이 같은 String을 통해 매개 변수를 추가하는 것이 이상하게 보일 수 있지만이 방법은이 프로젝트에 대해 수행해야합니다. 어쨌든 서버로 보내지는 ID와 비밀번호가 특정 기준과 일치하면 서버는 파일 위치 목록을 다시 보냅니다. 지금까지 서버에서 적절한 응답을 받았습니다. 즉, 'response.getMessage()'는 'OK'를 반환합니다. 그러나 서버가 다시 보내려고하는 목록은 어떻게 얻을 수 있습니까? 지금까지 구현 한 내용이 있습니다.개조를 사용하여 서버에서 목록 가져 오기

인터페이스 :

여기
public interface ExampleClient { 

    @POST("login/fake_name.php") 
    Call<String> sendStringToServer(@Body String string); 

} 

활동에서 내 코드입니다 : 나는 완전히 다른 구현을 필요

private void sendRequestToServer(String str) { 
     Retrofit.Builder builder = new Retrofit.Builder() 
       .baseUrl("http://www.example.com/") 
       .addConverterFactory(GsonConverterFactory.create()); 

     Retrofit retrofit = builder.build(); 

     PromoterKiosksClient client = retrofit.create(ExampleClient.class); 
     Call<List<String>> call = client.sendStringToServer(str); 
     call.enqueue(new Callback<Void>() { 
      @Override 
      public void onResponse(Call<String> call, Response<String> response) { 
       Log.d(TAG, response.toString()); 
       Log.d(TAG, response.message()); 

      } 

      @Override 
      public void onFailure(Call<String> call, Throwable t) { 
       Toast.makeText(AdminActivity.this, "you suck! keep trying", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

내가이 작업을 수행하거나 수행 할 수 onResponse() 어딘가에 거기가? 미리 감사드립니다.

+1

보고 – Selvin

답변

1

response.body()을 찾고 계십니까? 서버에서 JSON 응답을 받습니까? 그렇다면 POJO을 사용하여 응답을 변환 할 수 있습니다. 여기에 귀하의 답변을 공유 할 수 있습니까? POJO를 사용하여 결과를 변환하고 Result.java로 이름을 지정하고 반환 유형으로 설정할 수 있습니다.

private void sendRequestToServer(String str) { 
     Retrofit.Builder builder = new Retrofit.Builder() 
       .baseUrl("http://www.example.com/") 
       .addConverterFactory(GsonConverterFactory.create()); 

     Retrofit retrofit = builder.build(); 

     PromoterKiosksClient client = retrofit.create(ExampleClient.class); 
     Call<Result> call = client.sendStringToServer(str); 
     call.enqueue(new Callback<Void>() { 
      @Override 
      public void onResponse(Call<Result> call, Response<Result> response) { 
       Log.d(TAG, response.toString()); 
       Log.d(TAG, response.message()); 
       response.body(); // have your all data 


      } 

      @Override 
      public void onFailure(Call<Result> call, Throwable t) { 
       Toast.makeText(AdminActivity.this, "you suck! keep trying", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

Call<User>Call<ResponseBody>Call<Void>

대부분의 엔드 포인트는 전화와 같은 특정 반환 유형으로 선언됩니다. 이 경우 Retrofit은 항상 응답 본문을 가져 와서 Java 객체로 변환하려고합니다. 물론 이것은 시간, 메모리 및 처리 능력이 필요합니다.

매핑 된 Java 개체없이 살 수 있다면 호출을 선택해야합니다. 이렇게하면 원시 응답 페이로드가 사용 가능하지만 Java 오브젝트에 대한 맵 핑은 생략됩니다. 이 옵션을 사용하면 여전히 페이로드 (예 : JSON)를 분석 할 수 있습니다.

가장 효율적인 방법은 Java 객체로 변환을 건너 뛰는 것뿐만 아니라 응답 본문 페이로드도 무시하기 때문에 호출입니다. 응답 본문이 매우 큰 경우 (예 : 큰 JSON 또는 이미지) 호출을 사용하여 약간의 추가 시간과 배터리 소모를 줄일 수 있습니다. 물론 응답 객체의 body() 메서드가 null을 반환합니다.

좋은 예를 들어 당신이 어떤 반응에 관심이 있다면 확실히 당신은`Void` 사용을 중지해야 Consuming an API with retrofit and RXJava