【问题标题】:How to send Form data in retrofit2 android如何在retrofit2 android中发送表单数据
【发布时间】:2016-02-29 07:04:06
【问题描述】:

嗨,我有一个要发送到服务器的 json (POST METHORD){"country":"india","devicetype":"android"} 它是表单数据模型 就像这个 json 的关键是 data 即服务器是否像

一样接受它

data={"country":"india","devicetype":"android"} 正在使用改造我使用这样的 Multipart

@Multipart
@POST("initiate")
@Headers({
        "Content-Type: application/json",
        "Cache-Control: no-cache"
})
Call<UserInfoServerResponse> getUserInfoRequest(@Part(value="data") UserInfo mUserInfo);

这里 UserInfo 是 json,但在我使用 FormUrlEncoded 方法之后我从服务器收到失败消息

 @FormUrlEncoded
@POST("initiate")
@Headers({
        "Content-Type: application/json",
        "Cache-Control: no-cache"
})
Call<UserInfoServerResponse> getUserInfoRequest(@Field(value="data",encoded = false) String mUserInfo);

它的输出也是服务器的同样失败结果,但是发送到服务器的数据是格式

data=%7B%22country%22%3A%22india%22%2C%22devicetype%22%3A%22%22%7D

我的UserInfo.class

public class UserInfo {


public String country;

public String devicetype;

public UserInfo( String country,String devicetype) {

    this.country=country;

    this.devicetype=devicetype;
}
}

我的适配器类

RemoteRetrofitInterfaces mService;
    Retrofit mRetrofit;
  HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS).addInterceptor(interceptor)
                .build();

        mRetrofit = new Retrofit.Builder()
                .baseUrl(AppConstant.HOST).addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();
        mService = mRetrofit.create(RemoteRetrofitInterfaces.class);

   Call<UserInfoServerResponse> api = mService.getUserInfoRequest(new Gson().toJson(mUserInfo));

        api.enqueue(new Callback<UserInfoServerResponse>() {
            @Override
            public void onResponse(Call<UserInfoServerResponse> responseCall, Response<UserInfoServerResponse> response) {

                if (response.body().status != null) {
                    if (response.body().status.equals("success")) {
                        Log.d(TAG, "success---");
                    }

                } else {
                    Log.d(TAG, "Failed---");

                }


            }

            @Override
            public void onFailure(Call<UserInfoServerResponse> responseCall, Throwable t) {
                t.printStackTrace();
            }


        });

那么我如何使用改造成功地将 json 发送到服务器我经历了retofit document 并按照几个步骤但我没有得到任何结果。有人可以帮我吗

谢谢

【问题讨论】:

  • 发布您的UserInfo 课程
  • 尝试在标题中添加“Accept: application/json”。
  • 你的 Retrofit RestAdapter 代码在哪里?
  • 好吧,这是我的用户信息类
  • 请检查我的答案是否相同。我会发帖

标签: android json retrofit2


【解决方案1】:

我终于找到了解决方案,希望这对其他人有所帮助

我通过FieldMap实现了解决方案

改造。

@POST("initiate")
@FormUrlEncoded

Call<UserInfoServerResponse> getUserInfoRequest(@FieldMap Map<String,String> params);

在 Rest Adapter 部分,我将请求数据从字符串更改为 Hashmap 形式,如下所示

Log.d(TAG, "sendUserInfo called");
UserInfo mInfo = new UserInfo("countyname","android");
String request = new Gson().toJson(mUserInfo);

// Here the json data is add to a hash map with key data
Map<String,String> params = new HashMap<String, String>();
params.put("data", request);


Call<UserInfoServerResponse> api = mService.getUserInfoRequest(params);

api.enqueue(new Callback<UserInfoServerResponse>() {
    @Override
    public void onResponse(Call<UserInfoServerResponse> responseCall, Response<UserInfoServerResponse> response) {

        if (response.body().status != null) {
            if (response.body().status.equals("success")) {
                Log.d(TAG, "success---" + response.body());
            }
        } else {
            Log.d(TAG, "Failed---");
        }

    }

    @Override
    public void onFailure(Call<UserInfoServerResponse> responseCall, Throwable t) {
        t.printStackTrace();
    }

});

