web-dev-qa-db-ja.com

すべてのHttpClientリクエストメソッドにパラメーターを追加する方法

私はいくつかのJava Apacheを使用するコードHttpClientバージョン4.2.2を作成してRESTfulサードパーティAPIにアクセスします。このAPIには、HTTP GETPOSTPUTおよびDELETEを利用するメソッドがあります。これは重要ですAPIが3から4に大幅に変更されたため、私は3.xxではなく4.xxバージョンを使用していることに注意してください。私が見つけたすべての関連する例は3.xxバージョン用です。

すべてのAPI呼び出しでは、api_keyパラメータとして提供する必要があります(使用するメソッドに関係なく)。これは、GET、POST、またはそれ以外の方法で行うかどうかに関係なく、呼び出しがサーバー側を認証するために、これをapi_keyに提供する必要があることを意味します。

// Have to figure out a way to get this into my HttpClient call,
// regardless of whether I'm using: HttpGet, HttpPost, HttpPut
// or HttpDelete...
String api_key = "blah-whatever-my-unique-api-key";

したがって、リクエストメソッドに関係なくHttpClientapi_keyを提供する方法を理解しようとしています(これは、ヒットしようとしているRESTful APIメソッドに依存します)。 HttpGetはパラメーターの概念をsupportも均等にしないようで、HttpPostHttpParamsと呼ばれるものを使用します。ただし、これらのHttpParamsは、HttpClientの3.x.xバージョンにのみ存在するようです。

だから私は尋ねます私のapi_key文字列を4つすべてにアタッチ/追加する適切なv4.2.2の方法は何ですか

  • HttpGet
  • HttpPost
  • HttpPut
  • HttpDelete

前もって感謝します。

10
user1768830

URIBuilderクラスを使用して、すべてのHTTPメソッドのリクエストURIを作成できます。 URIビルダーは、パラメーターを設定するためのsetParameterメソッドを提供します。

URIBuilder builder = new URIBuilder();
builder.setScheme("http").setHost("www.google.com").setPath("/search")
    .setParameter("q", "httpclient")
    .setParameter("btnG", "Google Search")
    .setParameter("aq", "f")
    .setParameter("oq", "");
URI uri = builder.build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());

出力は

http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq= 
24

いくつかのhttpパラメータを渡してjsonリクエストを送信したい場合にも、このアプローチを使用できます。

(注:他の将来のリーダーに役立ち、org.Apache.httpクライアントライブラリからのインポートである場合に備えて、いくつかの追加コードを追加しました)

public void postJsonWithHttpParams() throws URISyntaxException, UnsupportedEncodingException, IOException {

    //add the http parameters you wish to pass
    List<NameValuePair> postParameters = new ArrayList<>();
    postParameters.add(new BasicNameValuePair("param1", "param1_value"));
    postParameters.add(new BasicNameValuePair("param2", "param2_value"));

    //Build the server URI together with the parameters you wish to pass
    URIBuilder uriBuilder = new URIBuilder("http://google.ug");
    uriBuilder.addParameters(postParameters);

    HttpPost postRequest = new HttpPost(uriBuilder.build());
    postRequest.setHeader("Content-Type", "application/json");

    //this is your JSON string you are sending as a request
    String yourJsonString = "{\"str1\":\"a value\",\"str2\":\"another value\"} ";

    //pass the json string request in the entity
    HttpEntity entity = new ByteArrayEntity(yourJsonString.getBytes("UTF-8"));
    postRequest.setEntity(entity);

    //create a socketfactory in order to use an http connection manager
    PlainConnectionSocketFactory plainSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
    Registry<ConnectionSocketFactory> connSocketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", plainSocketFactory)
            .build();

    PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(connSocketFactoryRegistry);

    connManager.setMaxTotal(20);
    connManager.setDefaultMaxPerRoute(20);

    RequestConfig defaultRequestConfig = RequestConfig.custom()
            .setSocketTimeout(HttpClientPool.connTimeout)
            .setConnectTimeout(HttpClientPool.connTimeout)
            .setConnectionRequestTimeout(HttpClientPool.readTimeout)
            .build();

    // Build the http client.
    CloseableHttpClient httpclient = HttpClients.custom()
            .setConnectionManager(connManager)
            .setDefaultRequestConfig(defaultRequestConfig)
            .build();

    CloseableHttpResponse response = httpclient.execute(postRequest);

    //Read the response
    String responseString = "";

    int statusCode = response.getStatusLine().getStatusCode();
    String message = response.getStatusLine().getReasonPhrase();

    HttpEntity responseHttpEntity = response.getEntity();

    InputStream content = responseHttpEntity.getContent();

    BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
    String line;

    while ((line = buffer.readLine()) != null) {
        responseString += line;
    }

    //release all resources held by the responseHttpEntity
    EntityUtils.consume(responseHttpEntity);

    //close the stream
    response.close();

    // Close the connection manager.
    connManager.close();
}
3
Arthur

