2014-12-13 3 views
1

이 HTTP 요청은 Jsoup : http://api.decarta.com/v1/[KEY]/batch?requestType=geocode을 통해 주어진 것으로 here으로 만들려고합니다.Jsoup HTTP POST (페이로드 포함)

   String postUrl=postURLPrefix+apiKey+"/batch?requestType=geocode"; 
       System.out.println(postUrl); 
       String response= Jsoup.connect(postUrl).timeout(60000).ignoreContentType(true) 
         .header("Content-Type", "application/json;charset=UTF-8") 
         .method(Connection.Method.POST) 
         .data("payload",jsonPayload.toString()) 
         .execute() 
         .body(); 

jsonPayload.toString()이 제공 : 완벽하게 유효한 JSON이다

{"payload":["146 Adkins Street,Pretoria,Pretoria,Gauteng","484 Hilda Street,Pretoria,Pretoria,Gauteng","268 Von Willich Street,Centurion,Centurion,Gauteng","100 Lion Road,Pretoria,Pretoria,Gauteng","Poligoon Street,Pretoria,Pretoria,Gauteng","91 Hornbill Street,Pretoria,Pretoria,Gauteng","55 Eland Street,Pretoria,Pretoria,Gauteng","31 Pelican Avenue,Centurion,Centurion,Gauteng","308 The Hillside Street,Pretoria,Pretoria,Gauteng","8 Spekhout Avenue,Centurion,Centurion,Gauteng","108 Apiesdoring Street,Pretoria,Pretoria,Gauteng","521 Louis Trichardt Street,Pretoria,Pretoria,Gauteng","31 Leopard Road,Pretoria,Pretoria,Gauteng","648 Klippan Street,Pretoria,Pretoria,Gauteng","13 Sweetpea Avenue,Pretoria,Pretoria,Gauteng","232 Kemphaan Street,Centurion,Centurion,Gauteng","32 Cantonments Road,Centurion,Centurion,Gauteng","882 Burlington St,Roseville,Gauteng","15 Brits Street,Olympus Ridge Complex,Centurion,Gauteng","15 Brits Street,Monument Park,Centurion,Gauteng","35 De La Rey Road,Monument Park,Centurion,Gauteng","112 Diamond St,Monument Park,Klerksoord,Gauteng","Hendrik Verwoerd Drive,Lyttelton,Centurion,Gauteng","777 Gambry Avenue,Garsfontein,Pretoria,Gauteng","57 Pheasant Avenue,Waterkloof Rand Corporatepark,Akasia,Gauteng","18 Huilboom Street,Manitoba Mews,Pretoria,Gauteng","75 Gousblom Avenue,Euro Stadt,Pretoria,Gauteng","88 Cambridge Avenue,Garsfontein,Centurion,Gauteng","662 Pual Kruger Street,Olympus Ridge Complex,Pretoria,Gauteng","231 Charles Street,Hatfield,Pretoria,Gauteng","9 Kobus Street,Pretoria West,Centurion,Gauteng","96 Siersteen Road,Byron Place,Pretoria,Gauteng","262 Molopo Avenue,Montana Crossing,Pretoria,Gauteng","171 Sonja Street,Moreleta Park,Centurion,Gauteng","751 Lucas Meyer Street,Moreleta Park,Pretoria,Gauteng","499 Moot Street,Centurion Lifestyle Centre,Pretoria,Gauteng","4 Hofsanger Road,Villa Lanei,Centurion,Gauteng","51 Newark Street,Centurion,Gauteng","25 Anton Street,Lyttelton,Centurion,Gauteng","15 Brits Street,Garsfontein Ext 10,Centurion,Gauteng","172 Wildeamandel Street,La Motagne,Pretoria,Gauteng","15 Fillicia Street,Waterkloof,Pretoria,Gauteng","20 Slagveld Street,Centurion,Gauteng","678 Rankdoring Street,Waterkloof Glen,Pretoria,Gauteng","7 Hillips Street,Faerie Glen X 34,Pretoria,Gauteng","59 Malherbe Street,Willows,Pretoria,Gauteng","204 Festival Street, Unit 1\",Willows,Pretoria","310 Cliff Avenue,Manitoba Mews,Pretoria,Gauteng","294 Panorama Road,Hatfield,Centurion,Gauteng","79 Buitenkant Street,Opera Plaza,Pretoria,Gauteng"]} 

