【问题标题】:how to pass header in retrofit 1.9 API如何在改造 1.9 API 中传递标头
【发布时间】:2017-11-26 20:42:27
【问题描述】:

要求->

使用 GET 请求获取对象列表:

传递请求标头:

X-ACCESS-TOKEN = 成功登录后收到的令牌

X-USER-EMAIL = 登录时使用的电子邮件。

我正在使用此代码登录->

private void normalLoginToServer() {
    final ProgressDialog progressDialog = GeneralUtil.createProgressDialog(this, "Logging into app..");
    progressDialog.show();

Instead of using JSONObject, i need to pass Request Headers.
in a below Astrike code. how to pass Headers.? please help me.

    ***JSONObject outer_body = new JSONObject();
    JSONObject body = new JSONObject();
    try {
        body.put(Constants.USER_EMAIL, _emailText.getText().toString().trim());
        body.put(Constants.USER_PWD, _passwordText.getText().toString().trim());

        outer_body.put(Constants.USER, body);***

        try {
            TypedInput typedInput = new TypedByteArray("text/plain", outer_body.toString().getBytes("UTF-8"));

            apiService.loginToServer(typedInput, new Callback<UserInfo>() {
                @Override
                public void success(UserInfo response, Response response2) {
                    int status = response2.getStatus();
                    switch (status) {
                        case 200:
                            if (progressDialog.isShowing())
                                progressDialog.dismiss();
                            if (response == null)
                                return;
                            String status1 = response.getStatus();
                            if (status1.equalsIgnoreCase("success")) {
                                Toast.makeText(context, "Successful login", Toast.LENGTH_SHORT).show();
                                Data data = response.getData();
                                User user = data.getUser();
                                String token = user.getAccess_token();

                                Intent intent = new Intent(context, MainActivity.class);
                                intent.putExtra(Constants.ACCESS_TOKEN, token);
                                startActivity(intent);
                                finish();
                            } else if (status1.contains("failure")) {
                                Toast.makeText(context, "Username not found", Toast.LENGTH_SHORT).show();
                            }
                            break;

                        case 500:
                            Toast.makeText(context, getResources().getString(R.string.server_error), Toast.LENGTH_SHORT).show();
                            break;
                    }
                }

                @Override
                public void failure(RetrofitError retrofitError) {
                    if (progressDialog.isShowing())
                        progressDialog.dismiss();
                    if (retrofitError != null) {
                        if (retrofitError.getKind() != null) {
                            if (retrofitError.getKind().equals(RetrofitError.Kind.NETWORK)) {
                                Toast.makeText(context, "Check your network connection and try again later",
                                        Toast.LENGTH_SHORT).show();
                            }
                        } else if (retrofitError.getResponse() != null) {
                            if (retrofitError.getResponse().getStatus() == 500) {
                                Toast.makeText(context, getResources().getString(R.string.server_error), Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                }

            });
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

感谢高级。!!

【问题讨论】:

  • 你需要传递动态标题还是静态标题?

标签: android web-services retrofit


【解决方案1】:

您可以在改造 api 界面中使用@Header。例如,类似:

void loginToServer(@Header("your_header") String yourHeaderValue, Callback<UserInfo> callback);

【讨论】:

  • 但是我将如何在 TypedInput 中访问。? TypedInput typedInput = new TypedByteArray("text/plain", outer_body.toString().getBytes("UTF-8"));
  • 表示登录成功后,我得到:{ "status": "success"," info": "login successful", "user":{"access_token": "fdfdfgfgfgf", "email ":"test001@test.com"} 现在我必须根据 "access-token" 和 "email" 获取用户数据。所以为此我需要传递动态请求参数。 X-ACCESS-TOKEN = 成功登录后收到的令牌 X-USER-EMAIL = 登录时使用的电子邮件,因此可以将您的答案/代码放在上面的代码中,以便于理解。
【解决方案2】:

假设您要传递静态标头(那些不会因单个请求而更改的标头)。 例如,此代码将缓存控制标头添加到 /tasks 请求

public interface UserService {  
    @Headers("Cache-Control: max-age=640000")
    @GET("/tasks")
    List<Task> getTasks();
}

如果您需要传递动态标头(根据单个请求更改的标头)

public interface UserService {  
    @GET("/tasks")
    List<Task> getTasks(@Header("Content-Range") String contentRange);
}

更多关于Retrofit Add Custom Request Header

【讨论】:

  • TypedInput typedInput = new TypedByteArray("text/plain", outer_body.toString().getBytes("UTF-8"));但是我将如何在 TypedInput 中访问?
  • 表示登录成功后,我得到:{ "status": "success"," info": "login successful", "user":{"access_token": "fdfdfgfgfgf", "email ":"test001@test.com"} 现在我必须根据 "access-token" 和 "email" 获取用户数据。所以为此我需要传递动态请求参数。 X-ACCESS-TOKEN = 成功登录后收到的令牌 X-USER-EMAIL = 登录时使用的电子邮件,因此可以将您的答案/代码放在上面的代码中,以便于理解。
  • 我没有得到这个...您是在问如何将我的答案添加到您的代码中。或者是其他东西?请尽可能清楚。
  • 是的,我希望您将答案添加到我的代码中。因为我无法进一步进行。谢谢..!!
  • 好的。在您的ApiService 类中,编辑名为loginToServer 的方法,使其具有@Header("Cache-Control") String contentRange 这样的loginToServer(@Header("Cache-Control") String cacheControl) 参数,然后当您在上面的代码中调用它时,请执行此apiService.loginToServer("max-age=640000"...
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2022-01-12
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多