私はいくつかのJava Apacheを使用するコードHttpClient
バージョン4.2.2
を作成してRESTfulサードパーティAPIにアクセスします。このAPIには、HTTP GET
、POST
、PUT
および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";
したがって、リクエストメソッドに関係なくHttpClient
にapi_key
を提供する方法を理解しようとしています(これは、ヒットしようとしているRESTful APIメソッドに依存します)。 HttpGet
はパラメーターの概念をsupportも均等にしないようで、HttpPost
はHttpParams
と呼ばれるものを使用します。ただし、これらのHttpParams
は、HttpClient
の3.x.xバージョンにのみ存在するようです。
だから私は尋ねます私のapi_key
文字列を4つすべてにアタッチ/追加する適切なv4.2.2の方法は何ですか:
HttpGet
HttpPost
HttpPut
HttpDelete
前もって感謝します。
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=
いくつかの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();
}
ここで重要なことは、使用する必要がある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