首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OKHTTP3向web服务器发送POST请求

使用OKHTTP3向web服务器发送POST请求
EN

Stack Overflow用户
提问于 2018-10-29 17:58:13
回答 5查看 663关注 0票数 1

我正在创建一个用于支付电费的应用程序。我希望这个应用程序是这样工作的。客户输入他/她的仪表号码以及要支付的金额。单击submit按钮后,必须通过OKHTTP3协议使用POST请求将此信息发送给服务提供商。我写了下面的代码,当我单击提交按钮时,它没有显示任何内容。请帮帮忙。

代码语言:javascript
复制
package googleplayservices.samples.android.com.whitney.shumba;

import android.content.Intent;
import android.renderscript.RenderScript;
import android.support.design.widget.TextInputEditText;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class Zesa extends AppCompatActivity {
  private TextInputEditText txtinputmeter,txtinputamount;
  private Button submit;
  private TextView json;


       @Override
       protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_zesa);

        json = (TextView) findViewById(R.id.jsonTV);
        txtinputmeter = (TextInputEditText) findViewById(R.id.txt_input_meter);
        txtinputamount = (TextInputEditText) 
       findViewById(R.id.txt_input_amount);
        submit = (Button) findViewById(R.id.submitButton);
        submit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Okhttp3 client network request
                OkHttpClient client = new OkHttpClient();
                String url = "https://www.shumbapay.com";
                Request request = new Request.Builder()
                        .url(url)
                        .build();

                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        e.printStackTrace();
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws 
                                  IOException {
                        if(response.isSuccessful()){
                            final String myResponse = response.body().string();

                            Zesa.this.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    json.setText(myResponse);
                                }
                            });
                        }
                    }
                });
                Submit();
            }

            private void Submit() {
                startActivity(new Intent(Zesa.this, Payzesa.class));
            }
        });
    }

}
EN

回答 5

Stack Overflow用户

发布于 2018-10-29 19:09:19

我会给你一个问题的解决方案,以及如何使用OKHTTP3 POST请求的一般解释,因为你将来可能也需要扩展你的项目。

JSON第一步,你需要将你想要发送的数据转换成对象。这将使您的代码更干净、更易维护。为此,需要为需要发送的数据创建一个java类。在您的示例中,java类将如下所示:

公有类Data{ @Expose private String meter;@Expose private String amount;//添加一个构造函数和getters + setters }

然后,将以下行添加到模块的build.gradle中:

代码语言:javascript
复制
implementation 'com.google.code.gson:gson:2.8.4'

这允许您使用gson库自动将java对象转换为JSON对象。

然后创建JSON对象,它将包含您想要发送的数据。这是按如下方式完成的:

代码语言:javascript
复制
    Data data=new 
      Data(txtinputmeter.getText.toString(),txtinputamount.getText.toString());
      Gson gson = new GsonBuilder().serializeNulls().create();
       String JSONObjectString = gson.toJson(data);

  • 第二步,创建OKHTTP Post方法,如下所示:

公共静态字符串doPostOkHttp(String URL,String jsonObject) { OkHttpClient client =新的OkHttpClient();RequestBody body = RequestBody.create(JSON,jsonObject);Request request =新的Request.Builder() .url(URL) .post(body) .header("Content-type",“应用程序/json”) .build();try { response = client.newCall(request).execute();if (response.code() == 200) {log.d(“服务器响应200",response.body().string());return response.body().string();}否则{log.d(”服务器响应错误“," Error”);返回“服务器响应错误”;}} catch (IOException e) {} return“服务器响应错误”;}

上面的方法允许您向服务器发送一条消息,并从服务器接收响应(如果服务器具有正文)。

JSON

  • 第三步,是发送包含你的数据的对象,如下所示:

doPostOkHttp(“您的URL",JSONObjectString );

然后监视您的logcat,看看服务器响应是什么样子。

在单独的线程中运行doPostOkHttp是很好的做法。只要您理解了上面的代码,就可以很容易地使用您在代码中使用的回调技术。

如果您仍然面临问题,请一步一步地阅读这个非常简单的教程,这样您就可以理解如何在OKHTTP:http://www.vogella.com/tutorials/JavaLibrary-OkHttp/article.html中使用Post的所有内容

票数 1
EN

Stack Overflow用户

发布于 2018-10-29 18:08:47

在发送请求后,您将显示一个新活动。因此,当前活动无法检索服务器响应...你必须在收到响应后放入你的Submit()方法。

票数 0
EN

Stack Overflow用户

发布于 2018-10-29 18:13:40

根据您的编码,您将在响应之前导航到Payzesa.class

所以把意图或者动作放在里面

代码语言:javascript
复制
 @Override
                public void onResponse(Call call, Response response) throws 
                              IOException {
                    if(response.isSuccessful()){
                        final String myResponse = response.body().string();

                        Zesa.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                json.setText(myResponse);
                            }
                        });
                    }
                }
            });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53042930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档