Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不同类中使用相同方法的不同HTTP POST?_Java_Php_Android_Post - Fatal编程技术网

Java 不同类中使用相同方法的不同HTTP POST?

Java 不同类中使用相同方法的不同HTTP POST?,java,php,android,post,Java,Php,Android,Post,我对Android开发和Java相当陌生。目前,我有一个应用程序,它通过几个参数发出一个基本的HTTPPOST请求 我想知道是否有可能创建两个只发出相同请求但参数不同的活动,而不必在这两个活动中粘贴sames方法 示例:我有两个屏幕,标识,当我按下每个屏幕上的按钮时,它会发送我用不同参数发出的post请求 PS:我所问的可能不够具体,所以只要问我细节或一些代码,但我认为这里没有必要 编辑:我想我把我的想法解释得很糟糕 我有一个用于post的静态函数类: 公共类MyHttpPost{ public

我对Android开发和Java相当陌生。目前,我有一个应用程序,它通过几个参数发出一个基本的HTTPPOST请求

我想知道是否有可能创建两个只发出相同请求但参数不同的活动,而不必在这两个活动中粘贴sames方法

示例:我有两个屏幕,标识,当我按下每个屏幕上的按钮时,它会发送我用不同参数发出的post请求

PS:我所问的可能不够具体,所以只要问我细节或一些代码,但我认为这里没有必要

编辑:我想我把我的想法解释得很糟糕 我有一个用于post的静态函数类:

公共类MyHttpPost{

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

    InputStream is = null;
    int len = 500;
    URL url;

    try {
        url = new URL(requestURL);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(15000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        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();

        is = conn.getInputStream();

        return readIt(is, len);

    } finally {
        if (is != null) {
            is.close();
        }
    }
}

public static String readIt(InputStream stream, int len) throws IOException {
    Reader reader = new InputStreamReader(stream, "UTF-8");
    char[] buffer = new char[len];
    reader.read(buffer);
    return new String(buffer);
}

private static 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();
}
}

和两项活动:

公共类TestPost扩展了AppCompative活动{

public final static String EXTRA_MESSAGE = "MESSAGE";

private TextView myView;
private EditText urlText;
HashMap<String, String> postDataParams;
WebView webview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_post);

    myView = (TextView)findViewById(R.id.myText);
    urlText = (EditText)findViewById(R.id.myUrl);

    postDataParams = new HashMap<>();
    postDataParams.put("firstParam", "1234");
    postDataParams.put("secondParam", "qwerty");

    webview = new WebView(this);
    webview = (WebView) findViewById(R.id.myWebView);

}

public void sendMessage(View view) {
    Intent intent = new Intent(this, Home.class);

    TextView editTextview = (TextView) findViewById(R.id.myText);
    String message = editTextview.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

protected class DownloadWebpageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        // params comes from the execute() call: params[0] is the url.
        try {
            return MyHttpPost.performPostCall(urls[0], postDataParams);
        } catch (IOException e) {
             return getResources().getString(R.string.bad_url);
        }
    }
    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {
        myView.setText(result);
        webview.loadData(result, "text/html", null);
    }
}

// When user clicks button, calls AsyncTask.
// Before attempting to fetch the URL, makes sure that there is a network connection.
public void myClickHandler(View view) {
    // Gets the URL from the UI's text field.
    String stringUrl = urlText.getText().toString();
    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        new DownloadWebpageTask().execute(stringUrl);
    } else {
        myView.setText("No network connection available.");
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_test_post, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

公共类OtherClass扩展了TestPost{

private TextView myView;
private EditText urlText;
HashMap<String, String> postDataParams;
WebView webview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_test_post);

    myView = (TextView)findViewById(R.id.myText);
    urlText = (EditText)findViewById(R.id.myUrl);
    myView.setText("coucou");

    postDataParams = new HashMap<>();
    postDataParams.put("firstParam", "9876");
    postDataParams.put("secondParam", "ytreza");

    webview = new WebView(this);
    webview = (WebView) findViewById(R.id.myWebView);
}

protected class DownloadWebpageTask extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... urls) {

        // params comes from the execute() call: params[0] is the url.
        try {
            return MyHttpPost.performPostCall(urls[0], postDataParams);
        } catch (IOException e) {
            return getResources().getString(R.string.bad_url);
        }
    }
    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(String result) {
        myView.setText(result);
        webview.loadData(result, "text/html", null);
    }
}

public void myClickHandler(View view) {
    // Gets the URL from the UI's text field.
    String stringUrl = urlText.getText().toString();
    ConnectivityManager connMgr = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected()) {
        new DownloadWebpageTask().execute(stringUrl);
    } else {
        myView.setText("No network connection available.");
    }
}
}

正如您所看到的,在第二个类中,要发送不同的参数,我必须重新定义函数,我想知道这是否是唯一的选项,这样做是否不错。
例如,如果我只能在两个类中定义参数并发出请求。

如果我理解得很好,您可以创建一个utils类来实现这一点,在这个类中,您可以将方法粘贴为public,并且可以传递参数,对于这两个活动都是相同的,然后从如下活动调用它们:UtilsClass.sendPOSTRequestmyparam1,myparam2

您应该创建一个NetworkService类,其中包含执行HTTP POST的方法。该方法接受请求中不同的参数。然后创建该类的实例并将其传递给这两个活动


新的NetworkService应包含所有与网络相关的方法,以获得更好的体系结构,请参阅。

这需要NetworkUtils类!这将是一个类,您应该与要在两个活动中定义并调用公共静态方法的相同HTTPPOST方法一起静态使用。例:

public class NetworkUtils{

    public static HttpResponse postData(String param1, String param2) {
        // 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", param1));
            nameValuePairs.add(new BasicNameValuePair("stringdata", param2));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request, return response
            return httpclient.execute(httppost);

        } catch (ClientProtocolException e) {
            e.printStacktrace();
        }catch (IOException e) {
            e.printStacktrace();
        }
        return null;
    }    
} 
如果网络请求存在问题,请检查null。除此之外,这只是您的解决方案的一个示例。为了节省额外的代码


注意:此方法必须在AsyncThread或处理程序中调用,因为发生这种情况时您正在阻止UI线程

创建一个全局类,定义您的http方法并使它们成为静态的!!从任何地方使用它,并根据您的喜好传递参数

当然,您可以使用不同的参数运行单个方法,这就是OOP的目的。您可以在不同的类(如util)中定义调用http post的方法,并从具有不同参数的不同活动中调用该方法。api 22中不推荐使用TTppost。您应该改用HttpUrlConnection。很公平。他的问题是如何处理最小化代码复制的问题,所以我的示例只是展示如何在utils类中使用首选HTTP库。这就是为什么在有人需要信息时将此作为注释发布的原因