【问题标题】:Send and receive data from server using 6.0 API (Android)使用 6.0 API (Android) 从服务器发送和接收数据
【发布时间】:2016-06-02 19:03:39
【问题描述】:

我真的很困惑,我正在尝试开发一个简单的功能,允许我从服务器发送和接收数据。

操作如下:

在我对服务器上的 PHP 文件执行 HTTP POST 的活动中,“PHP 文件”获取我发送的数据(通常是字符串),并使用通过 http 发送的参数执行查询。

例子:

我的android应用发送一个带有这个值“PIPPO”的字符串,在PHP文件中有一个查询,例如:

$value = PIPPO /* 从安卓应用接收到的数据*/ 从字符中选择 * where(characters.name=".$value.")

附言所有数据使用JSON格式

问题是: 我一直使用一个函数(效果很好),但现在所有方法都已弃用,我找不到最新 API 方法的替代方法。

这是我的代码:

public class ReadServer extends Activity {
 String result;
 public String readserver(String id_data, String data){
 try{
  HttpClient httpclient = new DefaultHttpClient();
  HttpPost httpPost = new HttpPost("myurl/queryMobile.php");
  StringBuilder builder = new StringBuilder();
  String json = "";
  //Build jsonObject
  JSONObject jsonObject = new JSONObject();
  jsonObject.accumulate(id_data, data);
  //Convert JSONObject to JSON to String
  json = jsonObject.toString();

  //Set json to StringEntity
  StringEntity se = new StringEntity(json);
  //Set httpPost Entity
  httpPost.setEntity(se);
  //Set some headers to inform server about the type of the content
  httpPost.setHeader("Accept", "application/json");
  httpPost.setHeader("Content-type", "application/json");

  //Execute POST request to the given URL
  HttpResponse httpResponse = httpclient.execute(httpPost);
  //Receive response as inputStream
  StatusLine statusLine = httpResponse.getStatusLine();
  int statusCode = statusLine.getStatusCode();
  //Convert input stream to string
  AlertDialog.Builder alertDialog;

  switch(statusCode){
  case 200:
  HttpEntity entity = httpResponse.getEntity();
  InputStream content = entity.getContent();
  BufferedReader reader = new BufferedReader(new InputStreamReader(content));
  String line="";
  try{
  while ((line = reader.readLine()) != null) {
  builder.append(line);
  result = builder.toString();
  }
  }catch(Exception e){
  alertDialog = new AlertDialog.Builder(this);
  alertDialog.setTitle("400 Bad Request");
  alertDialog.setMessage("Non è stato possibile soddisfare la tua richiesta, riprova più tardi.");
  alertDialog.show();
  }
  break;

【问题讨论】:

  • 发布您的整个代码和错误堆栈跟踪。
  • 你可以使用okHttp library

标签: php android json http-post deprecated


【解决方案1】:

试试这段代码。 :)

    public class MainActivity extends AppCompatActivity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      new Test().execute();
     }


     //AsyncTask 
     class Test extends AsyncTask < String, Void, String > {

      @Override
      protected String doInBackground(String...params) {
       InputStream in = null;
       String queryResult = "";
       URL url = new URL("http://www.android.com/");
       HttpURLConnection urlConnection = (HttpURLConnection)          url.openConnection();

      //add parameters
      urlConnection.setReadTimeout(10000);
      urlConnection.setConnectTimeout(15000);
      urlConnection.setRequestMethod("POST");
      urlConnection.setDoInput(true);
      urlConnection.setDoOutput(true);

     List<NameValuePair> params = new ArrayList<NameValuePair>();
     params.add(new BasicNameValuePair("firstParam", paramValue1));
     params.add(new BasicNameValuePair("secondParam", paramValue2));
     params.add(new BasicNameValuePair("thirdParam", paramValue3));
       try {
    //write OutputStream
    OutputStream os = urlConnection.getOutputStream();
    BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(os, "UTF-8"));
    writer.write(getQuery(params));
    writer.flush();
    writer.close();
    os.close();


        InputStream in = new     BufferedInputStream(urlConnection.getInputStream());
        queryResult = readStream( in );
       } finally {
        urlConnection.disconnect();
       }
       return queryResult;

      }
      private String readStream(InputStream iStream) throws IOException {

       //Buffered reader allows us to read line by line
       try (BufferedReader bReader =
        new BufferedReader(new InputStreamReader(iStream))) {
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = bReader.readLine()) != null) { //Read till end
         builder.append(line);
        }
        return builder.toString();
       }
      }
    private String getQuery(List<NameValuePair> params) throws   UnsupportedEncodingException
    {
        StringBuilder result = new StringBuilder();
        boolean first = true;

        for (NameValuePair pair : params)
        {
            if (first)
                first = false;
            else
                result.append("&");

            result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
            result.append("=");
            result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
        }

        return result.toString();
    }
      protected void onPostExecute(String data) {
       // do further things 
       Toast toast = Toast.makeText(getApplicationContext(), data,
        Toast.LENGTH_SHORT);
       toast.show();

      }

     }

    }

【讨论】:

    【解决方案2】:

    也许是您开始使用凌空抽射的时候了。这是一个很棒的库,专为解决您的目的而设计。

    对凌空一无所知。好吧,别担心。 Here 是一个完美的视频,告诉你凌空的能力。它包括了将它包含在你的项目中的所有步骤(尽管它只是提到了 gradle 依赖)

    我还提到了如何在代码中使用它的示例。

    public class MainActivity extends Activity {
        private TextView txtDisplay;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_main);
             txtDisplay = (TextView) findViewById(R.id.txtDisplay);
    
             RequestQueue queue = Volley.newRequestQueue(this);
             String url = "myurl/queryMobile.php";
    
             JSONObject params = new JSONObject();
             params.put("name", "Dexter");
    
             JsonObjectRequest jsObjRequest = 
                     new JsonObjectRequest(Request.Method.POST,
                              url,
                              param,
                              new Response.Listener<JSONObject>() {
                                  @Override
                                  public void onResponse(JSONObject response) {
                                  // TODO Auto-generated method stub
                                  txtDisplay.setText("Response => "+response.toString());
                                  findViewById(R.id.progressBar1).setVisibility(View.GONE);
    }}, 
                             new Response.ErrorListener() {
                                  @Override
                                  public void onErrorResponse(VolleyError error) {
                                  // TODO Auto-generated method stub
                                  }
                             });
      queue.add(jsObjRequest);
      }
    }
    

    原始代码(和教程)可在here获取。

    相信我有一天你将不得不转向截击,为什么不今天!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      • 2013-01-14
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多