2016-11-13 14 views
13

Request in postmanJak wysłać żądanie POST z x-www-form-urlencoded ciała

Jak w java, mogę wysłać wniosek z x-www-form-urlencoded header. Nie rozumiem, jak wysłać ciało z parą klucz-wartość, jak na powyższym zrzucie ekranu.

Próbowałem ten kod:

String urlParameters = 
    cafedra_name+ data_to_send; 
URL url; 
    HttpURLConnection connection = null; 
    try { 
     //Create connection 
     url = new URL(targetURL); 
     connection = (HttpURLConnection)url.openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", 
      "application/x-www-form-urlencoded"); 

     connection.setRequestProperty("Content-Length", "" + 
       Integer.toString(urlParameters.getBytes().length)); 
     connection.setRequestProperty("Content-Language", "en-US"); 

     connection.setUseCaches (false); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 

     //Send request 
     DataOutputStream wr = new DataOutputStream (
        connection.getOutputStream()); 
     wr.writeBytes (urlParameters); 
     wr.flush(); 
     wr.close(); 

Ale w odpowiedzi, że nie otrzyma prawidłowe dane.

+0

Czy zdobyty co został wysłany za pomocą narzędzia takiego jak Wireshark, aby potwierdzić, że nagłówek jest właściwie nieobecny? –

Odpowiedz

20

Po ustawieniu application/x-www-form-urlencoded jako typu zawartości, więc dane wysłane muszą być w tym formacie.

String urlParameters = "param1=data1&param2=data2&param3=data3"; 

Wysyłanie części jest teraz dość proste.

byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8); 
int postDataLength = postData.length; 
String request = "<Url here>"; 
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); 
} 

Albo można utworzyć ogólną metodę budowania kluczową wartością wzorca, który jest wymagany dla application/x-www-form-urlencoded.

private String getDataString(HashMap<String, String> params) throws UnsupportedEncodingException{ 
    StringBuilder result = new StringBuilder(); 
    boolean first = true; 
    for(Map.Entry<String, String> entry : params.entrySet()){ 
     if (first) 
      first = false; 
     else 
      result.append("&");  
     result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 
     result.append("="); 
     result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 
    }  
    return result.toString(); 
} 
+0

Hej, Mari! Co zrobiłeś, żeby to zadziałało? Próbowałem tego samego (i wielu różnych rzeczy przez 10 godzin), ale to nie działa :( –

+1

W końcu znalazłem rozwiązanie: http://stackoverflow.com/questions/39937240/android-post-request-not-working –

+0

Czy ktoś może wyjaśnić część "" charset "," utf-8 ""? Myślę, że może to być błędne, ponieważ powinno być częścią nagłówka Content-Type, a nie nagłówkiem. – dauer

6

Dla HttpEntity, poniżej odpowiedź działa

HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 

MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>(); 
map.add("email", "[email protected]"); 

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); 

ResponseEntity<String> response = restTemplate.postForEntity(url, request , String.class); 

Dla porównania: How to POST form data with Spring RestTemplate?

Powiązane problemy