我刚开始使用Retrofit
来使用API。我能够成功更新用户的个人资料,但我无法将信息传递给用户对象:
Interface
RetrofitService:
public interface RetrofitService {
@FormUrlEncoded
@POST("/profile/update")
public void updateUser(
@Field("user_id") String userId,
@Field("user_token") String userToken,
@Field("first_name") String firstName,
@Field("last_name") String lastName,
Callback<JSONObject> callback);
}
Activity
ProfileUpdate:
updateProfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Build RestAdapter
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://xxx.xxx.xxx.xxx/")
.build();
//Create API service
RetrofitService service = restAdapter.create(RetrofitService.class);
//Invoke method
service.updateUser(
user.getUserId(),
user.getUserToken(),
mFirstName.getText().toString(),
mLastName.getText().toString(),
new Callback<JSONObject>() {
@Override
// user remains null!
public void success(JSONObject jsonObject, Response response) {
Toast.makeText(ProfileMe.this, "Profile Updated", Toast.LENGTH_SHORT).show();
Log.d("succes", "Success!");
}
@Override
public void failure(RetrofitError error) {
Log.d("failure", "Failed");
}
});
}
});
以上代码有效,用户的个人资料也会更新。但是JSONObject
中的onSuccess
仍然为空。
到目前为止我一直在使用Gson
,我会这样做:
//update user with new information
User user = gson.fromJson(responseData,User.class);
如何使用Retrofit
?
修改
来自服务器的响应返回JSONObject
。我更改了上面的代码以满足这些要求,但我仍然返回null JSONObject
答案 0 :(得分:0)
更改为:
public interface RetrofitService {
@FormUrlEncoded
@POST("/profile/update")
public void updateUser(
@Field("user_id") String userId,
@Field("user_token") String userToken,
@Field("first_name") String firstName,
@Field("last_name") String lastName,
Callback<User> callback);
}
您需要在回调中设置您希望在响应中收到的内容。如果WS返回User对象,则需要在回调中设置该对象
答案 1 :(得分:0)
确保你的休息有一个Object作为返回(Json格式化程序)。
您需要将代码更改为:
import mock
def now():
print "Hello World!"
class Sim:
# Your code from above here
def myfunc():
now()
myfunc() # Outputs Hello World!
s = Sim(myfunc, "Hello Locals #1")
mock.patch('__main__.now', wraps=s.now).start()
myfunc() # Now outputs Hello Locals #1
Retrofit默认使用Gson将HTTP主体转换为JSON和从JSON转换。 如果要指定与Gson默认值不同的行为 (例如命名策略,日期格式,自定义类型),提供新的Gson 构建RestAdapter时具有所需行为的实例。参考 有关自定义的详细信息,请参阅Gson文档。
<强>被修改强>
如果您的服务器返回如下内容:
public interface RetrofitService {
@FormUrlEncoded
@POST("/profile/update")
public void updateUser(
@Field("user_id") String userId,
@Field("user_token") String userToken,
@Field("first_name") String firstName,
@Field("last_name") String lastName,
Callback<User> callback);
}
在您的Android客户端上,您还需要具有类似的功能
{
"user_id": "21q3123"
"user_token":"asd2334rter"
"first_name" : "User Test"
"last_name" : "user last name"
}
默认情况下进行改造使用Gson解析所有请求。
请在此处查看Paser.com和Retrofit的一个很好的示例: