Java-POST 메소드를 통해 HTTP 매개 변수를 쉽게 보내기


319

이 코드를 성공적으로 사용하여 메소드 HTTP를 통해 일부 매개 변수 로 요청 을 보냅니다. GET

void sendRequest(String request)
{
    // i.e.: request = "http://example.com/index.php?param1=a&param2=b&param3=c";
    URL url = new URL(request); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
    connection.setDoOutput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("GET"); 
    connection.setRequestProperty("Content-Type", "text/plain"); 
    connection.setRequestProperty("charset", "utf-8");
    connection.connect();
}

이제 매개 변수 POST가 너무 길기 때문에 메소드 를 통해 매개 변수 (예 : param1, param2, param3)를 보내야 할 수도 있습니다 . 해당 메소드에 추가 매개 변수를 추가하려고했습니다 (예 : String httpMethod).

어떻게 통해 하나 paramters을 보낼 수 있도록 가능한 한 적게 위의 코드를 변경할 수 있습니다 GET또는 POST?

나는 그 변화를 바라고 있었다

connection.setRequestMethod("GET");

connection.setRequestMethod("POST");

트릭을 수행했지만 매개 변수는 여전히 GET 메소드를 통해 전송됩니다.

했습니다 HttpURLConnection도움이 될 어떤 방법을 가지고? 유용한 Java 구문이 있습니까?

어떤 도움이라도 대단히 감사하겠습니다.


게시물 매개 변수는 URL이 아닌 http 헤더 섹션으로 전송됩니다. (귀하의 포스트 URL은 http://example.com/index.php)
dacwe

2
Java 1.6에는 setRequestMethod 메소드가 정의되어 있지 않습니다. docs.oracle.com/javase/6/docs/api/java/net/URLConnection.html
ante.sabo

2
Http (s) UrlConnection으로 전송 ....
Peter Kriens

질문을 확장! 누구든지 게시물 매개 변수로 첨부 파일을 보내는 방법에 대한 단서가 있습니까?
therealprashant

1
첫 번째 코드 스 니펫이 키워드 "function"으로 시작하는 이유는 무엇입니까?
Llew Vallis

답변:


470

GET 요청에서 매개 변수는 URL의 일부로 전송됩니다.

POST 요청에서 매개 변수는 헤더 다음에 요청 본문으로 전송됩니다.

HttpURLConnection으로 POST를 수행하려면 연결을 연 후 연결에 매개 변수를 작성해야합니다.

이 코드는 시작해야합니다.

String urlParameters  = "param1=a&param2=b&param3=c";
byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
int    postDataLength = postData.length;
String request        = "http://example.com/index.php";
URL    url            = new URL( request );
HttpURLConnection conn= (HttpURLConnection) url.openConnection();           
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty( "charset", "utf-8");
conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
conn.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
   wr.write( postData );
}

40
@Alan Geleynse : 'url.openconnection ()'이 연결을 열지 않습니다. connect () 문을 지정하지 않은 경우 http 요청 본문 / heared에 쓰고 보낼 때 연결이 열립니다. 나는 인증서로 이것을 시도했다. SSL 핸드 셰이크는 connect를 호출 한 후 또는 서버로 데이터를 보낼 때만 발생합니다.
Ashwin

14
getBytes ()는 환경의 기본 문자 세트를 사용합니다. NOT UTF-8 문자 세트 = utf-8은 컨텐츠 유형을 다음과 같이 나타내야합니다. 해야 할 일 : byte [] data = urlParameters.getData ( "UTF-8"); connection.getOutputStream (). write (data); 닫고 플러시하고 연결을 끊는 데 사용되지 않음
Peter Kriens

8
@PeterKriens 추가해 주셔서 감사합니다 byte[] data = urlParameters.getBytes(Charset.forName("UTF-8")).
gerrytan

7
@AlanGeleynse 놓치지 마세요 wr.flush (); wr.close (); 결국?
confile

9
그것이 작동하지 않는다면 어떻게 그렇게 많은 공감대가 있습니까? 당신은 전화 중 하나가 필요 conn.getResponseCode()하거나 conn.getInputStream()그렇지 않으면 데이터를 전송하지 않습니다.
Imaskar

229

