1

応答を取得するためにノード(js)サーバーを呼び出す必要があるJavaEEクライアントを作成しています。そこで、ノードサーバーにリクエストを送信するための単一のクラスを作成しました。応答を受け取るたびに、応答コードと応答自体を返送する必要があります。そこで、応答コードと応答を含む文字列配列を作成することを考えました。

これが私のクラスです:

import javax.ws.rs.core.MediaType;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.client.filter.LoggingFilter;
import com.sun.jersey.core.impl.provider.entity.StringProvider;

public class RequestHandler {

/**
 * Makes a HTTP Request for a given url. The type
 * determines which type of request, post or get,
 * will be made. The params cane be in form of
 * name=value pair or JSON format.
 * 
 * @param type Request method. 1 - Get, 2 - Post.
 * @param url url string to which request has to be 
 * made.
 * @param path path of the resource or service for a
 * url.
 * @param params request parameters. Can be either
 * name=value pair or JSON request.
 * 
 * @return String representation of the response.
 * 
 */
public static String[] makeRequest(int type, String url, String path, String params) {
    String[] response = new String[2];
    ClientResponse clientResponse = null;
    try {
        ClientConfig config = new DefaultClientConfig();
        config.getClasses().add(StringProvider.class); 
        Client client = Client.create(config);

        WebResource service =
                client.resource(url); 
        client.addFilter(new LoggingFilter());
        service.path("rest");

        // 1 - GET, 2 - POST
        switch (type) {
            case 1: {
                System.out.println("Making GET request to: " + url + path);
                System.out.println("Request Params: " + params);
                clientResponse = service.path(path).type(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); //TODO Code to be corrected, include params
                break;
            }
            case 2: {
                System.out.println("Making POST request to: " + url + path);
                System.out.println("Request Params: " + params);
                clientResponse = service.path(path).type(MediaType.APPLICATION_JSON_TYPE).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, params);
                break;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
        response[0] = "500";
        response[1] = "Internal Server Error";
        return response;
    }

    response[0] = String.valueOf(clientResponse.getStatus());
    response[1] = clientResponse.getEntity(String.class);

    System.err.println("Response status: " + response[0]);

    return response;
    }//end of makeRequest()

}//end of class

しかし、パフォーマンスの問題を引き起こす可能性のある文字列オブジェクトを作成しすぎると、私は確信していません。そこで、応答コードと応答を返すマップを作成することを考えました。

response.put(500, "Internal Server Error");

ただし、ここでも、整数を使用してマップを作成し、応答コードをチェックするたびに、整数オブジェクトのボックス化とボックス化解除のオーバーヘッドが発生します。これもパフォーマンスにつながる可能性があります。

HashMap<Integer, String> response = RequestHandler.makeRequest(2, urlString, "/login", params);

if (response.containsKey(500)) {
 return Message.INTERNAL_SERVER_ERROR;
}

パフォーマンスを向上させるには、どちらを使用すればよいですか?それとも、それからより良い代替手段はありますか?

4

3 に答える 3

3

aHashMapに配列と一連のハウスキーピング項目(サイズ、しきい値、負荷率)が含まれているとすると、String[]配列はaよりも小さくなります(したがって、1つの尺度でより効率的になります)HashMap

ただし、時期尚早の最適化は避けてください。

于 2012-05-09T05:09:28.243 に答える
1

どちらにしても、パフォーマンスの違いはあまりないと思います。ただし、わかりやすくするために、可能性のあるすべてのコードを事前に知っているので、Enumsまたは変数を使用することをお勧めします。static finalデータを動的に追加/削除する必要がある場合はHashMapが適していますが、この場合は当てはまりません。

于 2012-05-09T05:10:20.147 に答える
0

次のように独自の応答オブジェクトを定義できると思います。

class Response{
   int status;
   String msg;
}
于 2012-05-09T05:10:47.753 に答える