基本上我使用 @FormUrlEncoded 处理表单数据和 @FieldMap 将我的请求 JSON 作为键值。我通过这种方法得到了解决方案,希望这对某人有帮助:)

【讨论】:

    【解决方案2】:

    上述解决方案可行,但使用起来很麻烦,更好的解决方案是使用@Multipart formData的转换器

    请使用下面的代码来处理@Multipart FormData 这是因为

    "" is added to your posting strings

    import java.io.IOException;
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Type;
    
    import okhttp3.MediaType;
    import okhttp3.RequestBody;
    import okhttp3.ResponseBody;
    import retrofit2.Converter;
    import retrofit2.Retrofit;
    
    /**
     * Created by kural on 10/27/17.
     */
    
    public class StringConverterFactory extends Converter.Factory {
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain");
    
    public static StringConverterFactory create() {
            return new StringConverterFactory();
            }
    
    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
            if (String.class.equals(type)) {
            return new Converter<ResponseBody, String>() {
    
    @Override
    public String convert(ResponseBody value) throws IOException {
            return value.string();
            }
            };
            }
            return null;
            }
    
    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        if (String.class.equals(type)) {
            return new Converter<String, RequestBody>() {
                @Override
                public RequestBody convert(String value) throws IOException {
                    return RequestBody.create(MEDIA_TYPE, value);
                }
            };
        }
    
        return null;
    
    }
    }
    

    并在您的改造客户端中添加此行

    .addConverterFactory(StringConverterFactory.create())

    public class RetroFitClient {
        private static Retrofit retrofit = null;
    
        public static Retrofit getClient(String baseUrl) {
            if (retrofit==null) {
                HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
                interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
    
                /*retrofit = new Retrofit.Builder()
                        .baseUrl(baseUrl)
                        .client(client)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();*/
                retrofit = new Retrofit.Builder()
                        .baseUrl(baseUrl)
                        .client(client)
                        .addConverterFactory(StringConverterFactory.create())
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
    
    
            }
            return retrofit;
        }
    

    【讨论】:

      【解决方案3】:

      这对我来说很好,并返回一个 json 以获得新的有效 Microsoft Azure 令牌:

      我的终点:

      @PostMapping(value = "/get-new-token", consumes = {"application/JSON"}, produces = {"application/JSON"})
      @Timed
      public ResponseEntity<String> getNewToken(@RequestBody String refreshToken) throws IOException {
          JSONObject json = tokenService.getNewTokenByRefreshToken(refreshToken);
          return new ResponseEntity<>(json.toString(), HttpStatus.OK);
      }
      

      我的 getGraphRepository

      public GraphRepository getGraphRepository() {
          HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
          interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
      
          OkHttpClient client = new OkHttpClient.Builder()
              .addInterceptor(interceptor).build();
      
          // Create and configure the Retrofit object
          Retrofit retrofit = new Retrofit.Builder()
              .baseUrl(" https://login.microsoftonline.com")
              .client(client)
              .addConverterFactory(JacksonConverterFactory.create())
              .build();
      
          // Generate the graph repo
          return retrofit.create(GraphRepository.class);
      }
      

      我的令牌服务:

      public JSONObject getNewTokenByRefreshToken(String refreshToken) throws IOException {
          GraphRepository graphRepository = getGraphRepository();
      
          // My list of -> Key : Value
          Map<String,String> params = new HashMap<String, String>();
          params.put("grant_type", "refresh_token");
          params.put("client_id", this.client_id);
          params.put("client_secret", client_secret);
          params.put("refresh_token", refreshToken);
      
          RefreshToken data = graphRepository.getRefreshToken(tenantId, params).execute().body();
          JSONObject json = new JSONObject(data);
      
          return json;
      }
      

      我的 GraphRepository :

      @POST("/{tenant_id}/oauth2/v2.0/token")
      @FormUrlEncoded
      Call<RefreshToken> getRefreshToken(
          @Path("tenant_id") String tenant_id,
          @FieldMap Map<String, String> params
      );
      

      我希望这可以帮助某人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 2020-08-14
        • 1970-01-01
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        相关资源
        最近更新 更多