다음은 양식을 제출 한 다음 결과 페이지를에 덤프하는 간단한 예입니다 System.out. URL과 POST 매개 변수를 적절하게 변경하십시오.

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

class Test {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://example.net/new-message.php");
        Map<String,Object> params = new LinkedHashMap<>();
        params.put("name", "Freddie the Fish");
        params.put("email", "fishie@seamail.example.com");
        params.put("reply_to_thread", 10394);
        params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish.");

        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String,Object> param : params.entrySet()) {
            if (postData.length() != 0) postData.append('&');
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            postData.append('=');
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        byte[] postDataBytes = postData.toString().getBytes("UTF-8");

        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
        conn.setDoOutput(true);
        conn.getOutputStream().write(postDataBytes);

        Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

        for (int c; (c = in.read()) >= 0;)
            System.out.print((char)c);
    }
}

String직접 인쇄 하는 대신 결과를 원하면 다음 을 수행하십시오.

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0;)
            sb.append((char)c);
        String response = sb.toString();

이것은 매개 변수 인코딩과 맵 사용을 포함하므로 가장 좋은 대답입니다.
Airy

4
불행하게도이 코드는 내용의 인코딩이이라고 가정하지만 UTF-8항상 그런 것은 아닙니다. 문자셋을 가져 오려면 헤더를 가져 와서 그 문자셋을 Content-Type구문 분석 해야 합니다. 해당 헤더를 사용할 수 없으면 표준 http 헤더를 사용하십시오 ISO-8859-1.
엔지니어

@Aprel IFTFY ... 평가에 부작용이있는 표현식을 사용하는 것은 실제로 추악합니다.

1
@engineercoding 불행히도 HTML의 경우 문서 내에 구문 분석해야하는 유니 코드 BOM <meta charset="...">또는 <meta http-equiv="Content-Type" content="...">헤더 가있을 수 있으므로 HTML을 올바르게 수행하는 것이 훨씬 어렵습니다 .
Boann

1
@Nepster 그렇게하지 마십시오. response += line;엄청나게 느리고 줄 바꿈을합니다. 답변에 문자열 응답을 얻는 예를 추가했습니다.
Boann

63

실제로 게시물을 작성하는 Alan의 예제 를 얻을 수 없으므로 결국 다음과 같이 끝났습니다.

String urlParameters = "param1=a&param2=b&param3=c";
URL url = new URL("http://example.com/index.php");
URLConnection conn = url.openConnection();

conn.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

writer.write(urlParameters);
writer.flush();

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
writer.close();
reader.close();         

1
불행히도이 코드는 응답을 읽지 않습니다. 빈 양식 html을 읽습니다.
Kovács Imre

내가 alan의 예에 추가해야했던 것은 응답 스트림을 여는 것입니다. 내가하기 전에 실제로 바이트가 전송되지 않았습니다.
beefeather

1
writer.close () 호출을 제거하면 나에게 도움이되었습니다.
Maxime T

23

나는 찾는다 HttpURLConnection 정말 사용하기에 성가신. 그리고 많은 상용구, 오류가 발생하기 쉬운 코드를 작성해야합니다. 내 안드로이드 프로젝트를 위해 가벼운 래퍼가 필요했고 DavidWebb 도 사용할 수있는 라이브러리가 나왔습니다 .

위 예제는 다음과 같이 쓸 수 있습니다 :

Webb webb = Webb.create();
webb.post("http://example.com/index.php")
        .param("param1", "a")
        .param("param2", "b")
        .param("param3", "c")
        .ensureSuccess()
        .asVoid();

제공된 링크에서 대체 라이브러리 목록을 찾을 수 있습니다.


1
귀하의 게시물이 답이 적고 광고가 많기 때문에 투표하지 않을 것입니다 ...하지만 도서관과 함께 연주했으며 좋아합니다. 간결한; 많은 구문 설탕; Java를 약간의 스크립팅 언어로 사용하면 http 상호 작용을 매우 빠르고 효율적으로 추가 할 수있는 훌륭한 라이브러리입니다. 제로 상용구는 때때로 가치가 있으며 OP에 유용했을 수 있습니다.
Dean

3
공감하겠습니다. 나는 내 앱 중 하나에서 DavidWebb를 성공적으로 사용했으며 곧 개발 할 두 가지를 위해 그렇게 할 것입니다. 사용하기 매우 쉽습니다.
William T. Mallard

