当前位置: 首页 > 知识库问答 >
问题:

改装:如何在POST中发送base64编码的正文请求

伊温书
2023-03-14

我最近开始在我的android应用程序中使用改装,这是我添加用户的改装请求:

RestAdapter mRestAdapter =  new RestAdapter.Builder()
        .setEndpoint(SERVER_URL)
        .setLogLevel(RestAdapter.LogLevel.FULL)
        .setRequestInterceptor(new SessionInterceptor())
        .setClient(new OkClient(new OkHttpClient()))
        .build();

@POST("/user/add")
    JsonElement registerUser(@Body User user);

这里User是我想在服务器上注册的用户的模型类。问题是服务器需要Base64.encode()格式的json正文请求。有没有办法使用改装发送Base64编码数据?

我可以想到手动这样做:

String json = gson.toJson(user);
byte[] bytes = Base64.encode(json.getBytes("UTF-8"), Base64.DEFAULT);

然后在请求中传递这个。但是,我必须手动完成这项工作,并处理每个POST请求。有没有更干净的方法。

共有2个答案

卫鸿朗
2023-03-14

此答案直接适用于改装v2。0但相同的概念可适用于早期版本。

一个选项是创建一个RequestInterceptor。根据您提供的信息,我不太确定是否每个帖子都是base 64编码的。我假设情况就是这样。

public class Base64EncodeRequestInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
        Request.Builder builder = originalRequest.newBuilder();

        if (originalRequest.method().equalsIgnoreCase(POST)) {
          builder = originalRequest.newBuilder()
              .method(originalRequest.method(), encode(originalRequest.body()));
        }


        return chain.proceed(builder.build());
    }

    private RequestBody encode(RequestBody body) {
        return new RequestBody() {
            @Override
            public MediaType contentType() {
                return body.contentType();
            }

            @Override
            public void writeTo(BufferedSink sink) throws IOException {
                Buffer buffer = new Buffer();
                body.writeTo(buffer);
                byte[] encoded = Base64.encode(buffer.readByteArray(), Base64.DEFAULT);
                sink.write(encoded);
                buffer.close();
                sink.close();
            }
        };
    }
}

这个拦截器所做的是检查传入的方法是否是POST,如果是,它将对RequestBody进行base64编码。

唐兴贤
2023-03-14

对于一般对象类型(包括字符串),改型将使用其转换器序列化值。在本例中,默认情况下使用Gson将主体序列化为JSON。

为了上传Base64编码的数据,您需要使用TypeInput。这告诉Retromet,您将向它传递已经序列化的原始正文和相关的Content-Type值。

 类似资料:
  • 我已经写了下面的代码发送头,张贴参数。问题是我使用的是SendAsync,因为我的请求可以是GET或POST。我如何将POST Body添加到这个peice代码中,这样,如果有任何POST Body数据,它就会被添加到我发出的请求中,如果它是简单的GET或POST而没有Body,它就会以这种方式发送请求。请更新以下代码:

  • 代码如下: 这将向flask发送一个{“name”:“go”}JSON字典。Flask应该将语言名称追加到数组中,并在响应中返回完整的数组。现在,当我手动发送请求时,这就工作了,所以这不是Flask的错误。但是当我从iOS发送上述内容时,我在flask控制台中得到request.json==None。很明显,我送的是一具空尸体,但我不应该。你知道我哪里出了问题吗?

  • 问题内容: 我正在尝试发出POST请求,但无法完成。另一端什么也没收到。 这是应该如何工作的吗?我知道该功能,但我想我不能使用它,因为它不能用测试,对吗? 问题答案: 您基本上有正确的想法,只是发送错误的表格。该表格属于请求的正文。

  • 我使用下面的代码来创建一个条目在strapi服务器,但不幸的是,我得到了"坏请求"错误。我想不出来。请指导我如何解决这个问题。 ApiSet。班 主要活动。班 我的身体。班 还有我的模型课 数据班 属性。班 最后,我得到了如下回应: 我只是想知道我在哪里犯了错误

  • 我使用API网关触发Lambda函数,使用Lambda代理集成,但是请求体编码为base64,这是为什么?我怎样才能把它改成JSON来字符串化JSON呢?

  • 我在网上找到了这个脚本: 但我不明白如何与PHP一起使用它,也不明白params变量内部的内容是什么,也不明白如何使用它。我能帮个忙吗?