如何使用okhttp将数据从我的Android应用程序发布到php服务器?

时间:2016-07-22 11:02:33

标签: android json okhttp

我已编写以下代码,使用okhttp发布服务器并从服务器获取数据,但它无效。 在NewTest.java中

public class NewTest extends AppCompatActivity {

   TextView txtJson;
    Button btnOkay;

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

         txtJson= (TextView) findViewById(R.id.txtJson);

      findViewById(R.id.txtJson)).getText().toString());

        assert (findViewById(R.id.btnOkay)) != null;
        (findViewById(R.id.btnOkay)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new TaskPostWebService("url written here").execute(((TextView) findViewById(R.id.txtJson)).getText().toString());
            }
        });

    }

    private class TaskWebServiceGet extends AsyncTask<String,Void,String> {

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

        @Override
        protected String doInBackground(String... params) {

            try {

                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()
                        .url(params[0])
                        .build();

                Response response = client.newCall(request).execute();

                String responseJson = response.body().string();
                Log.i("@", "" + responseJson);
            }
            catch (Exception e){

                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }
    }

    private class TaskPostWebService extends AsyncTask<String,Void,String> {
        private String url;
        private ProgressDialog progressDialog;

        public TaskPostWebService(String url ){

            this.url = url;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(NewTest.this,"","");
        }

        @Override
        protected String doInBackground(String... params) {

            String fact = "";
            try {

                OkHttpClient client = new OkHttpClient(); 

                RequestBody body = new FormBody.Builder()
                         .add("\"nonce\" : \"G9Ivek\",", params[0])
                        .add("\"iUserId \": \"477\",", params[1])

                          .build(); 

                Request request = new Request.Builder()
                        .url(url)
                        .post(body)
                        .build();

                Response response = client.newCall(request).execute(); // hits server

                String json = response.body().string(); // server gives response

                ObjectMapper mapper = new ObjectMapper();
                Map<String,String> map = mapper.readValue(json, new TypeReference<Map>() { // convert json to object
                });

                if(map != null){

                    fact = map.get("gruesomeFact");

                }
                Log.i("@",""+json);
            }
            catch (Exception e){
                e.printStackTrace();
            }
            return fact;
        }
      @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            TextView text = (TextView) findViewById(R.id.txtJson);
            text.setText(s);
            progressDialog.dismiss();
        }
    }

}

我收到了拒绝访问的邮件。

有人可以告诉我出了什么问题。

2 个答案:

答案 0 :(得分:0)

尝试在doInBackground()方法中按以下方式执行POST请求:

private final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient(); 

//Create a JSONObject with the data to be sent to the server
JSONObject dataToSend = new JSONObject()
    .put("nonce", "G9Ivek")
    .put("iUserId", "477");

//Create request object
Request request = new Request.Builder()
    .url(url)
    .post(RequestBody.create(JSON, dataToSend.toString()))
    .build();

//Make the request
Response response = client.newCall(request).execute();

//Convert the response to String
String responseData = response.body().string();

//Construct JSONObject of the response string
JSONObject dataReceived = new JSONObject(responseData);

//See the response from the server
Log.i("response data", dataReceived.toString());

答案 1 :(得分:0)

代码答案如下。有效。 现在我想在listview中显示响应。怎么做?

* / 公共类NewTest扩展了AppCompatActivity {

    TextView txtJson;
    Button btnOkay;

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

         txtJson= (TextView) findViewById(R.id.txtJson);


        assert (findViewById(R.id.btnOkay)) != null;
        (findViewById(R.id.btnOkay)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

              new TaskPostWebService("written url here").execute(((TextView)
findViewById(R.id.txtJson)).getText().toString());

            }
        });

    }
    private class TaskPostWebService extends AsyncTask<String,Void,String> {

        private String url;
        private ProgressDialog progressDialog;
        private JSONParser jsonParser;

        public TaskPostWebService(String url ){

            this.url = url;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(NewTest.this,"","");
        }

        @Override
        protected String doInBackground(String... params) {

         String fact = "";
            try {

                final MediaType JSON = MediaType.parse("application/json");

                android.util.Log.e("charset", "charset - " + JSON.charset());
                OkHttpClient client = new OkHttpClient();

//Create a JSONObject with the data to be sent to the server
                final JSONObject dataToSend = new JSONObject()
                        .put("nonce", "G9Ivek")
                        .put("iUserId", "477");

                android.util.Log.e("data - ", "data - " + dataToSend.toString());

//Create request object
                Request request = new Request.Builder()
                        .url("written url here")
                        .post(RequestBody.create(JSON, dataToSend.toString().getBytes(Charset.forName("UTF-8"))))
                        .addHeader("Content-Type", "application/json")
                        .build();

                android.util.Log.e("request - ", "request - " + request.toString());
                android.util.Log.e("headers - ", "headers - " + request.headers().toString());
                android.util.Log.e("body - ", "body - " + request.body().toString());

//Make the request
                Response response = client.newCall(request).execute();
                android.util.Log.e("response", " " + response.body().string()); //Convert the response to String
                String responseData = response.body().string();

//Construct JSONObject of the response string
                JSONObject dataReceived = new JSONObject(responseData);

//See the response from the server
                Log.i("response data", dataReceived.toString());
            }
            catch (Exception e){
                e.printStackTrace();
            }
            return fact;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            TextView text = (TextView) findViewById(R.id.txtJson);
            text.setText(s); 
            progressDialog.dismiss();
        }
    }

Kindly tell me how to show response of this in listview. Thanks