簡體   English   中英

Android POST請求到Restify服務器

[英]Android POST request to Restify server

我有此服務器代碼在Node JS上運行。

function onTransactionStart(req, res, next){
  var transaction = {};
  var quantity = {};
  console.log(req);
  var obj=req.query;
  generateToken(8);
  console.log(token);
  transaction._id = token;
  transaction.u_id = obj.u_id;
  transaction.emp_id = obj.emp_id;
  transaction.lat = obj.lat;
  transaction.lon = obj.lon;
  transaction.quantity = quantity;
  transaction.quantity.paper = obj.paper;
  transaction.quantity.plastic = obj.plastic;
  transaction.mode = obj.mode;
  transaction.date = new Date();
  transaction.status = obj.status;
  transactions.save(transaction , function(err , success){
      console.log('Response success '+success);
      console.log('Response error '+err);
      if(success){
          res.send(201 , transaction);
          return next();
      }else{
          return next(err);
      }
  });
}

它的POST路由為:

var TRANSACTION_PATH = '/transaction'
server.post({path : TRANSACTION_PATH , version: '0.0.1'} , onTransactionStart);

在我的Android應用中,我使用異步HttpClient發出POST請求:

public class HttpLibrary extends AsyncTask<String, String, String> {
    private HashMap<String, String> mData = null;// post data

    /**
     * constructor
     */
    public HttpLibrary(HashMap<String, String> data) {
        mData = data;
    }

    /**
     * background
     */
    @Override
    protected String doInBackground(String... params) {
        byte[] result = null;
        String str = "";
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(params[0]);// in this case, params[0] is URL

        try {
            // set up post data
            ArrayList<NameValuePair> nameValuePair = new ArrayList<>();
            Iterator<String> it = mData.keySet().iterator();
            while (it.hasNext()) {
                String key = it.next();
                nameValuePair.add(new BasicNameValuePair(key, mData.get(key)));
            }
            post.setHeader("Content-Type", "application/json");

            post.setEntity(new UrlEncodedFormEntity(nameValuePair, "UTF-8"));
            Log.i("Param",post.getParams().toString());
            Log.i("Request", post.getParams().toString());
            HttpResponse response = client.execute(post);
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == HttpURLConnection.HTTP_OK){
                result = EntityUtils.toByteArray(response.getEntity());
                str = new String(result, "UTF-8");
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        return str;
    }

    /**
     * on getting result
     */
    @Override
    protected void onPostExecute(String result) {
        // something...

       Log.i("error",result);
    }
}

我將代碼用作:

public void onClick(View v) {
                try {
                    HttpURLConnection httpcon = (HttpURLConnection) ((new URL("http://ecosquare.herokuapp.com/transaction?" +
                            "u_id=8767856743&emp_id=9804770561&lat=22.56&lon=88.34&paper=20&plastic=10&mode=cash&status=init").openConnection()));
                    httpcon.setDoOutput(true);
                    httpcon.setRequestProperty("Content-Type", "application/json");
                    httpcon.setRequestProperty("Accept", "application/json");
                    httpcon.setRequestMethod("POST");
                    httpcon.connect();

                    byte[] outputBytes = "{'value': 7.5}".getBytes("UTF-8");
                    OutputStream os = httpcon.getOutputStream();
                    os.write(outputBytes);

                    os.close();
                }catch (Exception e){
                    Toast.makeText(getBaseContext(), "Error "+e.toString(), Toast.LENGTH_LONG).show();
                }
                HashMap<String, String> data = new HashMap<String, String>();
                data.put("u_id", "8981169454");
                data.put("emp_id", "9804770561");
                data.put("lat",Double.toString(lat));
                data.put("lon",Double.toString(lon));
                data.put("paper","10");
                data.put("plastic","10");
                data.put("mode","cash");
                data.put("status", "init");
                HttpLibrary post = new HttpLibrary(data);
                post.execute("http://ecosquare.herokuapp.com/transaction?u_id=8981169454&emp_id=9804770561" +
                        "&lat="+data.get("lat")+"&lon="+data.get("lon")+"&paper=20&plastic=10&mode=cash&status=init");
                Toast.makeText(getBaseContext(), "Data : "+data, Toast.LENGTH_LONG).show();
            }

但是POST無法正常工作。 請幫忙。 我是Android新手。 謝謝。

如果您現在使用的是Android,建議您使用一些庫進行改造http://square.github.io/retrofit/

您只需要聲明一個簡單類,其中包含要發送到服務器的所有數據(根據json對象)和一個簡單接口。 您將獲得更快,更高效的通信。

您甚至可以使用Volley https://developer.android.com/training/volley/index.html

我使用了Ion Framework,它的工作原理很吸引人。 簡單,快速。

Ion.with(getApplicationContext())
                        .load("http://example.com/transaction")
                        .setJsonObjectBody(json)
                        .asJsonObject()
                        .setCallback(new FutureCallback<JsonObject>() {
                            @Override
                            public void onCompleted(Exception e, JsonObject result) {
                                if(e!=null){
                                    Toast.makeText(getBaseContext(), "Data : "+e.getStackTrace(), Toast.LENGTH_LONG).show();
                                }else{
                                    Toast.makeText(getBaseContext(), "Data added successfully! We will contact you soon.", Toast.LENGTH_LONG).show();
                                }
                            }
                        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM