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

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


当前回答

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

发送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项目很简单。只需将编译'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();

其他回答

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

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>')
}

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

通过这种方式,我们可以用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);     
    }
}

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

下面是一个完整的解决方案,它运行在后台线程中,向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;
    }

你可以使用URLConnection setDoOutput(true), getOutputStream()(用于发送数据),和getInputStream()(用于接收)。Sun在这方面有一个例子。