如何将字符串数据(JSONObject.toString()
)发送到网址。我想在util类中编写一个静态方法来执行此操作。我希望方法签名如下
public static String postData (String url, String postData) throws SomeCustomException
字符串url的格式应该是什么
返回String是来自服务器的响应,作为json数据的字符串表示形式。
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;
}
}
10-16 11:27:27.287:E / log_tag(4935):http连接错误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):在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):无法建立网络连接
答案 0 :(得分:2)
嗯,这是我对你的问题的看法: -
首先,您应该使用POST
方法将数据发送到服务器。它在Android中也很简单且绝对可行。用于发送POST
数据的简单代码段可以是:
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();
}
上述代码将数据发送到服务器上的PHP脚本postdata
。
接下来,为了解析服务器发送的JSON
数据,您可以使用JSONParser
,然后根据需要轻松使用它。您可以使用以下代码从服务器返回响应:
String jsonData = EntityUtils.toString(serverResponse.getEntity());
希望这会有所帮助。感谢。
答案 1 :(得分:2)
我认为在您的代码中,基本问题是由您对网址使用StringEntity
到POST
参数的方式造成的。检查以下代码是否有助于使用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);
希望这有助于解决您的问题。感谢。
答案 2 :(得分:1)
尝试使用此方法,其中strJsonRequest是您要发布的json字符串,strUrl是您要发布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;
}
并且方法convertStreamToString()如下所示
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();
}
答案 3 :(得分:0)
根据服务器端代码的设置方式,服务器有一个用于处理API调用的php页面的url示例格式为:
http://yoururl.com/demo.php?jsondata=postData
如果您使用的是帖子连接,可以简单地说:
http://yoururl.com/demo.php
并传递你的帖子参数,即json字符串
以下是有关如何执行此操作的精彩教程: http://yoururl.com/demo.php?jsondata=postData