2

GET および POST リクエストを送信する方法の適切な実装を教えてください。それらはこれらを行うための多くの方法であり、私は最良の実装を探しています. 次に、2 つの異なる方法を使用するのではなく、これらの両方のメソッドを送信する一般的な方法があります。結局のところ、GET メソッドはクエリ文字列にパラメーターを持つだけですが、POST メソッドはパラメーターのヘッダーを使用します。

ありがとう。

4

6 に答える 6

5

このHttpURLConnectionクラス (java.net 内) を使用して、POST または GET HTTP 要求を送信できます。これは、HTTP 要求を送信する他のアプリケーションと同じです。HTTP リクエストを送信するコードは次のようになります。

import java.net.*;
import java.io.*;
public class SendPostRequest {
  public static void main(String[] args) throws MalformedURLException, IOException {
    URL reqURL = new URL("http://www.stackoverflow.com/"); //the URL we will send the request to
    HttpURLConnection request = (HttpURLConnection) (reqUrl.openConnection());
    String post = "this will be the post data that you will send"
    request.setDoOutput(true);
    request.addRequestProperty("Content-Length", Integer.toString(post.length)); //add the content length of the post data
    request.addRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //add the content type of the request, most post data is of this type
    request.setMethod("POST");
    request.connect();
    OutputStreamWriter writer = new OutputStreamWriter(request.getOutputStream()); //we will write our request data here
    writer.write(post);
    writer.flush();
  }
}

GET リクエストは少し異なりますが、コードの大部分は同じです。ストリームを使用した出力や、コンテンツの長さまたはコンテンツ タイプの指定について心配する必要はありません。

import java.net.*;
import java.io.*;

public class SendPostRequest {
  public static void main(String[] args) throws MalformedURLException, IOException {
    URL reqURL = new URL("http://www.stackoverflow.com/"); //the URL we will send the request to
    HttpURLConnection request = (HttpURLConnection) (reqUrl.openConnection());
    request.setMethod("GET");
    request.connect();

  }
}
于 2012-08-13T17:58:41.223 に答える
2

私は専用クラスを使用して GET/POST および HTTP 接続またはリクエストを行うことを好みます。さらにHttpClient、これらの GET/POST メソッドを実行するために使用します。

以下は私のプロジェクトのサンプルです。スレッドセーフな実行が必要だったので、ThreadSafeClientConnManager.

GET (fetchData) と POST (sendOrder) の使用例があります。

ご覧のとおりexecute、実行の一般的な方法はHttpUriRequestPOST または GET です。

public final class ClientHttpClient {

private static DefaultHttpClient client;
private static CookieStore cookieStore;
private static HttpContext httpContext;

static {
    cookieStore = new BasicCookieStore();
    httpContext = new BasicHttpContext();
    httpContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
    client = getThreadSafeClient();
    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(params, AppConstants.CONNECTION_TIMEOUT);
    HttpConnectionParams.setSoTimeout(params, AppConstants.SOCKET_TIMEOUT);
    client.setParams(params);
}

private static DefaultHttpClient getThreadSafeClient() {
    DefaultHttpClient client = new DefaultHttpClient();
    ClientConnectionManager mgr = client.getConnectionManager();
    HttpParams params = client.getParams();
    client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, mgr.getSchemeRegistry()),
            params);
    return client;
}

private ClientHttpClient() {
}

public static String execute(HttpUriRequest http) throws IOException {
    BufferedReader reader = null;
    try {
        StringBuilder builder = new StringBuilder();
        HttpResponse response = client.execute(http, httpContext);
        StatusLine statusLine = response.getStatusLine();
        int statusCode = statusLine.getStatusCode();
        HttpEntity entity = response.getEntity();
        InputStream content = entity.getContent();
        reader = new BufferedReader(new InputStreamReader(content, CHARSET));
        String line = null;
        while((line = reader.readLine()) != null) {
            builder.append(line);
        }

        if(statusCode != 200) {
            throw new IOException("statusCode=" + statusCode + ", " + http.getURI().toASCIIString()
                    + ", " + builder.toString());
        }

        return builder.toString();
    }
    finally {
        if(reader != null) {
            reader.close();
        }
    }
}


