在Android中发送POST数据

我对PHP、JavaScript和许多其他脚本语言很有经验,但我对Java或Android没有太多经验。

我正在寻找一种方法将帖子数据发送到PHP脚本并显示结果。

543557 次浏览

你可以使用URLConnectionsetDoOutput(true)getOutputStream()(用于发送数据),而且 getInputStream()(用于接收数据)。太阳有setDoOutput0 setDoOutput1。

最好使用Apache Commons HttpClient,这也已经包含在android中。 看一看 Android Developer: Apache HTTP Client Package Summary

注(2020年10月):以下答案中使用的AsyncTask已在Android API级别30中弃用。请参考官方文档这篇博文获得更更新的示例

更新(2017年6月)答案,适用于Android 6.0+。感谢@Rohit Suthar@Tamis Bolvari@sudhiskr的评论。

    public class CallAPI extends AsyncTask<String, String, String> {
    

public CallAPI(){
//set context variables if required
}
    

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

@Override
protected String doInBackground(String... params) {
String urlString = params[0]; // URL to call
String data = params[1]; //data to post
OutputStream out = null;


try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
out = new BufferedOutputStream(urlConnection.getOutputStream());


BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
writer.write(data);
writer.flush();
writer.close();
out.close();


urlConnection.connect();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

引用:

最初的答案(2010年5月

备注:本方案已过时。它只能在5.1版本以下的安卓设备上运行。Android 6.0及以上版本不包括本回答中使用的Apache http客户端

来自Apache Commons的Http Client是可行的。它已经包含在android中。下面是一个简单的例子,说明如何使用它来执行HTTP Post。

public void postData() {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.yoursite.com/script.php");


try {
// Add your data
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "Hi"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));


// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
        

} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
}

@primpop的答案,我会添加如何转换字符串中的响应:

HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();


String result = RestClient.convertStreamToString(instream);
Log.i("Read from server", result);
}

下面是一个convertStramToString的例子

这是一个如何在不使用外部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);
}

通过这种方式,我们可以用http post方法发送数据并获得结果

     public class MyHttpPostProjectActivity extends Activity implements OnClickListener {


private EditText usernameEditText;
private EditText passwordEditText;
private Button sendPostReqButton;
private Button clearButton;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);


usernameEditText = (EditText) findViewById(R.id.login_username_editText);
passwordEditText = (EditText) findViewById(R.id.login_password_editText);


sendPostReqButton = (Button) findViewById(R.id.login_sendPostReq_button);
sendPostReqButton.setOnClickListener(this);


clearButton = (Button) findViewById(R.id.login_clear_button);
clearButton.setOnClickListener(this);
}


@Override
public void onClick(View v) {


if(v.getId() == R.id.login_clear_button){
usernameEditText.setText("");
passwordEditText.setText("");
passwordEditText.setCursorVisible(false);
passwordEditText.setFocusable(false);
usernameEditText.setCursorVisible(true);
passwordEditText.setFocusable(true);
}else if(v.getId() == R.id.login_sendPostReq_button){
String givenUsername = usernameEditText.getEditableText().toString();
String givenPassword = passwordEditText.getEditableText().toString();


System.out.println("Given username :" + givenUsername + " Given password :" + givenPassword);


sendPostRequest(givenUsername, givenPassword);
}
}


private void sendPostRequest(String givenUsername, String givenPassword) {


class SendPostReqAsyncTask extends AsyncTask<String, Void, String>{


@Override
protected String doInBackground(String... params) {


String paramUsername = params[0];
String paramPassword = params[1];


System.out.println("*** doInBackground ** paramUsername " + paramUsername + " paramPassword :" + paramPassword);


HttpClient httpClient = new DefaultHttpClient();


// In a POST request, we don't pass the values in the URL.
//Therefore we use only the web page URL as the parameter of the HttpPost argument
HttpPost httpPost = new HttpPost("http://www.nirmana.lk/hec/android/postLogin.php");


// Because we are not passing values over the URL, we should have a mechanism to pass the values that can be
//uniquely separate by the other end.
//To achieve that we use BasicNameValuePair
//Things we need to pass with the POST request
BasicNameValuePair usernameBasicNameValuePair = new BasicNameValuePair("paramUsername", paramUsername);
BasicNameValuePair passwordBasicNameValuePAir = new BasicNameValuePair("paramPassword", paramPassword);


// We add the content that we want to pass with the POST request to as name-value pairs
//Now we put those sending details to an ArrayList with type safe of NameValuePair
List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
nameValuePairList.add(usernameBasicNameValuePair);
nameValuePairList.add(passwordBasicNameValuePAir);


try {
// UrlEncodedFormEntity is an entity composed of a list of url-encoded pairs.
//This is typically useful while sending an HTTP POST request.
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairList);


// setEntity() hands the entity (here it is urlEncodedFormEntity) to the request.
httpPost.setEntity(urlEncodedFormEntity);


try {
// HttpResponse is an interface just like HttpPost.
//Therefore we can't initialize them
HttpResponse httpResponse = httpClient.execute(httpPost);


// According to the JAVA API, InputStream constructor do nothing.
//So we can't initialize InputStream although it is not an interface
InputStream inputStream = httpResponse.getEntity().getContent();


InputStreamReader inputStreamReader = new InputStreamReader(inputStream);


BufferedReader bufferedReader = new BufferedReader(inputStreamReader);


StringBuilder stringBuilder = new StringBuilder();


String bufferedStrChunk = null;


while((bufferedStrChunk = bufferedReader.readLine()) != null){
stringBuilder.append(bufferedStrChunk);
}


return stringBuilder.toString();


} catch (ClientProtocolException cpe) {
System.out.println("First Exception caz of HttpResponese :" + cpe);
cpe.printStackTrace();
} catch (IOException ioe) {
System.out.println("Second Exception caz of HttpResponse :" + ioe);
ioe.printStackTrace();
}


} catch (UnsupportedEncodingException uee) {
System.out.println("An Exception given because of UrlEncodedFormEntity argument :" + uee);
uee.printStackTrace();
}


return null;
}


@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);


if(result.equals("working")){
Toast.makeText(getApplicationContext(), "HTTP POST is working...", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getApplicationContext(), "Invalid POST req...", Toast.LENGTH_LONG).show();
}
}
}


SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
sendPostReqAsyncTask.execute(givenUsername, givenPassword);
}
}

方法将数据作为HTTP请求发布,

public static InputStream callPostService(String Url,
List<NameValuePair> data) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(Url);
try {
httppost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
return entity.getContent();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

在新版本的Android中,你必须把所有的web I/O请求放到一个新的线程中。AsyncTask最适合小请求。

你可以使用以下方法将HTTP-POST请求发送到URL并接收响应。我总是用这个:

try {
AsyncHttpClient client = new AsyncHttpClient();
// Http Request Params Object
RequestParams params = new RequestParams();
String u = "B2mGaME";
String au = "gamewrapperB2M";
// String mob = "880xxxxxxxxxx";
params.put("usr", u.toString());
params.put("aut", au.toString());
params.put("uph", MobileNo.toString());
//  params.put("uph", mob.toString());
client.post("http://196.6.13.01:88/ws/game_wrapper_reg_check.php", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
playStatus = response;
//////Get your Response/////
Log.i(getClass().getSimpleName(), "Response SP Status. " + playStatus);
}
@Override
public void onFailure(Throwable throwable) {
super.onFailure(throwable);
}
});
} catch (Exception e) {
e.printStackTrace();
}

你还需要在libs文件夹中添加风箱Jar文件

android-async-http-1.3.1.jar

最后,我编辑了你的build.gradle:

dependencies {
compile files('libs/<android-async-http-1.3.1.jar>')
}

在最后一个重建你的项目。

对于5 . Android = >

org.apache.http类和AndroidHttpClient类在Android 5.1中已经是弃用。这些类不再被维护,你应该尽快将任何使用这些api的应用程序代码迁移到URLConnection类中。

https://developer.android.com/about/versions/android-5.1.html#http

考虑使用HttpUrlConnection共享我的代码

public String  performPostCall(String requestURL,
HashMap<String, String> postDataParams) {


URL url;
String response = "";
try {
url = new URL(requestURL);


HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(true);




OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));


writer.flush();
writer.close();
os.close();
int responseCode=conn.getResponseCode();


if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line=br.readLine()) != null) {
response+=line;
}
}
else {
response="";


}
} catch (Exception e) {
e.printStackTrace();
}


return response;
}

...

private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException{
StringBuilder result = new StringBuilder();
boolean first = true;
for(Map.Entry<String, String> entry : params.entrySet()){
if (first)
first = false;
else
result.append("&");


result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}


return result.toString();
}

你也可以帖子方法:

conn.setRequestMethod("POST");

更新21/02/2016

对于帖子请求使用json,请参见这个例子:

