【问题标题】:How to get the response body text如何获取响应正文
【发布时间】:2018-01-22 09:37:08
【问题描述】:

我正在创建一个注册应用程序,除了一个问题之外,几乎所有的工作都可以。 好的,现在我将向您展示代码。有点长。

public interface SupportopApi {

@POST("/api/registration")
Call<ResponseBody> registration (@Body SupportopObj supportopObj);}

这是界面。 现在我将向您展示由 JsonPoJo 解析的模型。

public class SupportopObj {

@SerializedName("username")
@Expose
private String username;
@SerializedName("password")
@Expose
private String password;
@SerializedName("email")
@Expose
private String email;
@SerializedName("firstName")
@Expose
private String firstName;
@SerializedName("lastName")
@Expose
private String lastName;

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}}

好的,这是模型,我是在片段中做的,所以这里是 MainActivity

public class MainActivity extends AppCompatActivity {

FrameLayout cont;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ApiClient.initializeInstance("https://supportop.eu-gb.mybluemix.net/");

    cont = findViewById(R.id.container);

    getSupportFragmentManager().beginTransaction()
            .add(R.id.container, new FragmentActivity()).commit();
}}

这是改造类,我在其中初始化改造。

public class ApiClient {

private static ApiClient instance;

private SupportopApi supportopApi;


private ApiClient(String endpoint) {

    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
            .readTimeout(10, TimeUnit.SECONDS)
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS);

    clientBuilder.addInterceptor(chain -> {
        Request request = chain.request();
        request = request.newBuilder()
                .addHeader("Content-Type", "application/json")
                .build();
        return chain.proceed(request);
    });

    supportopApi = new Retrofit.Builder()
            .baseUrl(endpoint)
            .client(clientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(SupportopApi.class);
}


public static synchronized void initializeInstance(String endpoint) {
    if (instance == null) {
        instance = new ApiClient(endpoint);
    }
}


public static synchronized ApiClient getInstance() {
    if (instance == null) {
        throw new IllegalStateException("PentairAPIClient has not been initialized.");
    }
    return instance;
}


public Call<ResponseBody> registration(SupportopObj supportopObj) {
    return supportopApi.registration(supportopObj);
}
}}

这是主要的片段类。

public class FragmentRegistration extends Fragment {
View mainView;

EditText username, email, password, name;
Button button;

ApiClient pentairAPIClient = ApiClient.getInstance();

SupportopObj supportopObj = new SupportopObj();

@Override
public View onCreateView(LayoutInflater inflater,
                         @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mainView = getLayoutInflater().inflate(R.layout.registration, container, false);

    username = mainView.findViewById(R.id.username);
    email = mainView.findViewById(R.id.email);
    password = mainView.findViewById(R.id.password);
    name = mainView.findViewById(R.id.name);
    button = mainView.findViewById(R.id.register);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            supportopObj.setUsername(username.getText().toString());
            supportopObj.setEmail(email.getText().toString());
            supportopObj.setPassword(password.getText().toString());

            updateApp();
        }
    });

    return mainView;
}

public void updateApp() {
    FragmentRegistration context = this;

    Call<ResponseBody> call = pentairAPIClient.registration(supportopObj);
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                Toast.makeText(getContext(), String.valueOf(response.body()),
                        Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getContext(), "Something went wrong",
                        Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(getContext(), "Error...", Toast.LENGTH_SHORT).show();
        }
    });
}
}}

好的,让我解释一下我的问题。当我点击注册时,我必须从response.body 收到一条消息,上面说注册成功。首先,我尝试将呼叫注册无效,例如Call&lt;Void&gt; registration,但这会返回response.body null。

现在,当我在调用正文 Call&lt;ResponseBody&gt; registration 时,他会返回 OkHttp3:{ResponseBody$1@830038646440} 这样的东西。 当我在正文中进行调试时,有一个内容,看起来像这样

 content = {Buffer@830038501160} "[text="Registration Successfully completed"]" 

这是图片。我该如何解决这个问题,我想成功完成文本注册。

【问题讨论】:

  • 我会阅读 ResponseBody 文档并选择正确的方法

标签: java android retrofit response


【解决方案1】:

试试这个代码

使用 body() 方法从您的 api 获取响应并转换为字符串

"body()" 是成功响应的反序列化响应正文,并且 字符串类似于“toString()”

public interface RetrofitService{
        @GET("/api/registration")
        Call<ResponseBody> registration(paramshere);//function to call api
    }

    RetrofitService service = retrofit.create(RetrofitService.class);
    Call<ResponseBody> result = service.registration(params);
    result.enqueue(new Callback<ResponseBody>() {

    @Override
    public void onResponse(Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());//convert reponse to string
            Snackbar snackbar = Snackbar
        .make( cont , "Registered successfully",Snackbar.LENGTH_LONG);//pass your activity view as first param
            snackbar.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Throwable t) {
        e.printStackTrace();
    }
});

【讨论】:

  • 是的,这有帮助,但我该怎么做,他打印了“注册成功”而没有这个“”。
  • 您可以使用小吃店显示消息,已更新代码
【解决方案2】:

将 response.body 转换为 jsonArray:

JSONArray jsonArray = new JSONArray(response.body());
String responseText = jsonArray.getJSONObject(i).getString("text");

您将收到“注册成功完成”作为 responseText。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2021-10-07
    • 2018-11-06
    • 2018-01-30
    • 2021-02-02
    • 2015-11-14
    相关资源
    最近更新 更多