首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有正文参数的改版POST请求

带有正文参数的改版POST请求
EN

Stack Overflow用户
提问于 2019-05-23 03:20:21
回答 3查看 11.8K关注 0票数 1

我需要执行升级的post请求,但我有一个问题,我不能很好地理解。在尝试使用代码之前,我使用Postman测试了api调用,请求如下所示:

下面是我的android代码:

代码语言:javascript
复制
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);
}
}

编辑请求:

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

FeedbackBody:

代码语言:javascript
复制
public class FeedbackBody{
private final String email;
private final String feedback;

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

}

最后,我构造了请求并等待响应,问题是我在onFail方法中接收消息

代码语言:javascript
复制
   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格式化,如果我使用JSON发送POST请求和格式化主体参数,服务器将无法解析我的请求,有没有机会发送简单的POST请求而不使用JSON格式化呢?

要像这样发送

  • Php等待请求:

$_POST‘’feedback‘= 'blabla';$_POST’‘email’= 'blabla..';

如果他收到Json格式的请求,就不能解析它,因此我会收到失败响应。

EN

回答 3

Stack Overflow用户

发布于 2019-05-23 03:42:24

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

代码语言:javascript
复制
public class FeedbackRequest {
   public String email;
   public String feedback;
}

当您调用sendFeedbackRequest()时,请像下面这样传递FeedbackRequest

代码语言:javascript
复制
FeedbackRequest req = new FeedbackRequest();
req.email= "email";
req.feedback= "feedback"
sendFeedbackRequest(req)

之后,您的sendFeedbackRequest()应该是这样的

代码语言:javascript
复制
  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();
    }
});

你的翻新请求应该是这样的,

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

现在它应该可以工作了。请随时问我任何问题。

票数 2
EN

Stack Overflow用户

发布于 2019-05-23 03:34:17

您正在使用Gson转换器工厂。创建表示身体的单个对象,并使用该对象而不是所有单独的参数可能会更容易。这样,您就可以简单地按照Retrofit网站上的示例进行操作了。enter link description here还有许多网站可以让您为您生成Plain Old Java对象,比如this one

例如,您的Api呼叫:

代码语言:javascript
复制
@POST("api/android-feedback")
Call<String> sendFeedback(@Body FeedbackBody feedback);    

和你的FeedbackBody类:

代码语言:javascript
复制
public class FeedbackBody{
    private final String email;
    private final String feedback;

    public FeedbackBody(String email, String feedback){
        this.email = email;
        this.feedback = feedback;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-05-23 03:52:30

Java:

代码语言:javascript
复制
@POST("/api/android-feedback")
Call<String> sendFeedback(@Body FeedbackBody feedback);

Kotlin:

代码语言:javascript
复制
@POST("/api/android-feedback")
fun sendFeedback(@Body feedback: FeedbackBody): Call<String>

此外,您可能忘记了端点中的前导斜杠。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56263599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档