2016-11-09 56 views
0

我在我的应用程序中使用改进来发送POST请求,但参数正在发送两次,我找不到原因。改装2发送重复的参数

这是我的API:

public interface ChoferesApi { 
    @POST("myurl/") 
    Call<Chofer> registroChofer(@Body Chofer chofer); 
} 

我的POJO对象:

public class Chofer { 
    private String apellido; 
    private String nombre; 
    private String email; 
    private int dni; 
    private String sexo; 
    private Date fechaNacimiento; 
    private String password; 

    //Getters & Setters... 

}

请求:

Call<Chofer> call = RestClient.getInstance().registroChofer(chofer); 
call.enqueue(new Callback<Chofer>() { ... }); 

在logcat中我只看到参数一次(根据okhttp):

11-09 18:46:53.170 27197-27742/com.mypackage D/OkHttp: --> POST http://192.168.1.5:3000/myurl http/1.1 
    11-09 18:46:53.170 27197-27742/com.mypackage D/OkHttp: Content-Type: application/json; charset=UTF-8 
    11-09 18:46:53.170 27197-27742/com.mypackage D/OkHttp: Content-Length: 139 
    11-09 18:46:53.170 27197-27742/com.mypackage D/OkHttp: {"apellido":"aaa","sexo":"masculino","email":"[email protected]","fecha_nacimiento":"2016-10-09","nombre":"aaa","password":"effdggffy","dni":1234564} 
    11-09 18:46:53.170 27197-27742/com.mypackage D/OkHttp: --> END POST (139-byte body) 

但在我的服务器,以下参数接收:

Started POST "/myurl" for 192.168.1.13 at 2016-11-09 16:39:05 -0300 
Cannot render console from 192.168.1.13! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 
Processing by MyController#myaction as HTML 
Parameters: {"apellido"=>"gh", "sexo"=>"masculino", "email"=>"[email protected]", "fecha_nacimiento"=>"2016-10-09", "nombre"=>"ggg", "password"=>"[FILTERED]", "dni"=>54577457, "registro"=>{"apellido"=>"gh", "sexo"=>"masculino", "email"=>"[email protected]", "fecha_nacimiento"=>"2016-10-09", "nombre"=>"ggg", "password"=>"[FILTERED]", "dni"=>54577457}} 

可以看出,这些参数被发送两次,物体内第二次被称为“registro”我能不知道为什么。我尝试使用POSTMAN发送相同的请求,并且参数只发送一次,所以这不是服务器端问题。

回答

1

你把它作为@Body(和你的POJO大概解析成JSON)不@Query参数,所以也许这是一个问题?

+0

是的,我的POJO类正在被解析为JSON。我使用Body注解是因为我想以POST参数的形式发送数据。如果我使用查询注释,数据将作为URL中的查询参数发送,这不是主意。 – VorteXavier

+0

@VorteXavier好吧,我明白了。当你通过邮差发送邮件时,你也可以将它作为JSON发送或作为表单参数发送? –

+0

是的,我将它们视为表单参数。我会尽力将它作为Json明天发送。 – VorteXavier

0

所以我想通了。最后,这是一个与改造无关的服务器端问题。在服务器中,我使用的是Ruby on Rails 4,并且在发送的POST请求中,参数被封装为Json(这是使用@ Body注释时所做的改进)。

问题是Rails控制器会自动包装与控制器名称相同的所有参数(在我的情况下为'registro')。这只发生在参数以Json形式发送时,这就是为什么通过POSTman发送的请求没有这个问题。

这里是一个岗位#1给出关于这个问题的进一步的解释: Rails 3 params unwanted wrapping

结论:这个问题要改造,也okhttp是不相关;这是我的服务器中的特定行为。