【问题标题】:Send post request using OkHttpClient使用 OkHttpClient 发送 post 请求
【发布时间】:2017-02-13 19:02:21
【问题描述】:

我有一个 2 EditText 的活动。 当用户单击发送按钮时,我想将 EditText 值发送到我的服务器。 当用户单击按钮时,我尝试发出 POST 请求。 问题是当用户点击按钮时他得到一个错误,并且应用程序自动关闭。 这是我的代码:

    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;

    import com.google.firebase.iid.FirebaseInstanceId;
    import com.google.firebase.messaging.FirebaseMessaging;

    import java.io.IOException;

    import okhttp3.FormBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;

    public class register extends AppCompatActivity {
        private EditText nameE,l_nameE;
        private Button registerE;
        private String name,l_name,token;
        boolean thread_running = true;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_register);


            FirebaseMessaging.getInstance().subscribeToTopic("test");
            token =  FirebaseInstanceId.getInstance().getToken();
            Toast.makeText(this, token, Toast.LENGTH_LONG).show();
            final Button register = (Button)findViewById(R.id.button);
             nameE = (EditText)findViewById(R.id.editText);
             l_nameE = (EditText)findViewById(R.id.editText2);


            register.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    registerToken();
                }
            });
        }
        public void intialize(){
            name = nameE.getText().toString().trim();
            l_name = l_nameE.getText().toString().trim();
        }
        public boolean validate(){
            boolean e=true;
            if(name.equals("")){
                e=false;
                nameE.setError("enter name");
            }else if(l_name.equals("")){
                e=false;
                l_nameE.setError("enter l_name");
            }
            return e;
        }
        private void registerToken() {
            intialize();
            if (!validate()) {
                Toast.makeText(this, "err", Toast.LENGTH_LONG).show();
            }else{
              reg();
            }
        }
        public void reg(){
            Toast.makeText(this, "reg", Toast.LENGTH_LONG).show();
            OkHttpClient client = new OkHttpClient();
            RequestBody body = new FormBody.Builder()
.add("name",name)
.add("l_name",l_name)
                    .build();

            Request request = new Request.Builder()
                    .url("http://192.168.0.106/fcm/register.php")
                    .post(body)
                    .build();

            try {
                client.newCall(request).execute();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

谢谢

【问题讨论】:

  • 检查您是否将令牌作为字符串而不是 JSONObject 传递。检查您是否使 API 是字符串请求或 JSONObjectRequest。
  • 错误是什么?请附上堆栈跟踪。
  • 应用程序已停止

标签: java android post http-post okhttp3


【解决方案1】:

您正在主线程上进行网络调用。这在 Android 上是不允许的,因为它会阻止您的整个应用程序,直到请求完成。 例如,一种解决方案是将您的网络调用包装在 AsyncTask 中。

但是当您使用 OKHttpClient 时,他们正在为此类事情提供异步 api。

client.newCall(request).enqueue(new Callback() {
    @Override 
    public void onFailure(Call call, IOException e) {
        //something went wrong
        Log.e(YOUR_TAG, e);
    }
    @Override 
    public void onResponse(Call call, Response response) throws    IOException {
        if (!response.isSuccessful()) {
            throw new IOException("Response not sueccessful   " + response);
        }
        //success do whatever you want. for example -->
        Log.d(YOUR_TAG, response.body().string());
    }
}

所以在你的例子中,而不是像这样的同步调用

client.newCall(request).execute();

您必须使用如上所示的异步回调版本。

希望对你有帮助

编辑:有关更多食谱,请查看 wiki 页面:https://github.com/square/okhttp/wiki/Recipes

【讨论】:

  • 如何将 post 请求更改为 UTF-8?
  • 我更新了我的答案。您必须为请求设置 MediaType。只需查看 wiki 链接。
猜你喜欢
  • 2013-09-24
  • 2013-10-06
  • 2015-02-28
  • 2021-11-30
  • 2017-05-03
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多