如何发送身体数据到GET方法请求android

sg3maiej  于 2022-12-21  发布在  Android
关注(0)|答案(3)|浏览(149)

像这样,我想发送json body请求到GET API
我试过了,但没有用

public static void getQuestionsListApi2(final String requestId, final String timestamp,
                                        final ImageProcessingCallback.downloadQuestionsCallbacks callback,
                                        final Context context) {

    try {
       String url = NetUrls.downloadQuestions;

        final JSONObject jsonBody = new JSONObject();
        jsonBody.put("requestId", requestId);
        jsonBody.put("timestamp", timestamp);
        final String mRequestBody = jsonBody.toString();
        Log.i("params", String.valueOf(jsonBody));
        Log.i("URL", url);
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, **jsonBody**, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Log.v("TAG", "Success " + jsonObject);
                callback.downloadQuestionsCallbacksSuccess(jsonObject.toString());
            }

        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.v("TAG", "ERROR " + volleyError.toString());
            }

        });

        request.setRetryPolicy(new DefaultRetryPolicy(
                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 0,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        RequestQueue queue = Volley.newRequestQueue(context);
        queue.add(request);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

        request.setRetryPolicy(new DefaultRetryPolicy(
                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 0,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        RequestQueue queue = Volley.newRequestQueue(context);
        queue.add(request);

这是我使用的代码发送JSONRequest与GET方法时,我得到400错误响应服务器和服务器不除了在网址形式的数据.我发送的jsonBody对象作为参数.任何解决方案.

j5fpnvbx

j5fpnvbx1#

如果你想在GET请求的主体中传递Json数据,你必须使用Query注解

Call<YourNodelClass> getSomeDetails(@Query("threaded") String threaded, @Query("limit") int limit);

这将作为Json对象{"threaded": "val", "limit": 3}传递。
我试过了,这只是工作代码。

w80xi6nr

w80xi6nr2#

请尝试此代码。
将以下依赖项添加到应用级别Gradle文件中。

implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'

然后在所有单独类下面做后
第一个Retrofit对象创建类,如下所示。

public class ApiClient {
private final static String BASE_URL = "https://dog.ceo/api/breed/";

public static ApiClient apiClient;
private Retrofit retrofit = null;
private Retrofit retrofit2 = null;

public static ApiClient getInstance() {
    if (apiClient == null) {
        apiClient = new ApiClient();
    }
    return apiClient;
}

//private static Retrofit storeRetrofit = null;

public Retrofit getClient() {
    return getClient(null);
}

private Retrofit getClient(final Context context) {

    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient.Builder client = new OkHttpClient.Builder();
    client.readTimeout(60, TimeUnit.SECONDS);
    client.writeTimeout(60, TimeUnit.SECONDS);
    client.connectTimeout(60, TimeUnit.SECONDS);
    client.addInterceptor(interceptor);
    client.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            return chain.proceed(request);
        }
    });

    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    return retrofit;
}

}
然后制作如下的api接口。

public interface ApiInterface {
@POST("login/")
Call<LoginResponseModel> loginCheck(@Body UserData data);
}

进行pojo调用以获取服务器响应和用户输入..

public class LoginResponseModel {
@SerializedName("message") // here define your json key
private String msg;

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}

}
用户输入类

public class UserData {
private String email,password;

public String getEmail() {
    return email;
}

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

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

}

private void getLogin(){
    ApiInterface apiInterface=ApiClient.getInstance().getClient().create(ApiInterface.class);
    UserData data=new UserData();
    data.setEmail("abc@gmail.com");
    data.setPassword("123456");
    Call<LoginResponseModel> loginResponseModelCall=apiInterface.loginCheck(data);
    loginResponseModelCall.enqueue(new Callback<LoginResponseModel>() {
        @Override
        public void onResponse(Call<LoginResponseModel> call, retrofit2.Response<LoginResponseModel> response) {
            if (response.isSuccessful() &&  response !=null && response.body() !=null){
                LoginResponseModel loginResponseModel=response.body();
            }
        }

        @Override
        public void onFailure(Call<LoginResponseModel> call, Throwable t) {

        }
    });
}

当不需要用户交互时,使用GET方法。
你做pojo类然后使用下面的链接它生成pojo类粘贴你的json数据在.. http://www.jsonschema2pojo.org/

5cnsuln7

5cnsuln73#

您可以使用retrofit发送包含正文的请求。http://square.github.io/retrofit/
它是易于使用的库,例如:

@GET("[url node]")
Single<Response<ResponseBody>> doSmt(@Header("Authorization") String token, @Body ListRequest name);

另外,请看一下主体为HTTP GET with request body的get方法

更新

带请求体的GET方法是可选的here。但是,这个RFC7231文档说,
在GET请求上发送有效载荷主体可能导致一些现有实现拒绝该请求。
这意味着不建议这样做。请使用POST方法来使用请求正文。
从维基百科上查一下这个表。

相关问题