2016-03-31 81 views
1

我一直在试图通过使用Retrofit 2.0进行POST请求,但我遇到了一些问题。我很乐意提供任何帮助。 我有这样的接口:POST请求改进2.0

public interface HZApi { 
@POST("URL") 
Call<RespBody> register(@Body ReqBody request); 
} 

这是我的请求和响应类:

public class ReqBody { 

@SerializedName("login") 
String login; 
@SerializedName("password") 
String password; 

public ReqBody(String login, String password){ 
    this.login = login; 
    this.password = password; 
    } 

} 

public class RespBody { 

@SerializedName("login") 
String login; 
@SerializedName("password") 
String password; 
@SerializedName("isreg") 
int isreg; 

} 

和我的活动代码的一部分:

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://URL/") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
     HZApi api = retrofit.create(HZApi.class); 

     ReqBody req = new ReqBody(login,password); 
     Call<RespBody> call = api.register(req); 
     call.enqueue(new Callback<RespBody>() { 
      @Override 
      public void onResponse(Call<RespBody> call, Response<RespBody> response) { 
        Toast.makeText(getApplicationContext(),"OK",Toast.LENGTH_SHORT).show(); 
        //answer.setText(response.body().toString()); 
       } 

       @Override 
       public void onFailure(Call<RespBody> call, Throwable t) { 
        Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show(); 
        Log.d("MyTag",call.toString(),t); 
       } 
      }); 

,当我尝试提出要求,JSON抛出: 预期的BEGIN_OBJECT,但BEGIN_ARRAY在第1行第2列路径$

我试图做一个没有特殊类的请求,只是使用一个String参数,但它也不起作用。感谢您的答复。

回答

2

您向服务器发送请求的方式是正确的。 你确定服务器返回带有简单值的JSON对象吗?看起来它会返回JSON数组,因此,您会收到此错误Expected BEGIN_OBJECT but was BEGIN_ARRAY。如果服务器返回JSON数组,则需要相应地更改RespBody类。

+0

Ruslan是正确的,你需要检查你的服务器返回的是什么JSON,并根据该 –

+0

@RustemMuzafarov尝试启用日志并检查实际上是否发送到服务器进行RespBody。要启用日志记录,请阅读这个简单的[说明](https://futurestud.io/blog/retrofit-2-log-requests-and-responses)。如果数据实际上被发送到服务器,这将意味着服务器端的问题。你的请求声明对我来说看起来不错。 – Ruslan

+0

Ruslan谢谢你的帮助。我找到了一个解决方案 - 我只需要在我的请求中使用@FormUrlEncoded注释。 –