public static List<OverlayItem> fetchData(Info info) throws JSONException, IOException {
    List<OverlayItem> out = new LinkedList<OverlayItem>();
    HttpGet request = buildFetchHttp(info);
    String json = execute(request);
    if(json.trim().length() <= 2) {
        return out;
    }
    try {
        JSONObject responseJSON = new JSONObject(json);
        if(responseJSON.has("auth_error")) {
            throw new IOException("auth_error");
        }
    }
    catch(JSONException e) {
        //ok there was no error, because response is JSONArray - not JSONObject
    }

    JSONArray jsonArray = new JSONArray(json);
    for(int i = 0; i < jsonArray.length(); i++) {
        JSONObject chunk = jsonArray.getJSONObject(i);
        ChunkParser parser = new ChunkParser(chunk);
        if(!parser.hasErrors()) {
            out.add(parser.parse());
        }
    }
    return out;
}

private static HttpGet buildFetchHttp(Info info) throws UnsupportedEncodingException {
    StringBuilder builder = new StringBuilder();
    builder.append(FETCH_TAXIS_URL);
    builder.append("?minLat=" + URLEncoder.encode("" + mapBounds.getMinLatitude(), ENCODING));
    builder.append("&maxLat=" + URLEncoder.encode("" + mapBounds.getMaxLatitude(), ENCODING));
    builder.append("&minLon=" + URLEncoder.encode("" + mapBounds.getMinLongitude(), ENCODING));
    builder.append("&maxLon=" + URLEncoder.encode("" + mapBounds.getMaxLongitude(), ENCODING));
    HttpGet get = new HttpGet(builder.toString());
    return get;
}

public static int sendOrder(OrderInfo info) throws IOException {
    HttpPost post = new HttpPost(SEND_ORDER_URL);
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
    nameValuePairs.add(new BasicNameValuePair("id", "" + info.getTaxi().getId()));
    nameValuePairs.add(new BasicNameValuePair("address", info.getAddressText()));
    nameValuePairs.add(new BasicNameValuePair("name", info.getName()));
    nameValuePairs.add(new BasicNameValuePair("surname", info.getSurname()));
    nameValuePairs.add(new BasicNameValuePair("phone", info.getPhoneNumber()));
    nameValuePairs.add(new BasicNameValuePair("passengers", "" + info.getPassengers()));
    nameValuePairs.add(new BasicNameValuePair("additionalDetails", info.getAdditionalDetails()));
    nameValuePairs.add(new BasicNameValuePair("lat", "" + info.getOrderLocation().getLatitudeE6()));
    nameValuePairs.add(new BasicNameValuePair("lon", "" + info.getOrderLocation().getLongitudeE6()));
    post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    String response = execute(post);
    if(response == null || response.trim().length() == 0) {
        throw new IOException("sendOrder_response_empty");
    }

    try {
        JSONObject json = new JSONObject(response);
        int orderId = json.getInt("orderId");
        return orderId;
    }
    catch(JSONException e) {
        throw new IOException("sendOrder_parsing: " + response);
    }
}

編集

executeカスタム (または動的) GET/POST 要求を使用することがあるため、このメソッドはパブリックです。

オブジェクトがある場合は、メソッドURLに渡すことができますexecute:

HttpGet request = new HttpGet(url.toString());
execute(request);
于 2012-08-13T17:53:19.793 に答える
1

開発者トレーニングドキュメントには、GETリクエストに関する良い例があります。URLにクエリパラメータを追加するのはあなたの責任です。

投稿は似ていますが、あなたが言ったように、まったく異なります。HttpConnectionURLConnectionクラスは両方を実行でき、出力ストリームを使用して投稿本文を設定するのは簡単です。

于 2012-08-13T17:52:30.153 に答える
1

あなたが言ったように: GET-Parameters は URL にあります - したがって、Webview で loadUrl() を使用してそれらを送信できます。

[..].loadUrl("http://www.example.com/data.php?param1=value1&param2=value2&...");
于 2012-08-13T17:40:31.720 に答える