使用API​​进行改造

时间:2015-05-05 21:09:04

标签: android rest retrofit

我刚开始使用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

2 个答案:

答案 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的一个很好的示例:

Android-Retrofit-Example