如何使用 Android 通过请求发送 JSON 对象?

我想发送以下 JSON 文本

{"Email":"aaa@tbbb.com","Password":"123456"}

并读取响应。我知道如何阅读 JSON。问题是上面的 JSON 对象必须以变量名 jason发送。

如何在 android 上实现这一点? 有哪些步骤,比如创建请求对象、设置内容头等。

237234 次浏览

Android 没有发送和接收 HTTP 的特殊代码,你可以使用标准的 Java 代码。我建议使用 Android 附带的 ApacheHTTP 客户端。下面是我用来发送 HTTPPOST 的代码片段。

我不明白把对象发送到一个名为“ jason”的变量中有什么关系。如果您不确定服务器到底想要什么,可以考虑编写一个测试程序来向服务器发送各种字符串,直到您知道它需要什么格式为止。

int TIMEOUT_MILLISEC = 10000;  // = 10 seconds
String postMessage="{}"; //HERE_YOUR_POST_STRING.
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
HttpClient client = new DefaultHttpClient(httpParams);


HttpPost request = new HttpPost(serverUrl);
request.setEntity(new ByteArrayEntity(
postMessage.toString().getBytes("UTF8")));
HttpResponse response = client.execute(request);

如果使用 ApacheHTTPClient,从 Android 发送 json 对象是很容易的。这里有一个关于如何做到这一点的代码示例。您应该为网络活动创建一个新线程,这样就不会锁定 UI 线程。

    protected void sendJson(final String email, final String pwd) {
Thread t = new Thread() {


public void run() {
Looper.prepare(); //For Preparing Message Pool for the child Thread
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
HttpResponse response;
JSONObject json = new JSONObject();


try {
HttpPost post = new HttpPost(URL);
json.put("email", email);
json.put("password", pwd);
StringEntity se = new StringEntity( json.toString());
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);


/*Checking response */
if(response!=null){
InputStream in = response.getEntity().getContent(); //Get the data in the entity
}


} catch(Exception e) {
e.printStackTrace();
createDialog("Error", "Cannot Estabilish Connection");
}


Looper.loop(); //Loop in the message queue
}
};


t.start();
}

您还可以使用 谷歌 Gson来发送和检索 JSON。

public void postData(String url,JSONObject obj) {
// Create a new HttpClient and Post Header


HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);
HttpClient httpclient = new DefaultHttpClient(myParams );
String json=obj.toString();


try {


HttpPost httppost = new HttpPost(url.toString());
httppost.setHeader("Content-type", "application/json");


StringEntity se = new StringEntity(obj.toString());
se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.setEntity(se);


HttpResponse response = httpclient.execute(httppost);
String temp = EntityUtils.toString(response.getEntity());
Log.i("tag", temp);




} catch (ClientProtocolException e) {


} catch (IOException e) {
}
}

在下面的链接中有一个非常好的 Android HTTP 库:

Http://loopj.com/android-async-http/

简单的要求很简单:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
System.out.println(response);
}
});

发送 JSON (在 https://github.com/loopj/android-async-http/issues/125上的‘ voidberg’的信用) :

// params is a JSONObject
StringEntity se = null;
try {
se = new StringEntity(params.toString());
} catch (UnsupportedEncodingException e) {
// handle exceptions properly!
}
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));


client.post(null, "www.example.com/objects", se, "application/json", responseHandler);

它完全是异步的,在 Android 上运行良好,从 UI 线程调用也很安全。Response seHandler 将在您创建它的同一个线程(通常是您的 UI 线程)上运行。它甚至有一个用于 JSON 的内置 ResonseHandler,但是我更喜欢使用 google gson。

Android Api Level 22不赞成使用 HttpPost。因此,请进一步使用 HttpUrlConnection

public static String makeRequest(String uri, String json) {
HttpURLConnection urlConnection;
String url;
String data = json;
String result = null;
try {
//Connect
urlConnection = (HttpURLConnection) ((new URL(uri).openConnection()));
urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Content-Type", "application/json");
urlConnection.setRequestProperty("Accept", "application/json");
urlConnection.setRequestMethod("POST");
urlConnection.connect();


//Write
OutputStream outputStream = urlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
writer.write(data);
writer.close();
outputStream.close();


//Read
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));


String line = null;
StringBuilder sb = new StringBuilder();


while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
}


bufferedReader.close();
result = sb.toString();


} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}

Now since the HttpClient is deprecated the current working code is to use the HttpUrlConnection to create the connection and write the and read from the connection. But I preferred to use the 齐射. This library is from android AOSP. I found very easy to use to make JsonObjectRequest or JsonArrayRequest

没有比这更简单的了。使用 OkHttpLibrary

创造你的 Json

JSONObject requestObject = new JSONObject();
requestObject.put("Email", email);
requestObject.put("Password", password);

然后像这样发送。

OkHttpClient client = new OkHttpClient();


RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.addHeader("Content-Type","application/json")
.url(url)
.post(requestObject.toString())
.build();


okhttp3.Response response = client.newCall(request).execute();
public class getUserProfile extends AsyncTask<Void, String, JSONArray> {
JSONArray array;
@Override
protected JSONArray doInBackground(Void... params) {


try {
commonurl cu = new commonurl();
String u = cu.geturl("tempshowusermain.php");
URL url =new URL(u);
//  URL url = new URL("http://192.168.225.35/jabber/tempshowusermain.php");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Content-Type", "application/json");
httpURLConnection.setRequestProperty("Accept", "application/json");
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setDoInput(true);
httpURLConnection.connect();


JSONObject jsonObject=new JSONObject();
jsonObject.put("lid",lid);




DataOutputStream outputStream = new DataOutputStream(httpURLConnection.getOutputStream());
outputStream.write(jsonObject.toString().getBytes("UTF-8"));


int code = httpURLConnection.getResponseCode();
if (code == 200) {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));


StringBuffer stringBuffer = new StringBuffer();
String line;


while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line);
}
object =  new JSONObject(stringBuffer.toString());
//   array = new JSONArray(stringBuffer.toString());
array = object.getJSONArray("response");


}


} catch (Exception e) {


e.printStackTrace();
}
return array;




}


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






}


@Override
protected void onPostExecute(JSONArray array) {
super.onPostExecute(array);
try {
for (int x = 0; x < array.length(); x++) {


object = array.getJSONObject(x);
ComonUserView commUserView=new ComonUserView();//  commonclass.setId(Integer.parseInt(jsonObject2.getString("pid").toString()));
//pidArray.add(jsonObject2.getString("pid").toString());


commUserView.setLid(object.get("lid").toString());
commUserView.setUname(object.get("uname").toString());
commUserView.setAboutme(object.get("aboutme").toString());
commUserView.setHeight(object.get("height").toString());
commUserView.setAge(object.get("age").toString());
commUserView.setWeight(object.get("weight").toString());
commUserView.setBodytype(object.get("bodytype").toString());
commUserView.setRelationshipstatus(object.get("relationshipstatus").toString());
commUserView.setImagepath(object.get("imagepath").toString());
commUserView.setDistance(object.get("distance").toString());
commUserView.setLookingfor(object.get("lookingfor").toString());
commUserView.setStatus(object.get("status").toString());


cm.add(commUserView);
}
custuserprof = new customadapterformainprofile(getActivity(),cm,Tab3.this);
gridusername.setAdapter(custuserprof);
//  listusername.setAdapter(custuserprof);
} catch (Exception e) {


e.printStackTrace();
}
}