감사합니다. Android에서 https로 DefaultHttpClient를 사용하면 SSLPeerUnverifiedException으로 실패합니다. 올바르게 서명 된 https 인증서에서도 피어 인증서가 없으며 URL을 사용하면 번거 롭습니다 (인코딩 매개 변수, 결과 확인). DavidWebb를 사용하면 도움이되었습니다.
Martin Vysny

AsyncTask가 지원되지 않습니까? 나쁜 기본적으로 UI 스레드 ... 잠금 그래서
slinden77

매우 기본적인 라이브러리입니다. 프로그래머는 백그라운드 스레드, AsyncTask, IntentService, 동기화 핸들러 등에서이를 호출해야합니다. 그리고 그것은 안드로이드에 의존하지 않습니다-> Java SE와 EE에서도 사용될 수 있습니다.
hgoebl 2016 년

12

위의 답변을 읽었으며 HTTP 요청을 단순화하는 유틸리티 클래스를 만들었습니다. 도움이 되길 바랍니다.

메소드 호출

  // send params with Hash Map
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("email","me@example.com");
    params.put("password","12345");

    //server url
    String url = "http://www.example.com";

    // static class "HttpUtility" with static method "newRequest(url,method,callback)"
    HttpUtility.newRequest(url,HttpUtility.METHOD_POST,params, new HttpUtility.Callback() {
        @Override
        public void OnSuccess(String response) {
        // on success
           System.out.println("Server OnSuccess response="+response);
        }
        @Override
        public void OnError(int status_code, String message) {
        // on error
              System.out.println("Server OnError status_code="+status_code+" message="+message);
        }
    });

유틸리티 클래스

import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import static java.net.HttpURLConnection.HTTP_OK;

public class HttpUtility {

 public static final int METHOD_GET = 0; // METHOD GET
 public static final int METHOD_POST = 1; // METHOD POST

 // Callback interface
 public interface Callback {
  // abstract methods
  public void OnSuccess(String response);
  public void OnError(int status_code, String message);
 }
 // static method
 public static void newRequest(String web_url, int method, HashMap < String, String > params, Callback callback) {

  // thread for handling async task
  new Thread(new Runnable() {
   @Override
   public void run() {
    try {
     String url = web_url;
     // write GET params,append with url
     if (method == METHOD_GET && params != null) {
      for (Map.Entry < String, String > item: params.entrySet()) {
       String key = URLEncoder.encode(item.getKey(), "UTF-8");
       String value = URLEncoder.encode(item.getValue(), "UTF-8");
       if (!url.contains("?")) {
        url += "?" + key + "=" + value;
       } else {
        url += "&" + key + "=" + value;
       }
      }
     }

     HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
     urlConnection.setUseCaches(false);
     urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // handle url encoded form data
     urlConnection.setRequestProperty("charset", "utf-8");
     if (method == METHOD_GET) {
      urlConnection.setRequestMethod("GET");
     } else if (method == METHOD_POST) {
      urlConnection.setDoOutput(true); // write POST params
      urlConnection.setRequestMethod("POST");
     }

     //write POST data 
     if (method == METHOD_POST && params != null) {
      StringBuilder postData = new StringBuilder();
      for (Map.Entry < String, String > item: params.entrySet()) {
       if (postData.length() != 0) postData.append('&');
       postData.append(URLEncoder.encode(item.getKey(), "UTF-8"));
       postData.append('=');
       postData.append(URLEncoder.encode(String.valueOf(item.getValue()), "UTF-8"));
      }
      byte[] postDataBytes = postData.toString().getBytes("UTF-8");
      urlConnection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
      urlConnection.getOutputStream().write(postDataBytes);

     }
     // server response code
     int responseCode = urlConnection.getResponseCode();
     if (responseCode == HTTP_OK && callback != null) {
      BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
      StringBuilder response = new StringBuilder();
      String line;
      while ((line = reader.readLine()) != null) {
       response.append(line);
      }
      // callback success
      callback.OnSuccess(response.toString());
      reader.close(); // close BufferReader
     } else if (callback != null) {
      // callback error
      callback.OnError(responseCode, urlConnection.getResponseMessage());
     }

     urlConnection.disconnect(); // disconnect connection
    } catch (IOException e) {
     e.printStackTrace();
     if (callback != null) {
      // callback error
      callback.OnError(500, e.getLocalizedMessage());
     }
    }
   }
  }).start(); // start thread
 }
}

