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/
您只需声明一个简单的 class,其中包含您需要发送到服务器的所有数据(根据您的 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();
}
}
});
我在 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/
您只需声明一个简单的 class,其中包含您需要发送到服务器的所有数据(根据您的 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();
}
}
});