public class Empty extends
AsyncTask<Void, Void, Boolean> {


String urlString = "http://www.yoursite.com/";


private final String TAG = "post json example";
private Context context;


private int advertisementId;


public Empty(Context contex, int advertisementId) {


this.context = contex;
this.advertisementId = advertisementId;
}


@Override
protected void onPreExecute() {
Log.e(TAG, "1 - RequestVoteTask is about to start...");


}


@Override
protected Boolean doInBackground(Void... params) {
boolean status = false;


String response = "";
Log.e(TAG, "2 - pre Request to response...");


try {
response = performPostCall(urlString, new HashMap<String, String>() {


private static final long serialVersionUID = 1L;


{
put("Accept", "application/json");
put("Content-Type", "application/json");
}
});
Log.e(TAG, "3 - give Response...");
Log.e(TAG, "4 " + response.toString());
} catch (Exception e) {
// displayLoding(false);


Log.e(TAG, "Error ...");
}
Log.e(TAG, "5 - after Response...");


if (!response.equalsIgnoreCase("")) {
try {
Log.e(TAG, "6 - response !empty...");
//
JSONObject jRoot = new JSONObject(response);
JSONObject d = jRoot.getJSONObject("d");


int ResultType = d.getInt("ResultType");
Log.e("ResultType", ResultType + "");


if (ResultType == 1) {


status = true;


}


} catch (JSONException e) {
// displayLoding(false);
// e.printStackTrace();
Log.e(TAG, "Error " + e.getMessage());
} finally {


}
} else {
Log.e(TAG, "6 - response is empty...");


status = false;
}


return status;
}


@Override
protected void onPostExecute(Boolean result) {
//
Log.e(TAG, "7 - onPostExecute ...");


if (result) {
Log.e(TAG, "8 - Update UI ...");


// setUpdateUI(adv);
} else {
Log.e(TAG, "8 - Finish ...");


// displayLoding(false);
// finish();
}


}


public String performPostCall(String requestURL,
HashMap<String, String> postDataParams) {


URL url;
String response = "";
try {
url = new URL(requestURL);


HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(context.getResources().getInteger(
R.integer.maximum_timeout_to_server));
conn.setConnectTimeout(context.getResources().getInteger(
R.integer.maximum_timeout_to_server));
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);


conn.setRequestProperty("Content-Type", "application/json");


Log.e(TAG, "11 - url : " + requestURL);


/*
* JSON
*/


JSONObject root = new JSONObject();
//
String token = Static.getPrefsToken(context);


root.put("securityInfo", Static.getSecurityInfo(context));
root.put("advertisementId", advertisementId);


Log.e(TAG, "12 - root : " + root.toString());


String str = root.toString();
byte[] outputBytes = str.getBytes("UTF-8");
OutputStream os = conn.getOutputStream();
os.write(outputBytes);


int responseCode = conn.getResponseCode();


Log.e(TAG, "13 - responseCode : " + responseCode);


if (responseCode == HttpsURLConnection.HTTP_OK) {
Log.e(TAG, "14 - HTTP_OK");


String line;
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
while ((line = br.readLine()) != null) {
response += line;
}
} else {
Log.e(TAG, "14 - False - HTTP_OK");
response = "";
}
} catch (Exception e) {
e.printStackTrace();
}


return response;
}
}

更新24/08/2016

使用一些最好的库,例如:

因为:

  • 避免使用HttpUrlConnection和HttpClient

在较低的API级别上(主要是在Gingerbread和Froyo上),httppurlconnection和HttpClient还远远不够完美

  • 并且避免AsyncTask
  • 他们要快得多
  • 他们会缓存所有东西

自从Honeycomb (API 11)引入以来,强制在不同于主线程的单独线程上执行网络操作

对我来说,接下来的工作是:

 private sendData() {
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("key1", value1);
jsonObject.accumulate("key2", value2);


boolean success = sendPost(SERVER_URL + "/v1/auth", jsonObject);
}


private boolean sendPost(String url, JSONObject parameters) {
boolean requestResult = false;
InputStream inputStream = null;
String result = "";
try {


HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);


String json = "";


json = parameters.toString();


StringEntity se = new StringEntity(json);
httpPost.setEntity(se);


httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");


HttpResponse httpResponse = httpclient.execute(httpPost);


inputStream = httpResponse.getEntity().getContent();


if (inputStream != null) {
result = convertInputStreamToString(inputStream);
requestResult = true;
} else {
result = "Did not work!";
requestResult = false;
}
System.out.println(result);
} catch (Exception e) {
Log.d("InputStream", e.getLocalizedMessage());
requestResult = false;
}
return requestResult;
}
如果你只是想将数据附加到Url,你可以通过使用httppurlconnection来做到这一点,因为HttpClient现在已被弃用。 更好的方法是使用-