10

나는 다른 대답이 대안을 제시 한 것을 보았습니다. 나는 개인적으로 직관적으로 옳은 일을하고 있다고 생각합니다.). 죄송합니다. devoxx에서 여러 스피커가 이런 종류의 일에 대해 뛰고 있습니다.

그렇기 때문에 필자는 개인적으로 Apache의 HTTPClient / HttpCore 라이브러리를 사용하여 이러한 종류의 작업을 수행합니다. API가 Java의 기본 HTTP 지원보다 사용하기 쉽다는 것을 알았습니다. 물론 YMMV!


10
import java.net.*;

public class Demo{

  public static void main(){

       String data = "data=Hello+World!";
       URL url = new URL("http://localhost:8084/WebListenerServer/webListener");
       HttpURLConnection con = (HttpURLConnection) url.openConnection();
       con.setRequestMethod("POST");
       con.setDoOutput(true);
       con.getOutputStream().write(data.getBytes("UTF-8"));
       con.getInputStream();

    }

}

5
WTH import java.net.*;!
Yousha Aleayoub

4

나는 같은 문제가 있었다. POST를 통해 데이터를 보내려고했습니다. 다음 코드를 사용했습니다.

    URL url = new URL("http://example.com/getval.php");
    Map<String,Object> params = new LinkedHashMap<>();
    params.put("param1", param1);
    params.put("param2", param2);

    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : params.entrySet()) {
        if (postData.length() != 0) postData.append('&');
        postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
        postData.append('=');
        postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
    }
    String urlParameters = postData.toString();
    URLConnection conn = url.openConnection();

    conn.setDoOutput(true);

    OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

    writer.write(urlParameters);
    writer.flush();

    String result = "";
    String line;
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

    while ((line = reader.readLine()) != null) {
        result += line;
    }
    writer.close();
    reader.close()
    System.out.println(result);

구문 분석을 위해 Jsoup을 사용했습니다.

    Document doc = Jsoup.parseBodyFragment(value);
    Iterator<Element> opts = doc.select("option").iterator();
    for (;opts.hasNext();) {
        Element item = opts.next();
        if (item.hasAttr("value")) {
            System.out.println(item.attr("value"));
        }
    }

4

GET 및 POST 메소드는 다음과 같이 설정됩니다. api 호출 1) get () 및 2) post ()의 두 가지 유형. get () 메소드는 API json 배열에서 값을 가져 와서 URL의 데이터 게시물에서 value & post () 메소드 사용을 가져오고 응답을 얻습니다.

 public class HttpClientForExample {

    private final String USER_AGENT = "Mozilla/5.0";

    public static void main(String[] args) throws Exception {

        HttpClientExample http = new HttpClientExample();

        System.out.println("Testing 1 - Send Http GET request");
        http.sendGet();

        System.out.println("\nTesting 2 - Send Http POST request");
        http.sendPost();

    }

    // HTTP GET request
    private void sendGet() throws Exception {

        String url = "http://www.google.com/search?q=developer";

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);

        // add request header
        request.addHeader("User-Agent", USER_AGENT);

        HttpResponse response = client.execute(request);

        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + 
                       response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                       new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

    // HTTP POST request
    private void sendPost() throws Exception {

        String url = "https://selfsolve.apple.com/wcResults.do";

        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);

        // add header
        post.setHeader("User-Agent", USER_AGENT);

        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM"));
        urlParameters.add(new BasicNameValuePair("cn", ""));
        urlParameters.add(new BasicNameValuePair("locale", ""));
        urlParameters.add(new BasicNameValuePair("caller", ""));
        urlParameters.add(new BasicNameValuePair("num", "12345"));

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        HttpResponse response = client.execute(post);
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + post.getEntity());
        System.out.println("Response Code : " + 
                                    response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(
                        new InputStreamReader(response.getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }

        System.out.println(result.toString());

    }

}

3

이 패턴을 사용해보십시오 :

