2017-04-06 33 views
0

這裏不同接口的型號是我的API終點:使用改造後,在回調和身體

http://192.168.1.22:8000/api/auth/login 

我需要POSTemailpassword從服務器接收Token

Server後響應:

{ 
    "status": "ok", 
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjIsImlzcyI6Imh0dHA6XC9cL21vbmV5bWF0Y2guYXBwOjgwMDBcL2FwaVwvYXV0aFwvbG9naW4iLCJpYXQiOjE0OTE0OTYzNDEsImV4cCI6MTQ5MTQ5OTk0MSwibmJmIjoxNDkxNDk2MzQxLCJqdGkiOiJhZmJhMDEzMzI5OWIwZmY0MzY3MTdlZDE4NmVkODI4OSJ9.bGlInsHHjdveeabz0j_36yICZtK32q1B9oNW44dk_x4" 
} 

這是我的服務Retrofit 2

public interface ApiInterface { 
    @POST("auth/login") 
    Call<Login> authenticate(@Body User user); 
} 

這裏是我的Login Model

public class Login { 

    @SerializedName("status") 
    @Expose 
    private String status; 
    @SerializedName("token") 
    @Expose 
    private String token; 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public String getToken() { 
     return token; 
    } 

    public void setToken(String token) { 
     this.token = token; 
    } 
} 

這裏是我的User Model

public class User { 
@SerializedName("email") 
@Expose 
private String email; 

@SerializedName("password") 
@Expose 
private String password; 

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

,這是我怎麼稱呼它在活動

public void sendNetworkRequest(User user){ 
    Log.d(TAG,"send request fired"); 
    Retrofit.Builder builder = new Retrofit.Builder() 
      .baseUrl("http://192.168.1.22:8000/api/") 
      .addConverterFactory(GsonConverterFactory.create()); 
    Retrofit retrofit = builder.build(); 
    ApiInterface apiInterface = retrofit.create(ApiInterface.class); 
    Call<Login> call = apiInterface.authenticate(user); 

    call.enqueue(new Callback<Login>() { 
     @Override 
     public void onResponse(Call<Login> call, Response<Login> response) { 
      Toast.makeText(LoginActivity.this, "wuhuuu"+ response.body().getToken(), Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onFailure(Call<Login> call, Throwable t) { 
      Log.d(TAG,"went wrong"); 
      Toast.makeText(LoginActivity.this, "something went wront"+t.toString(), Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 

更新:這是錯誤我得到:

com.google.gson.stream.malformedjsonexception use jsonreader.setlenient(true) to accept malformed at line 1column 1 $path 

更新注意:在emailpassword需要在身體form data發送。

注意:我可以從Emulator中的瀏覽器訪問API,所以我想這意味着我的邏輯或方法有問題。

完整堆棧跟蹤:

D/LoginActivity: went wrong 
     com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ 
      at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1567) 
      at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1416) 
      at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:597) 
      at com.google.gson.stream.JsonReader.peek(JsonReader.java:429) 
      at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:201) 
      at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37) 
      at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25) 
      at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116) 
      at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211) 
      at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106) 
      at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133) 
      at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
      at java.lang.Thread.run(Thread.java:818) 
+1

'.baseUrl(「HTTP:/ /129.168.1.22:8000/api /「)'你是否在url中發現錯誤? –

+0

您的基本網址是'http://129.168.1.22:8000/api /'。但是錯誤顯示'192.168.1.22'。這有點不對嗎? –

+0

@ArkarAung謝謝我更新了錯誤 – Poorya

回答

1

要使用改造2.0發送形式的數據

@Multipart 
@POST("url") 
Call<PlanResponse> authenticate(@Part("email") RequestBody eamilValue, @Part("password") RequestBody passwordValue); 

使用這樣的:

String email = "[email protected]"; 
String password = "password"; 
RequestBody emailValue = RequestBody.create(MediaType.parse("text/plain"), emailValue); 
RequestBody passwordValue= RequestBody.create(MediaType.parse("text/plain"), passwordValue); 
Call<Login> call = apiInterface.authenticate(emailValue,passwordValue);