2017-11-27 5 views
0

에서 POST 요청을 보내는 방법 call.enqueue() 메서드는 호출하지 않습니다. 왜 그런지 이해하지 못해요? 도와주세요.Retrofit 2 (Android)

POST 요청에 Retrofit2를 사용합니다. 이것은 나의 간단한 프로젝트 예제이다.

나는 API 서비스 FaceAPI 클래스를 가지고 있습니다. 코드 :

package com.facelocation.testretrofit; 

import okhttp3.ResponseBody; 
import retrofit2.Call; 
import retrofit2.http.Body; 
import retrofit2.http.POST; 


public interface FaceAPI { 

    @POST("api/auth/register") 
    Call<ResponseBody> registerUser(
      @Body RegistrationBody body 
    ); 
} 

은 내가 JSON 형식으로 서버에 (- 이메일과 비밀번호 두 개의 매개 변수 만 해당) 밀어 노력하고 있어요 RegistrationBody 클래스가 있습니다. 코드 :

package com.facelocation.testretrofit; 

public class RegistrationBody { 
    public String email; 
    public String password; 

    public RegistrationBody(String email, String password) { 
     this.email = email; 
     this.password = password; 
    } 
} 

그리고 나는 단 하나의 버튼으로 간단 MainActivity 클래스가 있습니다. 코드 :

package com.facelocation.testretrofit; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

import okhttp3.ResponseBody; 
import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 
import retrofit2.Retrofit; 
import retrofit2.converter.gson.GsonConverterFactory; 

public class MainActivity extends AppCompatActivity { 

    String TAG = "Reg"; 

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

     Button button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Retrofit retrofit = new Retrofit.Builder() 
         .baseUrl("https://face-location.com/") 
         .addConverterFactory(GsonConverterFactory.create()) 
         .build(); 

       FaceAPI api = retrofit.create(FaceAPI.class); 
       RegistrationBody reg = new RegistrationBody("[email protected]", "password12"); 

       Call<ResponseBody> call = api.registerUser(reg); 
       Log.i(TAG, "Works until here"); 

       call.enqueue(new Callback<ResponseBody>() { 
        @Override 
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
         Toast.makeText(MainActivity.this, "Все прошло хорошо",Toast.LENGTH_SHORT).show(); 
         Log.i(TAG, "THIS METHOD DOESN'T CALL! WHY?" + response.toString()); 

        } 

        @Override 
        public void onFailure(Call<ResponseBody> call, Throwable t) { 

        } 
       }); 
      } 
     }); 
    } 
} 

이 코드를 실행할 때 오류가 발생하지 않습니다. 그리고 나는 어떤 서버 응답도 얻지 못한다. 이 코드는 Log.i (TAG, "Works until here"); 그러나 다음 방법은, 나는 생각하지 않는다. 왜 내가 오류나 서버 응답을 얻지 못했는지 이해할 수 없다. 도와주세요!

+2

'onFailure'에 로그를 추가하십시오. –

+0

오, 너무 모욕적입니다! 예, 예외가 있습니다. SSLHandshakeException 증명서 패스의 트러스트 엥커가 발견되지 않습니다. (( – Nastromo

+0

@ Pavneet_Singh 맞습니다 인쇄 t.getMessage() 로그에서 당신의 ResponseBody 클래스에 문제가 있거나 다른 문제가있는 경우 당신이 대답을 얻을 것 같아요 –

답변

0

@ Murat Guc이 상세한 답변을 주셔서 감사합니다. 그러나 @Pavneet_Singh 및 @ Vívêk Båräì가 제안한대로 문제는 onFailure() 메소드에있었습니다. onFailure()에서 오류 메시지를 Log.i하는 것을 잊어 버렸습니다. 그래서 POST 요청은 내 모델에서 작동합니다.

+0

오 문제가 해결되면 확인 :) 행복 코딩 ! –

0

그래서 문제는 대부분 RegistrationBody()에 표시됩니다.

먼저 변화 문자열 당신의 당신은 그것을 만들기 위해 코드 아래 자유롭게 사용할 수 있습니다 RegistrationBody()

:

public static String modelAsString(Object obj) { 
     String value; 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 
      value = mapper.writeValueAsString(obj); 
     } catch (JsonProcessingException e) { 
      e.printStackTrace(); 
      return e.getMessage(); 
     } 
     return value; 
    } 

RegistrationBody reg = new RegistrationBody("[email protected]", "password12"); 
String modelAsString = modelAsString(req) 

모양을 어느 그리고 당신의 mediaType 매개을 추가 같은 활동에

그 아래처럼 requestModel을 한 후 11,

:

RequestBody requestBody = RequestBody.create(JSON, modelAsString); 

그나마 잊지! 이 요청 본문 okhttp3, 의 의미는 import okhttp3.RequestBody을 의미합니다.

결국 전화를 걸고;

Call<ResponseBody> call = api.registerUser(requestBody); 

작동하는지 알려주세요 !!

관련 문제