public static PricesResponse getResponse(EventRequestRaw request) {

    // String urlParameters  = "param1=a&param2=b&param3=c";
    String urlParameters = Piping.serialize(request);

    HttpURLConnection conn = RestClient.getPOSTConnection(endPoint, urlParameters);

    PricesResponse response = null;

    try {
        // POST
        OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
        writer.write(urlParameters);
        writer.flush();

        // RESPONSE
        BufferedReader reader = new BufferedReader(new InputStreamReader((conn.getInputStream()), StandardCharsets.UTF_8));
        String json = Buffering.getString(reader);
        response = (PricesResponse) Piping.deserialize(json, PricesResponse.class);

        writer.close();
        reader.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    conn.disconnect();

    System.out.println("PricesClient: " + response.toString());

    return response;
}

public static HttpURLConnection getPOSTConnection(String endPoint, String urlParameters) {

    return RestClient.getConnection(endPoint, "POST", urlParameters);

}


public static HttpURLConnection getConnection(String endPoint, String method, String urlParameters) {

    System.out.println("ENDPOINT " + endPoint + " METHOD " + method);
    HttpURLConnection conn = null;

    try {
        URL url = new URL(endPoint);
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setDoOutput(true);
        conn.setRequestProperty("Content-Type", "text/plain");

    } catch (IOException e) {
        e.printStackTrace();
    }

    return conn;
}

3

이 답변은 사용자 정의 Java POJO를 사용한 POST 호출의 특정 사례를 다룹니다.

Gson에 대한 Maven 종속성 사용 이 Java 객체를 JSON으로 직렬화합니다.

아래의 종속성을 사용하여 Gson을 설치하십시오.

<dependency>
  <groupId>com.google.code.gson</groupId>
  <artifactId>gson</artifactId>
  <version>2.8.5</version>
  <scope>compile</scope>
</dependency>

gradle을 사용하는 사람들은 아래를 사용할 수 있습니다

dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}

다른 수입품 :

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.*;
import org.apache.http.impl.client.CloseableHttpClient;
import com.google.gson.Gson;

이제 Apache에서 제공하는 HttpPost를 사용할 수 있습니다.

private CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("https://example.com");

Product product = new Product(); //custom java object to be posted as Request Body
    Gson gson = new Gson();
    String client = gson.toJson(product);

    httppost.setEntity(new StringEntity(client, ContentType.APPLICATION_JSON));
    httppost.setHeader("RANDOM-HEADER", "headervalue");
    //Execute and get the response.
    HttpResponse response = null;
    try {
        response = httpclient.execute(httppost);
    } catch (IOException e) {
        throw new InternalServerErrorException("Post fails");
    }
    Response.Status responseStatus = Response.Status.fromStatusCode(response.getStatusLine().getStatusCode());
    return Response.status(responseStatus).build();

위의 코드는 POST Call에서 수신 한 응답 코드와 함께 반환됩니다.


2