这样的库 < p > < >强 改造< /强> < / p >

我们可以将数据发送到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);

你需要包括我的库。文件在这里

我发现有用的例子与视频教程。

连接器类:

package com.tutorials.hp.mysqlinsert;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by Oclemmy on 3/31/2016 for ProgrammingWizards Channel.
*/
public class Connector {
/*
1.SHALL HELP US ESTABLISH A CONNECTION TO THE NETWORK
2. WE ARE MAKING A POST REQUEST
*/
public static HttpURLConnection connect(String urlAddress) {
try
{
URL url=new URL(urlAddress);
HttpURLConnection con= (HttpURLConnection) url.openConnection();
//SET PROPERTIES
con.setRequestMethod("POST");
con.setConnectTimeout(20000);
con.setReadTimeout(20000);
con.setDoInput(true);
con.setDoOutput(true);
//RETURN
return con;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}

DataPackager类:

package com.tutorials.hp.mysqlinsert;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
/**
* Created by Oclemmy on 3/31/2016 for ProgrammingWizards Channel.
* 1.BASICALLY PACKS DATA WE WANNA SEND
*/
public class DataPackager {
String name,position,team;
/*
SECTION 1.RECEIVE ALL DATA WE WANNA SEND
*/
public DataPackager(String name, String position, String team) {
this.name = name;
this.position = position;
this.team = team;
}
/*
SECTION 2
1.PACK THEM INTO A JSON OBJECT
2. READ ALL THIS DATA AND ENCODE IT INTO A FROMAT THAT CAN BE SENT VIA NETWORK
*/
public String packData()
{
JSONObject jo=new JSONObject();
StringBuffer packedData=new StringBuffer();
try
{
jo.put("Name",name);
jo.put("Position",position);
jo.put("Team",team);
Boolean firstValue=true;
Iterator it=jo.keys();
do {
String key=it.next().toString();
String value=jo.get(key).toString();
if(firstValue)
{
firstValue=false;
}else
{
packedData.append("&");
}
packedData.append(URLEncoder.encode(key,"UTF-8"));
packedData.append("=");
packedData.append(URLEncoder.encode(value,"UTF-8"));
}while (it.hasNext());
return packedData.toString();
} catch (JSONException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}

发送方类:

package com.tutorials.hp.mysqlinsert;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
/**
* Created by Oclemmy on 3/31/2016 for ProgrammingWizards Channel and Camposha.com.
* 1.SEND DATA FROM EDITTEXT OVER THE NETWORK
* 2.DO IT IN BACKGROUND THREAD
* 3.READ RESPONSE FROM A SERVER
*/
public class Sender extends AsyncTask<Void,Void,String> {
Context c;
String urlAddress;
EditText nameTxt,posTxt,teamTxt;
String name,pos,team;
ProgressDialog pd;
/*
1.OUR CONSTRUCTOR
2.RECEIVE CONTEXT,URL ADDRESS AND EDITTEXTS FROM OUR MAINACTIVITY
*/
public Sender(Context c, String urlAddress,EditText...editTexts) {
this.c = c;
this.urlAddress = urlAddress;
//INPUT EDITTEXTS
this.nameTxt=editTexts[0];
this.posTxt=editTexts[1];
this.teamTxt=editTexts[2];
//GET TEXTS FROM EDITEXTS
name=nameTxt.getText().toString();
pos=posTxt.getText().toString();
team=teamTxt.getText().toString();
}
/*
1.SHOW PROGRESS DIALOG WHILE DOWNLOADING DATA
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
pd=new ProgressDialog(c);
pd.setTitle("Send");
pd.setMessage("Sending..Please wait");
pd.show();
}
/*
1.WHERE WE SEND DATA TO NETWORK
2.RETURNS FOR US A STRING
*/
@Override
protected String doInBackground(Void... params) {
return this.send();
}
/*
1. CALLED WHEN JOB IS OVER
2. WE DISMISS OUR PD
3.RECEIVE A STRING FROM DOINBACKGROUND
*/
@Override
protected void onPostExecute(String response) {
super.onPostExecute(response);
pd.dismiss();
if(response != null)
{
//SUCCESS
Toast.makeText(c,response,Toast.LENGTH_LONG).show();
nameTxt.setText("");
posTxt.setText("");
teamTxt.setText("");
}else
{
//NO SUCCESS
Toast.makeText(c,"Unsuccessful "+response,Toast.LENGTH_LONG).show();
}
}
/*
SEND DATA OVER THE NETWORK
RECEIVE AND RETURN A RESPONSE
*/
private String send()
{
//CONNECT
HttpURLConnection con=Connector.connect(urlAddress);
if(con==null)
{
return null;
}
try
{
OutputStream os=con.getOutputStream();
//WRITE
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os,"UTF-8"));
bw.write(new DataPackager(name,pos,team).packData());
bw.flush();
//RELEASE RES
bw.close();
os.close();
//HAS IT BEEN SUCCESSFUL?
int responseCode=con.getResponseCode();
if(responseCode==con.HTTP_OK)
{
//GET EXACT RESPONSE
BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuffer response=new StringBuffer();
String line;
//READ LINE BY LINE
while ((line=br.readLine()) != null)
{
response.append(line);
}
//RELEASE RES
br.close();
return response.toString();
}else
{
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}

MainActivity:

package com.tutorials.hp.mysqlinsert;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
/*
1.OUR LAUNCHER ACTIVITY
2.INITIALIZE SOME UI STUFF
3.WE START SENDER ON BUTTON CLICK
*/
public class MainActivity extends AppCompatActivity {
String urlAddress="http://10.0.2.2/android/poster.php";
EditText nameTxt,posTxt,teamTxt;
Button saveBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//INITIALIZE UI FIELDS
nameTxt= (EditText) findViewById(R.id.nameEditTxt);
posTxt= (EditText) findViewById(R.id.posEditTxt);
teamTxt= (EditText) findViewById(R.id.teamEditTxt);
saveBtn= (Button) findViewById(R.id.saveBtn);
saveBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//START ASYNC TASK
Sender s=new Sender(MainActivity.this,urlAddress,nameTxt,posTxt,teamTxt);
s.execute();
}
});
}
}

ContentMain.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.tutorials.hp.mysqlinsert.MainActivity"
tools:showIn="@layout/activity_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:orientation="vertical"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="50dp">
<android.support.design.widget.TextInputLayout
android:id="@+id/nameLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/nameEditTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:hint= "Name" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/teamLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/teamEditTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Description" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/posLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/posEditTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Position" />
<!--android:inputType="textPassword"-->
</android.support.design.widget.TextInputLayout>
<Button android:id="@+id/saveBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Save"
android:clickable="true"
android:background="@color/colorAccent"
android:layout_marginTop="40dp"
android:textColor="@android:color/white"/>
</LinearLayout>
</RelativeLayout>

使用来自Square的开源okHttp库。okHttp适用于Android 2.3及以上版本,并具有GitHub上的Apache 2.0许可证. c。

发送POST数据就像在AsyncTask中添加以下内容一样简单:

OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("email", emailString) // A sample POST field
.add("comment", commentString) // Another sample POST field
.build();
Request request = new Request.Builder()
.url("https://yourdomain.org/callback.php") // The URL to send the data to
.post(formBody)
.build();

okHttp在maven上也有一个命名空间,所以将它添加到你的Android Studio项目很简单。只需将compile 'com.squareup.okhttp3:okhttp:3.11.0'添加到应用程序的build.gradle中。

完整的代码

在你的活动中添加以下内容:

public class CallAPI extends AsyncTask<String, String, String> {


String emailString;
String commentString;


public CallAPI(String email, String commnt){
emailString = email;
commentString = commnt;
}


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


@Override
protected String doInBackground(String... params) {
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("email", emailString) // A sample POST field
.add("comment", commentString) // Another sample POST field
.build();
Request request = new Request.Builder()
.url("https://yourdomain.org/callback.php") // The URL to send the data to
.post(formBody)
.build();
return "";
}


@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}

并将其称为using:

new CallAPI(emailString, commentString).execute();

下面的方法适用于最新的Android库并使用< a href = " https://square.github。Io /okhttp/recipes/" rel="nofollow noreferrer">okhttp

    OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormBody.Builder()
.add("key1", "value1")
.add("key2", "value2")  //optional
.add("key3", "value3")  //optional
.add("key4", "value4")  //optional
.build();




Request request = new Request.Builder()
.url("http://.....")   //URL
.post(formBody)
.build();




client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
e.getStackTrace();
}


@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if(response.isSuccessful()){
ResponseBody responseBody = response.body();
Log.e("TAG_", responseBody.string());
}
}

这是一个完整的解决方案,运行在后台线程,发送HTTPS POST多部分请求到Web API。实际测试和工作代码。注意:"\n"字符是在顶部的'final Strings'中正确的请求格式所必需的。

我有麻烦要么理解,转换,或完成以上解决方案为我的多部分文章的需要。

    @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;
}