【问题标题】:Send POST parameters with Retrofit使用 Retrofit 发送 POST 参数
【发布时间】:2017-02-02 01:46:07
【问题描述】:

我正在尝试通过 Retrofit 实现 POST 请求,但我猜这种方法似乎是错误的。我按照我用于 GET 请求的步骤操作:

我定义了终点:

 public interface GitHubEmailAPI {

    @POST("/users/{user}")
    Call<GitHubEmail> postEmail(@Field("email") String email);
}

型号:

    public class GitHubEmail {

    @SerializedName("email")
    private String email;

    public String getEmail() {
        return email;
    }

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

还有召唤:

 public void postEmail (){
    GitHubEmailAPI apiService =
            ApiClient.getClient().create(GitHubEmailAPI.class);

    final Call<GitHubEmail> callEmail = apiService.postEmail
            (String.valueOf(enterEmailEt.getText()));

    callEmail.enqueue(new Callback<GitHubEmail>() {
        @Override
        public void onResponse(Call<GitHubEmail> call, Response<GitHubEmail> response) {
            testTV.setText(callEmail.toString());
        }

        @Override
        public void onFailure(Call<GitHubEmail> call, Throwable t) {
            Log.e("Email", t.toString());

        }
    });

我正在使用 github api 作为测试,不确定是否需要将访问令牌作为参数包含在请求中。

【问题讨论】:

  • 你的疑惑清楚了吗??

标签: android post retrofit


【解决方案1】:

你知道一些关于改造的信息......

  1. 您的 BASE_URL 必须以 / 结尾。

  2. 当您使用 @Field 表示法时,您必须将 @FormUrlEncoded 放入您的 Api 调用中。

  3. 当您在 API 方法中使用 {user} 时,您必须使用 @Path("user") String user 来关联 url 数据。

  4. 您的 POST 方法 URL 将类似于 @POST("users/{user}")

  5. 当您的响应回调在此变量中的 Response&lt;GitHubEmail&gt; response 内完成实际数据时。您必须使用 response.body() 来获取您从 API CALL 获得的响应。

这是一个示例代码

@FormUrlEncoded
@POST("users/{user}")
Call<YourResultPojoClassHere> yourFuntionName(@Field("id") String id,@Path("user") String path);

请看下面的代码......

callEmail.enqueue(new Callback<GitHubEmail>() {
        @Override
        public void onResponse(Call<GitHubEmail> call, Response<GitHubEmail> response) {
              if (response.isSuccessful()) {
                        if (response.body().getSuccess()) 

                            Toast.makeText(ClassName.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
                        else
                            Toast.makeText(ClassName.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
                    } else 
                        Toast.makeText(ClassName.this, "Sorry for inconvince server is down", Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onFailure(Call<GitHubEmail> call, Throwable t) {
                Toast.makeText(ClassName.this, "Check your Internet connection", Toast.LENGTH_SHORT).show();
            }
        }
    });

【讨论】:

  • 非常感谢,@sushildlh!
  • 在我实施了您建议我做的事情后,响应正文为空,错误正文显示“未找到”。例如,放置访问令牌怎么样?还是说,路径不对?
  • 请分享网址好吗? 或者在你必须处理你的数据和响应时......
  • 这是 GET 请求.....而不是 POST 只需使用 GET AND 使用 POJO 处理您的响应。
  • 如果没有可用的电子邮件,我想发一封电子邮件,我需要 GET 吗?
【解决方案2】:

对于改造中的 POST,您必须包含 @FormUrlEncoded

@FormUrlEncoded
@POST("path_here")
Call<ResponseBody> function_name(@Field("data") String data);

【讨论】:

    猜你喜欢
    • 2019-04-26
    • 2015-07-22
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2020-04-06
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多