ここで重要なことは、使用する必要があるApacheのパッケージを明示的に言うことです。これは、get要求を実装するさまざまな方法があるためです。

たとえば、_Apache Commons_またはHttpComponentsを使用できます。この例では、HttpComponents (org.Apache.http.*)を使用します

リクエストクラス:

_package request;

import Java.io.IOException;
import Java.net.URI;
import Java.net.URISyntaxException;

import org.Apache.http.client.methods.CloseableHttpResponse;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.client.utils.URIBuilder;
import org.Apache.http.impl.client.CloseableHttpClient;
import org.Apache.http.impl.client.HttpClients;

import Task;

public void sendRequest(Task task) throws URISyntaxException {

    URIBuilder uriBuilder = new URIBuilder();
    uriBuilder.setScheme("http")
            .setHost("localhost")
            .setPort(8080)
            .setPath("/TesteHttpRequest/TesteDoLucas")
            .addParameter("className", task.getClassName())
            .addParameter("dateExecutionBegin", task.getDateExecutionBegin())
            .addParameter("dateExecutionEnd", task.getDateExecutionEnd())
            .addParameter("lastDateExecution", task.getDateLastExecution())
            .addParameter("numberExecutions", Integer.toString(task.getNumberExecutions()))
            .addParameter("idTask", Integer.toString(task.getIdTask()))
            .addParameter("numberExecutions" , Integer.toString(task.getNumberExecutions()));
    URI uri = uriBuilder.build();

    HttpGet getMethod = new HttpGet(uri);

    CloseableHttpClient httpclient = HttpClients.createDefault();

    CloseableHttpResponse response = null;

    try {
        response = httpclient.execute(getMethod);
    } catch (IOException e) {
        //handle this IOException properly in the future
    } catch (Exception e) {
        //handle this IOException properly in the future
    }
}
_

私はTomcat v7.0 Serverを使用していますが、上記のクラスはタスクを受け取り、リンク内の特定のサーブレットに送信しますhttp:// localhost:8080/TesteHttpRequest/TesteDoLucas

私の動的Webプロジェクトの名前はTesteHttpRequestで、サーブレットはURL/ TesteDoLucasで参加します

タスククラス:

_package bean;

public class Task {

    private int idTask;
    private String taskDescription;
    private String dateExecutionBegin;
    private String dateExecutionEnd;
    private String dateLastExecution;
    private int numberExecutions;
    private String className;

    public int getIdTask() {
        return idTask;
    }

    public void setIdTask(int idTask) {
        this.idTask = idTask;
    }

    public String getTaskDescription() {
        return taskDescription;
    }

    public void setTaskDescription(String taskDescription) {
        this.taskDescription = taskDescription;
    }

    public String getDateExecutionBegin() {
        return dateExecutionBegin;
    }

    public void setDateExecutionBegin(String dateExecutionBegin) {
        this.dateExecutionBegin = dateExecutionBegin;
    }

    public String getDateExecutionEnd() {
        return dateExecutionEnd;
    }

    public void setDateExecutionEnd(String dateExecutionEnd) {
        this.dateExecutionEnd = dateExecutionEnd;
    }

    public String getDateLastExecution() {
        return dateLastExecution;
    }

    public void setDateLastExecution(String dateLastExecution) {
        this.dateLastExecution = dateLastExecution;
    }

    public int getNumberExecutions() {
        return numberExecutions;
    }

    public void setNumberExecutions(int numberExecutions) {
        this.numberExecutions = numberExecutions;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }
}
_

サーブレットクラス:

_package servlet;

import Java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TesteDoLucas")
public class TesteHttpRequestServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String query = request.getQueryString();
        System.out.println(query);
     }

     protected void doPost(HttpServletRequest request, HttpServletResponse   response) throws ServletException, IOException {
        doGet(request, response);
        }
    }
_

送信されたクエリパラメータはコンソールに表示されます。

className = Java.util.Objects%3B&dateExecutionBegin = 2016%2F04%2F07 + 22%3A22%3A22&dateExecutionEnd = 2016%2F04%2F07 + 06%3A06%3A06&lastDateExecution = 2016%2F04%2F07 + 11%3A11%3cuts = Exidions&cutions = Exidions&numberExions 10

エンコーディングを修正するには、ここをご覧ください。 HttpServletRequest UTF-8 Encoding

0