여기에 jsonobject를 매개 변수 // jsonobject = { "name": "lucifer", "pass": "abc"} // serverUrl = " http://192.168.100.12/testing"//host=192.168.100.12로 보냈습니다.

  public static String getJson(String serverUrl,String host,String jsonobject){

    StringBuilder sb = new StringBuilder();

    String http = serverUrl;

    HttpURLConnection urlConnection = null;
    try {
        URL url = new URL(http);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setRequestMethod("POST");
        urlConnection.setUseCaches(false);
        urlConnection.setConnectTimeout(50000);
        urlConnection.setReadTimeout(50000);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Host", host);
        urlConnection.connect();
        //You Can also Create JSONObject here 
        OutputStreamWriter out = new OutputStreamWriter(urlConnection.getOutputStream());
        out.write(jsonobject);// here i sent the parameter
        out.close();
        int HttpResult = urlConnection.getResponseCode();
        if (HttpResult == HttpURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    urlConnection.getInputStream(), "utf-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            }
            br.close();
            Log.e("new Test", "" + sb.toString());
            return sb.toString();
        } else {
            Log.e(" ", "" + urlConnection.getResponseMessage());
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } finally {
        if (urlConnection != null)
            urlConnection.disconnect();
    }
    return null;
}

2

아파치 http api를 기반으로 한 http-request를 추천 합니다.

귀하의 경우 예를 볼 수 있습니다 :

private static final HttpRequest<String.class> HTTP_REQUEST = 
      HttpRequestBuilder.createPost("http://example.com/index.php", String.class)
           .responseDeserializer(ResponseDeserializer.ignorableDeserializer())
           .build();

public void sendRequest(String request){
     String parameters = request.split("\\?")[1];
     ResponseHandler<String> responseHandler = 
            HTTP_REQUEST.executeWithQuery(parameters);

   System.out.println(responseHandler.getStatusCode());
   System.out.println(responseHandler.get()); //prints response body
}

응답 본문에 관심이없는 경우

private static final HttpRequest<?> HTTP_REQUEST = 
     HttpRequestBuilder.createPost("http://example.com/index.php").build();

public void sendRequest(String request){
     ResponseHandler<String> responseHandler = 
           HTTP_REQUEST.executeWithQuery(parameters);
}

일반적으로 전송 포스트와 요청에 대한 HTTP 요청 : 읽기 문서 내 대답을 참조 HTTP 자바에서 JSON 문자열과 POST 요청 , 자바에서 보내는 HTTP POST 요청 , 자바에서 JSON을 사용하여 HTTP POST를


1

안녕하세요 pls는이 클래스를 사용하여 게시 방법을 향상시킵니다.

public static JSONObject doPostRequest(HashMap<String, String> data, String url) {

    try {
        RequestBody requestBody;
        MultipartBuilder mBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);

        if (data != null) {


            for (String key : data.keySet()) {
                String value = data.get(key);
                Utility.printLog("Key Values", key + "-----------------" + value);

                mBuilder.addFormDataPart(key, value);

            }
        } else {
            mBuilder.addFormDataPart("temp", "temp");
        }
        requestBody = mBuilder.build();


        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();

        OkHttpClient client = new OkHttpClient();
        Response response = client.newCall(request).execute();
        String responseBody = response.body().string();
        Utility.printLog("URL", url);
        Utility.printLog("Response", responseBody);
        return new JSONObject(responseBody);

    } catch (UnknownHostException | UnsupportedEncodingException e) {

        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Error: " + e.getLocalizedMessage());
    } catch (Exception e) {
        e.printStackTrace();
        JSONObject jsonObject=new JSONObject();

        try {
            jsonObject.put("status","false");
            jsonObject.put("message",e.getLocalizedMessage());
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
        Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
    }
    return null;
}

0

Boann의 대답을 취하여 PHP의 http_build_query 메소드와 같이 목록과 배열을 지원하는보다 유연한 쿼리 문자열 작성기를 만드는 데 사용했습니다.

public static byte[] httpBuildQueryString(Map<String, Object> postsData) throws UnsupportedEncodingException {
    StringBuilder postData = new StringBuilder();
    for (Map.Entry<String,Object> param : postsData.entrySet()) {
        if (postData.length() != 0) postData.append('&');

        Object value = param.getValue();
        String key = param.getKey();

        if(value instanceof Object[] || value instanceof List<?>)
        {
            int size = value instanceof Object[] ? ((Object[])value).length : ((List<?>)value).size();
            for(int i = 0; i < size; i++)
            {
                Object val = value instanceof Object[] ? ((Object[])value)[i] : ((List<?>)value).get(i);
                if(i>0) postData.append('&');
                postData.append(URLEncoder.encode(key + "[" + i + "]", "UTF-8"));
                postData.append('=');            
                postData.append(URLEncoder.encode(String.valueOf(val), "UTF-8"));
            }
        }
        else
        {
            postData.append(URLEncoder.encode(key, "UTF-8"));
            postData.append('=');            
            postData.append(URLEncoder.encode(String.valueOf(value), "UTF-8"));
        }
    }
    return postData.toString().getBytes("UTF-8");
}

0

키-값 쌍이 필요하기 때문에 $ _POST를 사용하여 PHP 페이지에서 요청을 수신하는 데 문제가있는 경우 :

모든 답변이 매우 도움이되는 반면, 이전 아파치 HttpClient에서 사용한 문자열 때문에 실제로 게시 할 문자열에 대한 기본 이해가 부족했습니다.

new UrlEncodedFormEntity(nameValuePairs); (Java)

그런 다음 PHP에서 $ _POST를 사용하여 키-값 쌍을 얻을 수 있습니다.

내 이해를 위해 지금 게시하기 전에 수동으로 해당 문자열을 작성했습니다. 따라서 문자열은

val data = "key1=val1&key2=val2"

대신 URL에 추가하면 헤더에 게시됩니다.

대안은 대신 json-string을 사용하는 것입니다.

val data = "{\"key1\":\"val1\",\"key2\":\"val2\"}" // {"key1":"val1","key2":"val2"}

$ _POST없이 PHP로 가져옵니다.

$json_params = file_get_contents('php://input');
// echo_p("Data: $json_params");
$data = json_decode($json_params, true);

Kotlin의 샘플 코드는 다음과 같습니다.

class TaskDownloadTest : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void): Void? {
        var urlConnection: HttpURLConnection? = null

