2017-12-02 16 views
0

私はhapiサーバーに接続するために私のhttprequestとしてretrofitを使ってアンドロイドアプリを構築しています。私のサーバーは正常に動作しています。私は郵便配達員と私のWebアプリケーションでテストしました。しかし私の改造はそれに接続することはできません。以下は私のコードです。Retrofitがhapi server localhostに接続できませんか?

LoginActivity.java

package com.sianghee.reviu; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.support.design.widget.TextInputEditText; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

import android.content.Intent; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import butterknife.ButterKnife; 
import butterknife.BindView; 
import butterknife.OnClick; 

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

import com.sianghee.reviu.interfaces.APIService; 
import com.sianghee.reviu.lib.Session; 
import com.sianghee.reviu.models.UserLogin; 
import static com.sianghee.reviu.lib.Helper.returnError; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.IOException; 

public class LoginActivity extends Activity { 
    private static final String TAG = "LoginActivity"; 
    private static final int REQUEST_SIGNUP = 0; 
    Session session; 
    public static final String BASE_URL = "localhost:3000"; 

    private EditText emailText; 
    private EditText passwordText; 

    @BindView(R.id.btn_login) Button _loginButton; 
    @BindView(R.id.link_signup) TextView _signupLink; 

    // TODO: Init sewaktu pertama kali form diload 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
     ButterKnife.bind(this); 

