Retrofit在Android中进行带有请求体参数的POST请求

3

我需要用Retrofit执行POST请求,但我遇到了一个问题,我无法很好地理解。在尝试代码之前,我使用Postman测试了API调用,请求如下:

capture1 enter image description here

这是我的Android代码:

public class API {

private static <T> T builder(Class<T> endpoint) {

    return new Retrofit.Builder()
            .baseUrl(Utils.API_BASE_URL)
            .addConverterFactory(ScalarsConverterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(endpoint);
}
public static AllRequests request() {
    return builder(AllRequests.class);
}
}

编辑 请求:

@POST("api/android-feedback")
@Headers({"Content-Type: application/x-www-form-urlencoded", "Authorization: F#@3FA@#Rad!@%!2s"})
Call<String> sendFeedback(@Body FeedbackBody body);

反馈正文:

public class FeedbackBody{
private final String email;
private final String feedback;

public FeedbackBody(String email, String feedback){
    this.email = email;
    this.feedback = feedback;
}

最后我构造了请求并等待响应,问题在于我在 onFail 方法中接收到消息。
   private void sendFeedbackRequest(){
    API.request().sendFeedback(new FeedbackBody("testmeil@meil.com", "test feedback").enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, Response<String> response) {
            goToMainActivity();
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {
            Toast.makeText(SplashScreenActivity.this, R.string.try_again_later, Toast.LENGTH_SHORT).show();
        }
    });

编辑: 还是不起作用..我想我找到了问题出在哪里,因为服务器端等待的是没有 Json 格式化的简单 POST 请求,我认为 Retrofit 默认使用 JSON 格式化,如果我发送 POST 请求并使用 JSON 格式化主体参数,服务器将无法解析我的请求,有没有机会像 POSTMAN 一样发送简单的 POST 请求而不使用 JSON 格式?

  • Php api 等待这样的请求被发送:

$_POST['feedback'] = 'blabla'; $_POST['email'] = 'blabla..';

如果他收到 Json 格式的请求,无法解析它,因此我收到失败的响应。

4个回答

2

首先,您需要创建请求(POJO类)。

Original Answer翻译成"最初的回答"。
public class FeedbackRequest {
   public String email;
   public String feedback;
}

当您调用sendFeedbackRequest()时,请按以下方式传递FeedbackRequest。"
FeedbackRequest req = new FeedbackRequest();
req.email= "email";
req.feedback= "feedback"
sendFeedbackRequest(req)

之后你的sendFeedbackRequest()应该像这样。
  private void sendFeedbackRequest(FeedbackRequest request){
      API.request().sendFeedback(request).enqueue(new Callback<String>() {
      @Override
      public void onResponse(Call<String> call, Response<String> response) {
        goToMainActivity();
      }

      @Override
      public void onFailure(Call<String> call, Throwable t) {
        Toast.makeText(SplashScreenActivity.this, R.string.try_again_later, Toast.LENGTH_SHORT).show();
    }
});

你的改进请求应该像这样,

最初的回答:

您的改装请求应该如下所示,

@FormUrlEncoded
@POST("api/android-feedback")
@Headers({"Content-Type: application/json", "Authorization: F31daaw313415"})
Call<String> sendFeedback(@Body FeedbackRequest request);

现在应该可以工作了。如有任何问题,请随意询问。最初的回答。

我尝试了你的答案,但仍然无法正常工作,你可以查看我的编辑问题,如果你能帮助我就太好了。 - Kristiyan Varbanov
将您的 sendFeedbackRequest(final String feedback, final String email) 更改为 sendFeedbackRequest(FeedbackBody body) - Sajith
我已经更改了它,但是再次发送JSON格式时,服务器无法解析它,有没有可能以未格式化的POST方式将其发送给服务器。 - Kristiyan Varbanov
你能否将与此问题相关的当前代码更新到Google文档中,并在此处粘贴链接? - Sajith
你做错了。请检查你的代码中的 sendFeedbackRequest() 函数和我的答复。 - Sajith
让我们在聊天中继续这个讨论 - Sajith

1
你正在使用Gson转换器工厂。创建一个单独的对象来代表你的请求体可能会更容易,而不是使用所有的参数。这样,你就可以简单地跟随Retrofit网站上的示例了。进入链接描述 还有许多网站可以为你生成普通的Java对象,比如这个
例如,你的API调用:
@POST("api/android-feedback")
Call<String> sendFeedback(@Body FeedbackBody feedback);    

并且你的FeedbackBody类:

public class FeedbackBody{
    private final String email;
    private final String feedback;

    public FeedbackBody(String email, String feedback){
        this.email = email;
        this.feedback = feedback;
    }
}

我尝试了你的答案,但仍然无法正常工作,你可以查看我的编辑问题,如果你能帮助我就太好了。 - Kristiyan Varbanov

0
  val formBody: RequestBody = FormBody.Builder()
            .add("username", LoginRequest.username)
            .add("password", LoginRequest.password)
            .add("grant_type",LoginRequest.grant_type)
            .add("client_id", LoginRequest.client_id)
            .add("client_secret", LoginRequest.client_secret)
            .add("cleartext", LoginRequest.cleartext)
            .build()

@POST(EndPoints.GENERATE_TOKEN_URL)
    @Headers("Content-Type: application/x-www-form-urlencoded")
    suspend fun getLogin(
        @Body formBody: RequestBody
    ): LoginResponse

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

0

Java:

@POST("/api/android-feedback")
Call<String> sendFeedback(@Body FeedbackBody feedback);

Kotlin:

@POST("/api/android-feedback")
fun sendFeedback(@Body feedback: FeedbackBody): Call<String>

另外,也许你忘记在终端点中添加前导斜杠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接