我对PHP、JavaScript和许多其他脚本语言很有经验,但我对Java或Android没有太多经验。
我正在寻找一种方法将POST数据发送到PHP脚本并显示结果。
我对PHP、JavaScript和许多其他脚本语言很有经验,但我对Java或Android没有太多经验。
我正在寻找一种方法将POST数据发送到PHP脚本并显示结果。
当前回答
你可以使用URLConnection setDoOutput(true), getOutputStream()(用于发送数据),和getInputStream()(用于接收)。Sun在这方面有一个例子。
其他回答
下面是一个完整的解决方案,它运行在后台线程中,向Web API发送一个HTTPS POST多部分请求。实际测试和工作代码。注意:“\n”字符需要在顶部的“最终字符串”中进行正确的请求格式化。
我有困难要么理解,转换,或完成以上解决方案,我的多部分POST需求。
@Override
protected Integer doInBackground(String... files) {
final String MULTIPART_BOUNDARY = "xxYYzzSEPARATORzzYYxx";
final String MULTIPART_SEPARATOR = "--" + MULTIPART_BOUNDARY + "\n";
final String MULTIPART_FORM_DATA = "Content-Disposition: form-data; name=\"%s\"\n\n";
final String FORM_DATA_FILE1 = "file1";
final String FORM_DATA_FILE2 = "file2";
OutputStream outputStream;
Integer responseCode = 0;
try {
URL url = new URL("https://www.example.com/api/endpoint?n1=v1&n2=v2");
HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + MULTIPART_BOUNDARY);
urlConnection.setConnectTimeout(6000);
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
outputStream = new BufferedOutputStream(urlConnection.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
writer.write(MULTIPART_SEPARATOR);
writer.write(String.format(MULTIPART_FORM_DATA, FORM_DATA_FILE1));
writer.write(files[0]);
writer.write(MULTIPART_SEPARATOR);
writer.write(String.format(MULTIPART_FORM_DATA, FORM_DATA_FILE2));
writer.write(files[1]);
writer.write(MULTIPART_SEPARATOR);
writer.flush();
writer.close();
outputStream.close();
urlConnection.connect();
responseCode = urlConnection.getResponseCode();
Log.d("ResponseCode:", String.valueOf(responseCode));
urlConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return responseCode;
}
这是一个如何在不使用外部Apache库的情况下POST多部分数据的例子:
byte[] buffer = getBuffer();
if(buffer.length > 0) {
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "RQdzAAihJq7Xp1kjraqf";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
// Send parameter #1
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"param1\"" + lineEnd);
dos.writeBytes("Content-Type: text/plain; charset=US-ASCII" + lineEnd);
dos.writeBytes("Content-Transfer-Encoding: 8bit" + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(myStringData + lineEnd);
// Send parameter #2
//dos.writeBytes(twoHyphens + boundary + lineEnd);
//dos.writeBytes("Content-Disposition: form-data; name=\"param2\"" + lineEnd + lineEnd);
//dos.writeBytes("foo2" + lineEnd);
// Send a binary file
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"param3\";filename=\"test_file.dat\"" + lineEnd);
dos.writeBytes("Content-Type: application/octet-stream" + lineEnd);
dos.writeBytes("Content-Transfer-Encoding: binary" + lineEnd);
dos.writeBytes(lineEnd);
dos.write(buffer);
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
dos.flush();
dos.close();
ByteArrayInputStream content = new ByteArrayInputStream(baos.toByteArray());
BasicHttpEntity entity = new BasicHttpEntity();
entity.setContent(content);
HttpPost httpPost = new HttpPost(myURL);
httpPost.addHeader("Connection", "Keep-Alive");
httpPost.addHeader("Content-Type", "multipart/form-data; boundary="+boundary);
//MultipartEntity entity = new MultipartEntity();
//entity.addPart("param3", new ByteArrayBody(buffer, "test_file.dat"));
//entity.addPart("param1", new StringBody(myStringData));
httpPost.setEntity(entity);
/*
String httpData = "";
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
entity.writeTo(baos1);
httpData = baos1.toString("UTF-8");
*/
/*
Header[] hdrs = httpPost.getAllHeaders();
for(Header hdr: hdrs) {
httpData += hdr.getName() + " | " + hdr.getValue() + " |_| ";
}
*/
//Log.e(TAG, "httpPost data: " + httpData);
response = httpClient.execute(httpPost);
}
在新版本的Android中,你必须把所有的web I/O请求放到一个新的线程中。AsyncTask最适合小请求。
如果你只是想把数据附加到Url,你可以通过使用httppurlconnection来实现,因为HttpClient现在已经弃用了。 更好的方法是使用像-这样的库
凌空抽射 改造
我们可以将数据发送到php脚本,并通过使用AsyncTask类执行的代码来获取结果并显示它。
private class LongOperation extends AsyncTask<String, Void, Void> {
// Required initialization
private String Content;
private String Error = null;
private ProgressDialog Dialog = new ProgressDialog(Login.this);
String data ="";
int sizeData = 0;
protected void onPreExecute() {
// NOTE: You can call UI Element here.
//Start Progress Dialog (Message)
Dialog.setMessage("Please wait..");
Dialog.show();
Dialog.setCancelable(false);
Dialog.setCanceledOnTouchOutside(false);
try{
// Set Request parameter
data +="&" + URLEncoder.encode("username", "UTF-8") + "="+edittext.getText();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Call after onPreExecute method
protected Void doInBackground(String... urls) {
/************ Make Post Call To Web Server ***********/
BufferedReader reader=null;
// Send data
try
{
// Defined URL where to send data
URL url = new URL(urls[0]);
// Send POST data request
URLConnection conn = url.openConnection();
conn.setConnectTimeout(5000);//define connection timeout
conn.setReadTimeout(5000);//define read timeout
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write( data );
wr.flush();
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null)
{
// Append server response in string
sb.append(line + " ");
}
// Append Server Response To Content String
Content = sb.toString();
}
catch(Exception ex)
{
Error = ex.getMessage();
}
finally
{
try
{
reader.close();
}
catch(Exception ex) {}
}
return null;
}
protected void onPostExecute(Void unused) {
// NOTE: You can call UI Element here.
// Close progress dialog
Dialog.dismiss();
if (Error != null) {
Toast.makeText(getApplicationContext(),"Error encountered",Toast.LENGTH_LONG).show();
}
else {
try {
JSONObject jsonRootObject = new JSONObject(Content);
JSONObject json2 =jsonRootObject.getJSONObject("jsonkey");//pass jsonkey here
String id =json2.optString("id").toString();//parse json to string through parameters
//the result is stored in string id. you can display it now
} catch (JSONException e) {e.printStackTrace();}
}
}
}
但是使用诸如volley或retrofit之类的库是更好的选择,因为Asynctask类和HttpurlConnection相比库更慢。此外,库将获取所有内容,也更快。
您可以使用WebServer类POST一个HttpRequest,并在其侦听器接口中跟踪响应。
WebServer server=new WebServer(getApplicationContext());
server.setOnServerStatusListner(new WebServer.OnServerStatusListner() {
@Override
public void onServerResponded(String responce) {
}
@Override
public void onServerRevoked() {
}
});
现在创建一个DataRack来绑定数据
List<DataRack> racks=new ArrayList<DataRack>();
racks.add(new DataRack("name","Simon"));
racks.add(new DataRack("age","40"));
racks.add(new DataRack("location","Canada"));
现在只需发送带有该机架的POST请求
server.connectWithPOST(MainActivity.this,"http://sangeethnandakumar.esy.es/PROJECTS/PUBLIC_SERVICE/posttest.php",racks);
你需要包括我的库。文件在这里