2017-11-27 20 views
0

メソッドcall.enqueue()は呼び出しません。そして私はなぜそれを理解することをあきらめますか?助けてください。Retrofit 2(Android)でPOSTリクエストを送信する方法

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形式(2つのパラメータのみ - メールアドレスとパスワード)で、サーバー上のプッシュしようとしている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は正しいですか?Logでprint t.getMessage()を試してみてください。あなたのResponseBodyクラスに問題があるか、他の問題がある場合は、答えが得られるでしょう。 –

答えて

0

@Murat Gucこの詳細な回答ありがとうございますが、@Pavneet_Singhと@VívêkBåräìが提案したように、問題はonFailure()メソッドにありました。私はonFailure()のエラーメッセージをLog.iに忘れてしまった。したがって、POSTリクエストは私のモデルで動作します。

+0

問題が解決すればOKです。 ! –

0

だから問題はほとんどあなたのRegistrationBody()のようです。

あなたはそれを作るために、コードの下に自由に使用することが文字列あなたRegistrationBody()

への最初の変更:

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

ように見えるそして、ちょうどあなたのMEDIATYPEが追加されます

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

に活動のように

0123その後

は、以下のようなあなたのREQUESTMODELします

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

いけない忘れて!このリクエストの本文okhttp3、 の意味はimport okhttp3.RequestBodyです。

あなたの電話は、

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

私はそれが動作するかどうか教えてください!!!!

関連する問題