Java에서의 HTTP POST 요구 전송
이 URL을 가정해 보겠습니다.
http://www.example.com/page.php?id=10
(여기서 ID는 POST 요청 시 전송해야 합니다.)
송신하고 싶다id = 10
서버의page.php
POST 메서드에서 이를 받아들입니다.
Java 내에서 이 작업을 수행하려면 어떻게 해야 합니까?
이거 해봤는데
URL aaa = new URL("http://www.example.com/page.php");
URLConnection ccc = aaa.openConnection();
하지만 POST로 어떻게 보내야 할지 모르겠어요.
갱신된 답변:
Apache HTTP Components의 최신 버전에서는 원래 답변의 일부 클래스가 사용되지 않으므로 이 업데이트를 게시합니다.
덧붙여서, 상세한 예에 대해서는, 여기를 참조해 주세요.
HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("http://www.a-domain.com/foo/");
// Request parameters and other properties.
List<NameValuePair> params = new ArrayList<NameValuePair>(2);
params.add(new BasicNameValuePair("param-1", "12345"));
params.add(new BasicNameValuePair("param-2", "Hello!"));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
//Execute and get the response.
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
try (InputStream instream = entity.getContent()) {
// do something useful
}
}
원답:
Apache Http Client 사용을 권장합니다.더 빠르고 쉽게 구현할 수 있습니다.
HttpPost post = new HttpPost("http://jakarata.apache.org/");
NameValuePair[] data = {
new NameValuePair("user", "joe"),
new NameValuePair("password", "bloggs")
};
post.setRequestBody(data);
// execute method and handle any error responses.
...
InputStream in = post.getResponseBodyAsStream();
// handle response.
상세한 것에 대하여는, 다음의 URL 를 참조해 주세요.
POST 요청 전송은 바닐라 Java에서 간단합니다.먼저 a부터URL
, 우리는 그것을 로 변환할 필요가 있습니다.URLConnection
사용.url.openConnection();
그 후, 우리는 그것을 다른 사람에게 던져야 한다.HttpURLConnection
에 액세스 할 수 있습니다.setRequestMethod()
method를 클릭합니다.마지막으로 접속을 통해 데이터를 전송한다고 합니다.
URL url = new URL("https://www.example.com/login");
URLConnection con = url.openConnection();
HttpURLConnection http = (HttpURLConnection)con;
http.setRequestMethod("POST"); // PUT is another valid option
http.setDoOutput(true);
다음에, 송신할 내용을 기술할 필요가 있습니다.
단순 양식 전송
http 형식에서 송신되는 통상의 POST에는, 올바르게 정의된 형식이 있습니다.입력을 다음 형식으로 변환해야 합니다.
Map<String,String> arguments = new HashMap<>();
arguments.put("username", "root");
arguments.put("password", "sjh76HSn!"); // This is a fake password obviously
StringJoiner sj = new StringJoiner("&");
for(Map.Entry<String,String> entry : arguments.entrySet())
sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "="
+ URLEncoder.encode(entry.getValue(), "UTF-8"));
byte[] out = sj.toString().getBytes(StandardCharsets.UTF_8);
int length = out.length;
그런 다음 양식 내용을 적절한 헤더와 함께 http 요청에 첨부하여 전송할 수 있습니다.
http.setFixedLengthStreamingMode(length);
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
http.connect();
try(OutputStream os = http.getOutputStream()) {
os.write(out);
}
// Do something with http.getInputStream()
JSON 전송 중
java를 사용하여 json을 보낼 수도 있습니다.이것도 간단합니다.
byte[] out = "{\"username\":\"root\",\"password\":\"password\"}" .getBytes(StandardCharsets.UTF_8);
int length = out.length;
http.setFixedLengthStreamingMode(length);
http.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
http.connect();
try(OutputStream os = http.getOutputStream()) {
os.write(out);
}
// Do something with http.getInputStream()
서버마다 json에 대해 다른 컨텐츠 유형을 사용할 수 있습니다. 다음 질문을 참조하십시오.
java post와 함께 파일 보내기
포맷이 복잡하기 때문에 파일 전송이 더 어렵다고 생각할 수 있습니다.또, 파일을 메모리에 완전하게 버퍼링 하는 것을 원하지 않기 때문에, 파일을 문자열로서 송신하는 서포트를 추가합니다.
이를 위해 몇 가지 도우미 방식을 정의합니다.
private void sendFile(OutputStream out, String name, InputStream in, String fileName) {
String o = "Content-Disposition: form-data; name=\"" + URLEncoder.encode(name,"UTF-8")
+ "\"; filename=\"" + URLEncoder.encode(filename,"UTF-8") + "\"\r\n\r\n";
out.write(o.getBytes(StandardCharsets.UTF_8));
byte[] buffer = new byte[2048];
for (int n = 0; n >= 0; n = in.read(buffer))
out.write(buffer, 0, n);
out.write("\r\n".getBytes(StandardCharsets.UTF_8));
}
private void sendField(OutputStream out, String name, String field) {
String o = "Content-Disposition: form-data; name=\""
+ URLEncoder.encode(name,"UTF-8") + "\"\r\n\r\n";
out.write(o.getBytes(StandardCharsets.UTF_8));
out.write(URLEncoder.encode(field,"UTF-8").getBytes(StandardCharsets.UTF_8));
out.write("\r\n".getBytes(StandardCharsets.UTF_8));
}
그 후, 이러한 방법을 사용하여 다음과 같이 멀티파트 투고 요구를 작성할 수 있는 방법은 다음과 같습니다.
String boundary = UUID.randomUUID().toString();
byte[] boundaryBytes =
("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8);
byte[] finishBoundaryBytes =
("--" + boundary + "--").getBytes(StandardCharsets.UTF_8);
http.setRequestProperty("Content-Type",
"multipart/form-data; charset=UTF-8; boundary=" + boundary);
// Enable streaming mode with default settings
http.setChunkedStreamingMode(0);
// Send our fields:
try(OutputStream out = http.getOutputStream()) {
// Send our header (thx Algoman)
out.write(boundaryBytes);
// Send our first field
sendField(out, "username", "root");
// Send a seperator
out.write(boundaryBytes);
// Send our second field
sendField(out, "password", "toor");
// Send another seperator
out.write(boundaryBytes);
// Send our file
try(InputStream file = new FileInputStream("test.txt")) {
sendFile(out, "identification", file, "text.txt");
}
// Finish the request
out.write(finishBoundaryBytes);
}
// Do something with http.getInputStream()
String rawData = "id=10";
String type = "application/x-www-form-urlencoded";
String encodedData = URLEncoder.encode( rawData, "UTF-8" );
URL u = new URL("http://www.example.com/page.php");
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty( "Content-Type", type );
conn.setRequestProperty( "Content-Length", String.valueOf(encodedData.length()));
OutputStream os = conn.getOutputStream();
os.write(encodedData.getBytes());
첫 번째 답변은 훌륭했지만 자바 컴파일러 오류를 피하기 위해 try/catch를 추가해야 했습니다.
그리고 어떻게 읽어야 할지 고민도 많이 했어요.HttpResponse
Java 라이브러리를 사용합니다.
자세한 코드는 다음과 같습니다.
/*
* Create the POST request
*/
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://example.com/");
// Request parameters and other properties.
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user", "Bob"));
try {
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
} catch (UnsupportedEncodingException e) {
// writing error to Log
e.printStackTrace();
}
/*
* Execute the HTTP Request
*/
try {
HttpResponse response = httpClient.execute(httpPost);
HttpEntity respEntity = response.getEntity();
if (respEntity != null) {
// EntityUtils to get the response content
String content = EntityUtils.toString(respEntity);
}
} catch (ClientProtocolException e) {
// writing exception to log
e.printStackTrace();
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
}
Apache HTTP 구성 요소를 사용하는 간단한 방법은 다음과 같습니다.
Request.Post("http://www.example.com/page.php")
.bodyForm(Form.form().add("id", "10").build())
.execute()
.returnContent();
Fluent API 보기
Postman을 사용하여 요청 코드를 생성할 것을 권장합니다.Postman을 사용하여 요청을 한 후 코드 탭을 누릅니다.
그런 다음 다음 요청 코드를 원하는 언어로 선택할 수 있는 창이 나타납니다.
Post Request와 함께 파라미터를 송신하는 가장 간단한 방법:
String postURL = "http://www.example.com/page.php";
HttpPost post = new HttpPost(postURL);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "10"));
UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, "UTF-8");
post.setEntity(ent);
HttpClient client = new DefaultHttpClient();
HttpResponse responsePOST = client.execute(post);
자, 이제 사용하실 수 있습니다.responsePOST
을 문자열로 응답 내용을 문자열로 가져옵니다.
BufferedReader reader = new BufferedReader(new InputStreamReader(responsePOST.getEntity().getContent()), 2048);
if (responsePOST != null) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
System.out.println(" line : " + line);
sb.append(line);
}
String getResponseString = "";
getResponseString = sb.toString();
//use server output getResponseString as string value.
}
★★HttpURLConnection.setRequestMethod("POST")
★★★★★★★★★★★★★★★★★」HttpURLConnection.setDoOutput(true);
실제로는 POST가 기본 방식이 되므로 후자만 필요합니다.
apache http api를 기반으로 한http-request 사용을 권장합니다.
HttpRequest<String> httpRequest = HttpRequestBuilder.createPost("http://www.example.com/page.php", String.class)
.responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();
public void send(){
String response = httpRequest.execute("id", "10").get();
}
okhttp 사용:
okhttp의 소스 코드는 https://github.com/square/okhttp 에서 찾을 수 있습니다.
폼 프로젝트를 작성할 경우 이 종속성을 추가합니다.
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.2.2</version>
</dependency>
단순히 인터넷에서 '다운로드 okhttp'를 검색하기만 하면 됩니다.jar를 다운로드할 수 있는 몇 가지 결과가 나타납니다.
코드:
import okhttp3.*;
import java.io.IOException;
public class ClassName{
private void sendPost() throws IOException {
// form parameters
RequestBody formBody = new FormBody.Builder()
.add("id", 10)
.build();
Request request = new Request.Builder()
.url("http://www.example.com/page.php")
.post(formBody)
.build();
OkHttpClient httpClient = new OkHttpClient();
try (Response response = httpClient.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
// Get response body
System.out.println(response.body().string());
}
}
}
java.net에서 간단하게:
public void post(String uri, String data) throws Exception {
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(uri))
.POST(BodyPublishers.ofString(data))
.build();
HttpResponse<?> response = client.send(request, BodyHandlers.discarding());
System.out.println(response.statusCode());
상세한 것에 대하여는, https://openjdk.java.net/groups/net/httpclient/recipes.html#post 를 참조해 주세요.
언급URL : https://stackoverflow.com/questions/3324717/sending-http-post-request-in-java
'source' 카테고리의 다른 글
MAMP에 PHP 버전을 추가하는 방법 (0) | 2022.11.25 |
---|---|
판다의 열을 regex로 필터링하는 방법 (0) | 2022.11.25 |
FOUND_ROWS가 있는 SQL_CALC_FOUND_ROWS는 항상 1을 반환합니다. (0) | 2022.11.25 |
Test Containers Framework가 도커 deamon에 연결할 수 없습니다. (0) | 2022.11.25 |
술어와 일치하는 시퀀스에서 첫 번째 요소 찾기 (0) | 2022.11.25 |