使用 OkHttpClient 发送 post 请求
Send post request using OkHttpClient
我有一个带有 2 个 EditText 的 activity。
当用户单击“发送”按钮时,我想将 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();
}
}
}
谢谢
您正在主线程上进行网络调用。这在 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();
您必须使用如上所示的异步回调版本。
希望对您有所帮助
编辑:有关更多食谱,请查看维基页面:https://github.com/square/okhttp/wiki/Recipes
我有一个带有 2 个 EditText 的 activity。 当用户单击“发送”按钮时,我想将 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();
}
}
}
谢谢
您正在主线程上进行网络调用。这在 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();
您必须使用如上所示的异步回调版本。
希望对您有所帮助
编辑:有关更多食谱,请查看维基页面:https://github.com/square/okhttp/wiki/Recipes