     emailText = (EditText)findViewById(R.id.input_email); 
     passwordText = (EditText)findViewById(R.id.input_password); 

    } 

    // TODO: bind login and do login 
    @OnClick(R.id.btn_login) 
    public void submitLogin() { 
     login(); 
    } 

    // TODO: bind signup and do register 
    .... 

    public void login() { 
     Log.d(TAG, "Login"); 

     if (!validate()) { 
      onLoginFailed(); 
      return; 
     } 

     _loginButton.setEnabled(false); 

     final ProgressDialog progressDialog = new ProgressDialog(this); 
     progressDialog.setIndeterminate(true); 
     progressDialog.setMessage("Authenticating..."); 
     progressDialog.show(); 

     String email = emailText.getText().toString(); 
     String password = passwordText.getText().toString(); 

     // TODO: Implement your own authentication logic here. 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     APIService api = retrofit.create(APIService.class); 
     UserLogin userLogin = new UserLogin(email, password); 

     Call<UserLogin> call = api.login(userLogin); 
     call.enqueue(new Callback<UserLogin>() { 
      @Override 
      public void onResponse(Call<UserLogin> call, Response<UserLogin> response) { 
       String result; 
       progressDialog.dismiss(); 
       try { 
        result = response.body().toString(); 

        if (returnError(result).isEmpty()) { 

         JSONObject obj; 
         obj = new JSONObject(result); 
         session.setLoginSession(obj.getString("scope"), obj.getString("token")); 

         Intent i = new Intent(LoginActivity.this, MainActivity.class); 
         i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(i); 
         finish(); 

        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 

      ....... 
} 

APIService.java

package com.sianghee.reviu.interfaces; 

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

import com.sianghee.reviu.models.UserLogin; 

/** 
* Created by andy on 11/26/17. 
*/ 

public interface APIService { 
    @POST("auth") 
    Call<UserLogin> login(@Body UserLogin auth); 
} 

UserLogin.java

package com.sianghee.reviu.models; 

public class UserLogin { 
    String email; 
    String password; 

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

たびI:私は必要ない行を削除読み込むための簡略化のためにログインボタンをクリックしました。サーバーに接続できませんでした。ログインの

12-02 23:24:42.771 3660-3660/com.sianghee.reviu I/InstantRun: starting instant run server: is main process 
12-02 23:24:43.116 3660-3690/com.sianghee.reviu D/OpenGLRenderer: HWUI GL Pipeline 
12-02 23:24:43.213 3660-3660/com.sianghee.reviu I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead. 
12-02 23:24:43.219 3660-3660/com.sianghee.reviu I/TextInputLayout: EditText added is not a TextInputEditText. Please switch to using that class instead. 

                    [ 12-02 23:24:43.283 3660: 3690 D/   ] 
                    HostConnection::get() New Host Connection established 0x896438c0, tid 3690 
12-02 23:24:43.471 3660-3690/com.sianghee.reviu I/zygote: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0 
12-02 23:24:43.471 3660-3690/com.sianghee.reviu I/OpenGLRenderer: Initialized EGL, version 1.4 
12-02 23:24:43.471 3660-3690/com.sianghee.reviu D/OpenGLRenderer: Swap behavior 1 
12-02 23:24:43.471 3660-3690/com.sianghee.reviu W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 
12-02 23:24:43.471 3660-3690/com.sianghee.reviu D/OpenGLRenderer: Swap behavior 0 
12-02 23:24:43.473 3660-3690/com.sianghee.reviu D/EGL_emulation: eglCreateContext: 0x9b543860: maj 2 min 0 rcv 2 
12-02 23:24:43.475 3660-3690/com.sianghee.reviu D/EGL_emulation: eglMakeCurrent: 0x9b543860: ver 2 0 (tinfo 0xa4a8f700) 
12-02 23:24:43.527 3660-3690/com.sianghee.reviu D/EGL_emulation: eglMakeCurrent: 0x9b543860: ver 2 0 (tinfo 0xa4a8f700) 
12-02 23:24:43.856 3660-3660/com.sianghee.reviu I/AssistStructure: Flattened final assist data: 1684 bytes, containing 1 windows, 5 views 
12-02 23:24:49.113 3660-3673/com.sianghee.reviu I/zygote: Do partial code cache collection, code=30KB, data=26KB 
12-02 23:24:49.113 3660-3673/com.sianghee.reviu I/zygote: After code cache collection, code=30KB, data=26KB 
12-02 23:24:49.113 3660-3673/com.sianghee.reviu I/zygote: Increasing code cache capacity to 128KB 
12-02 23:24:51.355 3660-3673/com.sianghee.reviu I/zygote: Do partial code cache collection, code=61KB, data=59KB 
12-02 23:24:51.356 3660-3673/com.sianghee.reviu I/zygote: After code cache collection, code=61KB, data=59KB 
12-02 23:24:51.356 3660-3673/com.sianghee.reviu I/zygote: Increasing code cache capacity to 256KB 
12-02 23:24:54.016 3660-3673/com.sianghee.reviu I/zygote: Do full code cache collection, code=123KB, data=99KB 
12-02 23:24:54.016 3660-3673/com.sianghee.reviu I/zygote: After code cache collection, code=107KB, data=66KB 
12-02 23:24:56.503 3660-3660/com.sianghee.reviu D/LoginActivity: Login 
12-02 23:24:56.573 3660-3673/com.sianghee.reviu I/zygote: Do partial code cache collection, code=114KB, data=93KB 
12-02 23:24:56.573 3660-3673/com.sianghee.reviu I/zygote: After code cache collection, code=114KB, data=93KB 
12-02 23:24:56.573 3660-3673/com.sianghee.reviu I/zygote: Increasing code cache capacity to 512KB 
12-02 23:24:56.574 3660-3673/com.sianghee.reviu I/zygote: JIT allocated 56KB for compiled code of void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int) 
12-02 23:24:56.603 3660-3660/com.sianghee.reviu D/NetworkSecurityConfig: No Network Security Config specified, using platform default 
12-02 23:24:56.803 3660-3660/com.sianghee.reviu W/error: java.net.ConnectException: Failed to connect to /127.0.0.1:3000 
12-02 23:24:57.094 3660-3690/com.sianghee.reviu D/EGL_emulation: eglMakeCurrent: 0x9b543860: ver 2 0 (tinfo 0xa4a8f700) 
12-02 23:24:57.126 3660-3690/com.sianghee.reviu D/EGL_emulation: eglMakeCurrent: 0x9b543860: ver 2 0 (tinfo 0xa4a8f700) 

私のサーバーAPIのURLは次のとおりです:http://127.0.0.1:3000/auth

予告言う前に、私のLog.w()方法から、そのエラー:

java.net.ConnectException以下logcatは、次のとおりです。 /127.0.0.1:3000に接続できませんでした

これはおそらく私のよくある間違い、助けてください。

+0

、どのように行うなどあなたはアンドロイドデバイスからそれに到達しますか? –

答えて

0

127.0.0.1は、(サーバーがホストされている)マシンのローカルホスト/ループバックアドレスです。 127.0.0.1はマシンのIPアドレスにマップされているため、http://127.0.0.1:3000/authにはマシンからのみアクセスできます。

他のマシン(この場合は携帯電話)からhttp://127.0.0.1:3000/authにアクセスするには、マシン(サーバー)とデバイス(電話)が同じネットワーク上にある必要がありますhttp://IPAddressOfYourMachine:3000/authでアクセスしてください。

MacOS/Linuxでは、端末上でifconfigコマンドを使用してIPアドレスを見つけることができます。 Windowsマシンでは、コマンドはipconfigです。 IPアドレスの形式は192.168.x.yでなければなりません。

だから、最終BASE_URLはhttp://192.168.x.y:3000

+0

'127.0.0.1はあなたのマシンのローカルホスト/ループバックアドレスです(サーバーがホストされています)。 'いいえ127.0.0.1は、Androidデバイス自体のIPアドレスです。すべてのデバイスは独自のローカルホストです。 – greenapps

+0

よくある間違いですが、自分のマシン上でエミュレータからアンドロイドを試しているので、サーバを127.0.0.1にする必要がありました。私はそれを私のマシンIPに変更しました。完璧に動作します。ありがとう、ありがとう。 – kola

+0

@greenappsはい、すべてのデバイスは独自のローカルホストです。 127.0.0。1は、マシンまたはAndroidデバイスのIPアドレスです。質問によれば、127.0.0.1がサーバー(それをホストしているマシン)を参照するために使用されていたことは、私にはもっと意味がありました。 –

0

レトロフィットのようなものは、どんな問題がない持っていなければなりません。問題は、アンドロイド端末からサーバーに到達するためのBASE_URLにあります。

サーバーがインストールされているコンピュータのローカルIPアドレスを確認してください(例:192.168.1.103)を、その後でBASE_URLを交換することをあなたのサーバがローカルホスト上にある場合たとえば、次の

public static final String BASE_URL = "http://192.168.1.103:3000"; 
関連する問題