그리고 여기에 같은 내 코드입니다.

그러나 Jsoup는 매번 HTTP 상태 400 (잘못된 형식)을 반환합니다. 그렇다면 Jsoup를 사용하여 JSON 페이로드로 올바른 http POST를 보내려면 어떻게해야합니까? (Pls에는 페이로드이고 URL에는 일반 키 - 값 쌍이 포함되지 않음).

+0

내 대답에 도움이 되었습니까? – alkis

+0

예 @alkis 감사합니다. upvote로 허용됩니다. – rahulserver

답변

4

raw data 게시가 필요합니다. 이 기능은 구현되었지만 아직 추가되지 않았습니다. 이 풀 요청을 확인하십시오 https://github.com/jhy/jsoup/pull/318. 이것을 위해 jsoup를 정말로 사용해야합니까? 나는 당신이 HttpURLConnection (이것은 jsoup가 사용하는 것)을 사용하여 요청을 한 다음 jsoup에 대한 응답을 문자열로 전달할 수 있음을 의미합니다. 여기

촬영 HttpURLConnection의 예 (그러나 단순화 된 JSON/미가공 데이터를 추가) www.mkyong.com

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class Main { 

    public static void main(String[] args) { 

     try { 

      String url = "http://www.google.com"; 

      URL obj = new URL(url); 
      HttpURLConnection conn = (HttpURLConnection) obj.openConnection(); 
      conn.setReadTimeout(5000); 
      conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8"); 
      conn.addRequestProperty("User-Agent", "Mozilla"); 
      conn.addRequestProperty("Referer", "google.com"); 

      conn.setDoOutput(true); 

      OutputStreamWriter w = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); 

      w.write("SOME_JSON_STRING_HERE"); 
      w.close(); 

      System.out.println("Request URL ... " + url); 

      int status = conn.getResponseCode(); 

      System.out.println("Response Code ... " + status); 

      BufferedReader in = new BufferedReader(new InputStreamReader(
        conn.getInputStream())); 
      String inputLine; 
      StringBuffer html = new StringBuffer(); 

      while ((inputLine = in.readLine()) != null) { 
       html.append(inputLine); 
      } 

      in.close(); 
      conn.disconnect(); 

      System.out.println("URL Content... \n" + html.toString()); 
      System.out.println("Done"); 

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

이것은 단지 예입니다. 그것은 정화 될 수 있고 정화되어야한다. 오류 처리가 존재하지 않습니다. 나는 이것을 가능한 한 간단하게하기 위해 의도적으로 남겼다. – alkis

+0

JSoup와 같은 라이브러리를 사용하지 않고 네이티브 방식으로이를 수행하는 방법에 대한 매우 미묘한 대답. 처음 시도했을 때 완벽하게 작동했습니다. +1 –

2

사용 최신 JSOUP 라이브러리. 당신이 받는다는을 사용하는 경우

, 다음

<dependency> 
     <groupId>org.jsoup</groupId> 
     <artifactId>jsoup</artifactId> 
     <version>1.10.2</version> 
</dependency> 

그리고 코드 아래

이 문제가 해결됩니다 pom.xml 파일에 항목 아래에 추가합니다.

String postUrl=postURLPrefix+apiKey+"/batch?requestType=geocode"; 
      System.out.println(postUrl); 
      String response= Jsoup.connect(postUrl).timeout(60000).ignoreContentType(true) 
        .method(Connection.Method.POST) 
        .requestBody("payload",jsonPayload.toString()) 
        .execute() 
        .body();