问题
How would I send a string data (JSONObject.toString()
) to a url. I want to write a static method in a util class to do this. I want the method signature to be as follows
public static String postData (String url, String postData) throws SomeCustomException
What should be the format of the string url
The return String is the response from the server in as a string representation of json data.
EDIT
Present connection util
package my.package;
import my.package.exceptions.CustomException;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
public class ConnectionUtil {
public static String postData(String url, String postData)
throws CustomException {
// Create a new HttpClient and Post Header
InputStream is = null;
StringBuilder sb = null;
String result = "";
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost();
httppost.setHeader("host", url);
Log.v("ConnectionUtil", "Opening POST connection to URI = " + httppost.getURI() + " url = " + URLDecoder.decode(url));
try {
httppost.setEntity(new StringEntity(postData));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Error in http connection " + e.toString());
e.printStackTrace();
throw new CustomException("Could not establish network connection");
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "utf-8"), 8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
throw new CustomException("Error parsing the response");
}
Log.v("ConnectionUtil", "Sent: "+postData);
Log.v("ConnectionUtil", "Got result "+result);
return result;
}
}
Logcat output
10-16 11:27:27.287: E/log_tag(4935): Error in http connection java.lang.NullPointerException 10-16 11:27:27.287: W/System.err(4935): java.lang.NullPointerException 10-16 11:27:27.287: W/System.err(4935): at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:496) 10-16 11:27:27.307: W/System.err(4935): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 10-16 11:27:27.327: W/System.err(4935): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 10-16 11:27:27.327: W/System.err(4935): at in.gharpay.zap.integration.ConnectionUtil.postData(ConnectionUtil.java:92) 10-16 11:27:27.327: W/System.err(4935): at in.gharpay.zap.integration.ZapTransaction$1.doInBackground(ZapTransaction.java:54) 10-16 11:27:27.327: W/System.err(4935): at in.gharpay.zap.integration.ZapTransaction$1.doInBackground(ZapTransaction.java:1) 10-16 11:27:27.327: W/System.err(4935): at android.os.AsyncTask$2.call(AsyncTask.java:185) 10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 10-16 11:27:27.327: W/System.err(4935): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 10-16 11:27:27.327: W/System.err(4935): at java.lang.Thread.run(Thread.java:1019) 10-16 11:27:27.327: V/log_tag(4935): Could not establish network connection
回答1:
I think in your code the basic problem is caused by the way you are using StringEntity
to POST
parameters to your url. Check to see if the following code helps in posting your data to the server using StringEntity
.
// Build the JSON object to pass parameters
JSONObject jsonObj = new JSONObject();
jsonObj.put("username", username);
jsonObj.put("data", dataValue);
// Create the POST object and add the parameters
HttpPost httpPost = new HttpPost(url);
StringEntity entity = new StringEntity(jsonObj.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
httpPost.setEntity(entity);
HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpPost);
Hope this helps in solving your problem. Thanks.
回答2:
Well, here are my thoughts on your question:-
First, you should simply send the data to the server by using
POST
method. Its easy and absolutely possible in Android also. A simple code snippet for sendingPOST
data can be like:HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost( "http://yourserverIP/postdata.php"); String serverResponse = null; try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("datakey1", dataValue1)); nameValuePairs.add(new BasicNameValuePair("datakey2", dataValue2)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); serverResponse = response.getStatusLine().toString(); Log.e("response", serverResponse); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
The above code sends data to a PHP script
postdata
on your server.Next, for parsing the
JSON
data sent by the server, you can use aJSONParser
and then easily utilize it as per your needs. You can get the response returned from the server by using the following code:String jsonData = EntityUtils.toString(serverResponse.getEntity());
Hope this helps. Thanks.
回答3:
try using this method where strJsonRequest is the json string you want to post and the strUrl is the url to which you want to post the strJsonRequest
public String urlPost(String strJsonRequest, String strURL) throws Exception
{
try
{
URL objURL = new URL(strURL);
connection = (HttpURLConnection)objURL.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setAllowUserInteraction(false);
connection.setUseCaches(false);
connection.setConnectTimeout(TIMEOUT_CONNECT_MILLIS);
connection.setReadTimeout(TIMEOUT_READ_MILLIS);
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept-Charset", "utf-8");
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.setRequestProperty("Content-Length", ""+strJsonRequest.toString().getBytes("UTF8").length);
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
byte [] b = strJsonRequest.getBytes("UTF-8");
outputStream.write(b);
outputStream.flush();
inputstreamObj = (InputStream) connection.getContent();//getInputStream();
if(inputstreamObj != null)
strResponse = convertStreamToString(inputstreamObj);
}
catch(Exception e)
{
throw e;
}
return strResponse;
}
and the method convertStreamToString() is as below
private static String convertStreamToString(InputStream is)
{
/*
* To convert the InputStream to String we use the BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a StringBuilder
* and returned as String.
*/
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(is));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
StringBuilder sb = new StringBuilder();
String line = null;
try
{
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return sb.toString();
}
回答4:
Depending on how your server side code is set up, an example format of the url where your server has a php page to handle the API call would be:
http://yoururl.com/demo.php?jsondata=postData
If your are using a post connection you can simply say:
http://yoururl.com/demo.php
and pass it your post parameters i.e. the json string
Here is a great tutorial on how to do this: http://yoururl.com/demo.php?jsondata=postData
来源:https://stackoverflow.com/questions/12907683/android-httpclient-defaulthttpclient-httppost