简体   繁体   English

Retrofit2 发送 POST 请求

[英]Retrofit2 send POST request

I am trying to perform a POST request on Android via Retrofit.我正在尝试通过 Retrofit 在 Android 上执行 POST 请求。 I have to send the data in the format {number: "background_number"} in the body of the request.我必须在请求正文中以 {number: "background_number"} 格式发送数据。 And get the answer in the format {status: "ok", "read:" 123123 "} Below is my code.并以 {status: "ok", "read:" 123123 "} 格式获取答案下面是我的代码。

    package com.example.test;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import okhttp3.Request;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {
    private APIServicePost mService;
    MyTask mt;
    String status;
    String body;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mService = ApiUtils.getAPIService();
    }

    public void sendPost( String body) {

        mService.savePost(body).enqueue(new Callback<Post>() {
            @Override
            public void onResponse(Call<Post> call, Response<Post> response) {

                if (response.isSuccessful()) {
                    response.body().toString();
                    Log.i("PostActivity", "post submitted to API." + response.body().toString());
                }
            }

            @Override
            public void onFailure(Call<Post> call, Throwable t) {
                Log.e("PostActivity", "Unable to submit post to API.");
            }
        });
    }

    public void onclick(View v) {
        mt = new MyTask();
        mt.execute();
    }





    class MyTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {
            Log.e("PostActivity", "BG WORKING");
            sendPost("+79228034507");
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
        }
    }

}

    package com.example.test;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface APIServicePost {

    @POST("/start_go_sms/")
    @FormUrlEncoded
    Call<Post> savePost(@Field("number") String title);
}

    package com.example.test;

import android.app.Application;

public class ApiUtils {
    public static final String BASE_URL = "My base url";

    public static APIServicePost getAPIService() {
        return RetrofitClient.getClient(BASE_URL).create(APIServicePost.class);
    }
}

    package com.example.test;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Post {
    @SerializedName("status")
    @Expose
    private String status;
    @SerializedName("rid")
    @Expose
    private String rid;

    public String getStatus(){
        return status;
    }
    public String getRid(){
        return rid;
    }

}

    package com.example.test;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {
    private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl) {
        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}

The code is executing, but there is no response or error.代码正在执行,但没有响应或错误。 Internet access allowed允许上网

try this service generator试试这个服务生成器

public class ServiceGenerator {

    private static Object instance;

    @SuppressWarnings("unchecked")
    public static <S> S createService(Class<S> serviceClass, String baseUrl) {
        if (instance == null) {
            instance = service(serviceClass, baseUrl);
            return (S) instance;
        } else {
            return (S) instance;
        }
    }

    private static <S> S service(Class<S> serviceClass, String baseUrl) {
        //HttpLoggingInterceptor logger = new HttpLoggingInterceptor();
        //if (debug)
        //    logger.setLevel(HttpLoggingInterceptor.Level.BODY);
        //else
         //   logger.setLevel(HttpLoggingInterceptor.Level.NONE);

        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        httpClient.retryOnConnectionFailure(true)
                .readTimeout(120, TimeUnit.SECONDS)
                .connectTimeout(120, TimeUnit.SECONDS);

       // if (debug)
       //     httpClient.networkInterceptors().add(logger);

        OkHttpClient client = httpClient.build();

        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson));

        Retrofit retrofit = builder
                .client(client)
                .build();

        return retrofit.create(serviceClass);
    }
}

and use it in this way并以这种方式使用它

retroClient = ServiceGenerator.createService(RetroClient.class, AppConstants.BASE_URL)


retroClient.savePost(title)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Call<response>() {

                    @Override
                    public void onSubscribe(Disposable d) {
                        getDisposable().add(d);
                    }

                    @Override
                    public void onSuccess(Call<response> result) {
                        Logger.d(TAG, "get Result: " + result.isSuccess());

                    }

                    @Override
                    public void onError(Throwable e) {
                        Logger.d(TAG, "onError" + e.getMessage());

                    }
                });
    }

and your post和你的帖子

 @Headers("Accept: application/json")
    @POST("/start_go_sms/")
    @FormUrlEncoded
    Call<Post> savePost(@Field("number") String title)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM