2015-09-23 25 views
1

在我的Java腳本,我可以列出我的日曆事件數據公佈至HTTP服務器:如何使用Java

String pageToken = null; 
do { 
    Events events= null; 
    try { 
     events = service.events().list(CALENDAR_ID).setPageToken(pageToken).execute(); 
    } catch (IOException ex) { 
     Logger.getLogger(CalendarService.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    List<Event> items = events.getItems(); 
    for (Event event : items) { 
     System.out.println(event.getSummary()); 
     System.out.println(event.getStart()); 
    } 
    pageToken = events.getNextPageToken(); 
} while (pageToken != null); 

我不知道如何可以通過HTTP發送這個信息發送到服務器?提前致謝!

+0

如果你想將數據發送到服務器,最好要問不同的問題,如:「如何發佈使用Java數據到HTTP服務器」。您遇到的問題並不一定與Google-callendar本身有關。 – Jaap

+0

@Jaap,但服務器接受的數據(如果有)的格式(和內容類型)因服務器而異,所以服務器*不重要。不管它是使用POST,PUT,GET還是其他的東西。 –

回答

1

您需要使用HTTP客戶端,例如Netty HTTP ClientApache HTTP Components

這是一個example taken from Apache HTTP Components

/** 
* Elemental example for executing multiple POST requests sequentially. 
*/ 
public class ElementalHttpPost { 

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

     HttpProcessor httpproc = HttpProcessorBuilder.create() 
      .add(new RequestContent()) 
      .add(new RequestTargetHost()) 
      .add(new RequestConnControl()) 
      .add(new RequestUserAgent("Test/1.1")) 
      .add(new RequestExpectContinue(true)).build(); 

     HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); 

     HttpCoreContext coreContext = HttpCoreContext.create(); 
     HttpHost host = new HttpHost("localhost", 8080); 
     coreContext.setTargetHost(host); 

     DefaultBHttpClientConnection conn = new DefaultBHttpClientConnection(8 * 1024); 
     ConnectionReuseStrategy connStrategy = DefaultConnectionReuseStrategy.INSTANCE; 

     try { 

      HttpEntity[] requestBodies = { 
        new StringEntity(
          "This is the first test request", 
          ContentType.create("text/plain", Consts.UTF_8)), 
        new ByteArrayEntity(
          "This is the second test request".getBytes(Consts.UTF_8), 
          ContentType.APPLICATION_OCTET_STREAM), 
        new InputStreamEntity(
          new ByteArrayInputStream(
            "This is the third test request (will be chunked)" 
            .getBytes(Consts.UTF_8)), 
          ContentType.APPLICATION_OCTET_STREAM) 
      }; 

      for (int i = 0; i < requestBodies.length; i++) { 
       if (!conn.isOpen()) { 
        Socket socket = new Socket(host.getHostName(), host.getPort()); 
        conn.bind(socket); 
       } 
       BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest("POST", 
         "/servlets-examples/servlet/RequestInfoExample"); 
       request.setEntity(requestBodies[i]); 
       System.out.println(">> Request URI: " + request.getRequestLine().getUri()); 

       httpexecutor.preProcess(request, httpproc, coreContext); 
       HttpResponse response = httpexecutor.execute(request, conn, coreContext); 
       httpexecutor.postProcess(response, httpproc, coreContext); 

       System.out.println("<< Response: " + response.getStatusLine()); 
       System.out.println(EntityUtils.toString(response.getEntity())); 
       System.out.println("=============="); 
       if (!connStrategy.keepAlive(response, coreContext)) { 
        conn.close(); 
       } else { 
        System.out.println("Connection kept alive..."); 
       } 
      } 
     } finally { 
      conn.close(); 
     } 
    } 

} 
+0

您也可以使用方案http:或https:的URL來使用Java的內置'URLConnection'。但是你的例子只是連接和接收數據,它不會發送數據,這是個問題。 –

+0

@ dave_thompson_085是的,你可以使用脆弱的'HttpURLConnection'機制,但是你會缺少超時,重試,連接池等等。無論如何,我會編輯我的答案,以便顯示POST示例。感謝您指出了這一點。 –