        try {

            val postData = JsonObject()
            postData.addProperty("key1", "val1")
            postData.addProperty("key2", "val2")

            // reformat json to key1=value1&key2=value2
            // keeping json because I may change the php part to interpret json requests, could be a HashMap instead
            val keys = postData.keySet()
            var request = ""
            keys.forEach { key ->
                // Log.i("data", key)
                request += "$key=${postData.get(key)}&"
            }
            request = request.replace("\"", "").removeSuffix("&")
            val requestLength = request.toByteArray().size
            // Warning in Android 9 you need to add a line in the application part of the manifest: android:usesCleartextTraffic="true"
            // /programming/45940861/android-8-cleartext-http-traffic-not-permitted
            val url = URL("http://10.0.2.2/getdata.php")
            urlConnection = url.openConnection() as HttpURLConnection
            // urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") // apparently default
            // Not sure what these are for, I do not use them
            // urlConnection.setRequestProperty("Content-Type", "application/json")
            // urlConnection.setRequestProperty("Key","Value")
            urlConnection.readTimeout = 5000
            urlConnection.connectTimeout = 5000
            urlConnection.requestMethod = "POST"
            urlConnection.doOutput = true
            // urlConnection.doInput = true
            urlConnection.useCaches = false
            urlConnection.setFixedLengthStreamingMode(requestLength)
            // urlConnection.setChunkedStreamingMode(0) // if you do not want to handle request length which is fine for small requests

            val out = urlConnection.outputStream
            val writer = BufferedWriter(
                OutputStreamWriter(
                    out, "UTF-8"
                )
            )
            writer.write(request)
            // writer.write("{\"key1\":\"val1\",\"key2\":\"val2\"}") // {"key1":"val1","key2":"val2"} JsonFormat or just postData.toString() for $json_params=file_get_contents('php://input'); json_decode($json_params, true); in php
            // writer.write("key1=val1&key2=val2") // key=value format for $_POST in php
            writer.flush()
            writer.close()
            out.close()

            val code = urlConnection.responseCode
            if (code != 200) {
                throw IOException("Invalid response from server: $code")
            }

            val rd = BufferedReader(
                InputStreamReader(
                    urlConnection.inputStream
                )
            )
            var line = rd.readLine()
            while (line != null) {
                Log.i("data", line)
                line = rd.readLine()
            }
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            urlConnection?.disconnect()
        }

        return null
    }
}

-3

POST로 취급하려면 connection.getOutputStream()"한 번 이상"(및) 호출해야한다고 나타납니다 setDoOutput(true).

따라서 필요한 최소 코드는 다음과 같습니다.

    URL url = new URL(urlString);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    //connection.setRequestMethod("POST"); this doesn't seem to do anything at all..so not useful
    connection.setDoOutput(true); // set it to POST...not enough by itself however, also need the getOutputStream call...
    connection.connect();
    connection.getOutputStream().close(); 

놀랍게도 urlString에서 "GET"스타일 매개 변수를 사용할 수도 있습니다. 그것은 혼동 될 수 있지만.

NameValuePair를 분명히 사용할 수도 있습니다 .


POST 매개 변수는 어디에 있습니까?
Yousha Aleayoub

사람들이 왜 이것을 다운 피팅합니까? 그것은, POST의 모든에서 수행하는 방법에 대한 메모의 매개 변수가없는 (즉, 어떤 payload0 ...하지만
rogerdpack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.