2013-10-03 118 views
4

我需要將Kii MbaaS服務集成到除移動應用程序之外的其中一個Web應用程序中。我使用Android SDK並能夠連接它。但是,對於使用Java解決方案的網站,他們沒有任何SDK,並要求我使用REST進行操作。現在我打算使用Servlet中的ApacheHttpClient連接到REST服務。文檔中的REST格式如下。在ApacheHttpClient中,我知道我可以像HttpGet.addHeader(「content-type」,「application/json」)那樣傳遞頭文件(-H)。但是我不知道如何傳遞數據(-d)。任何人都可以通過指向任何教程鏈接或任何示例代碼來了解如何將數據與標頭一起傳遞到REST服務?使用ApacheHttpClient與數據和標頭的REST呼叫

剩下的語法如下─提前

curl -v -X POST \ 
    -H "content-type:application/json" \ 
    -H "x-kii-appid:{APP_ID}" \ 
    -H "x-kii-appkey:{APP_KEY}" \ 
    "https://api.kii.com/api/oauth2/token" \ 
    -d '{"username":"user_123456", "password":"123ABC"}' 

感謝給出。

-------------------------編輯-------------------- ------------------------------ 這裏是我寫的使用Apache HttpClient 4.3庫連接到的示例java代碼,但是我保留得到錯誤爲400 ...任何人都可以請教?

錯誤 - 在線程 「主」 了java.lang.RuntimeException

異常:失敗:HTTP 錯誤代碼:400在 com.app.test.RestClientTest.main(RestClientTest.java:49)

package com.app.test; 

    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.net.MalformedURLException; 
    import java.util.ArrayList; 
    import java.util.List; 

    import org.apache.http.Consts; 
    import org.apache.http.NameValuePair; 
    import org.apache.http.client.entity.UrlEncodedFormEntity; 
    import org.apache.http.client.methods.CloseableHttpResponse; 
    import org.apache.http.client.methods.HttpPost; 
    import org.apache.http.impl.client.CloseableHttpClient; 
    import org.apache.http.impl.client.HttpClients; 
    import org.apache.http.message.BasicNameValuePair; 

    public class RestClientTest { 

     /** 
     * @param args 
     */ 
     public static void main(String[] args) { 
      CloseableHttpClient httpClient = null; 
      HttpPost httpost = null; 
      CloseableHttpResponse response = null; 

      try { 

       httpClient = HttpClients.createDefault(); 
       httpost = new HttpPost("https://api.kii.com/api/oauth2/token"); 
       httpost.addHeader("content-type", "application/json"); 
       httpost.addHeader("x-kii-appid", "xxxxx"); 
       httpost.addHeader("x-kii-appkey", "xxxxxxxx"); 

       List<NameValuePair> nvps = new ArrayList<NameValuePair>(); 
       nvps.add(new BasicNameValuePair("username", "xxxxx")); 
       nvps.add(new BasicNameValuePair("password", "xxxxx")); 

       // StringEntity input = new 
       // StringEntity("{\"qty\":100,\"name\":\"iPad 4\"}"); 
       // input.setContentType("application/json"); 
       httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); 

       response = httpClient.execute(httpost); 

       if (response.getStatusLine().getStatusCode() != 200) { 
        throw new RuntimeException("Failed : HTTP error code : " 
          + response.getStatusLine().getStatusCode()); 
       } 

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

       String output; 
       System.out.println("Output from Server .... \n"); 
       while ((output = br.readLine()) != null) { 
        System.out.println(output); 
       } 
      } catch (MalformedURLException e) { 

       e.printStackTrace(); 

      } catch (IOException e) { 

       e.printStackTrace(); 

      } finally { 
       try{ 
        response.close(); 
        httpClient.close(); 
       }catch(Exception ex) { 
        ex.printStackTrace(); 
       } 
      } 

     } 
    } 
+0

如果你可以使用任何其餘的客戶端庫,它會很容易的工作。你可以看看[Jersey客戶端](https://jersey.java.net/documentation/latest/client.html#d0e2562) – Lifecube

+0

是啊,你的觀點...然而,你可以請給我一些例子,我怎麼能將數據和標題都傳遞給REST終點? – raj239

回答

3

好吧我知道了解決。我需要以嚴格的json格式封裝數據併發布它,它將起作用。

在這裏,我發佈的其他人正在計劃在他們的網絡應用程序除了移動應用程序使用Kii MbaaS相同。

package com.app.test; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.apache.http.client.methods.CloseableHttpResponse; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.message.BasicNameValuePair; 

public class RestClientTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     CloseableHttpClient httpClient = null; 
     HttpPost httpPost = null; 
     CloseableHttpResponse response = null; 

     try { 

      httpClient = HttpClients.createDefault(); 
      httpPost = new HttpPost("https://api.kii.com/api/oauth2/token"); 

      List<NameValuePair> nvps = new ArrayList<NameValuePair>(); 
      nvps.add(new BasicNameValuePair("content-type", "application/json")); 
      nvps.add(new BasicNameValuePair("x-kii-appid", "xxxxx")); 
      nvps.add(new BasicNameValuePair("x-kii-appkey", "xxxxxxxxxxxxxx")); 

      StringEntity input = new StringEntity("{\"username\": \"dummyuser\",\"password\": \"dummypassword\"}"); 
      input.setContentType("application/json"); 
      httpPost.setEntity(input); 

      for (NameValuePair h : nvps) 
      { 
       httpPost.addHeader(h.getName(), h.getValue()); 
      } 

      response = httpClient.execute(httpPost); 

      if (response.getStatusLine().getStatusCode() != 200) { 
       throw new RuntimeException("Failed : HTTP error code : " 
         + response.getStatusLine().getStatusCode()); 
      } 

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

      String output; 
      System.out.println("Output from Server .... \n"); 
      while ((output = br.readLine()) != null) { 
       System.out.println(output); 
      } 
     } catch (MalformedURLException e) { 

      e.printStackTrace(); 

     } catch (IOException e) { 

      e.printStackTrace(); 

     } finally { 
      try{ 
       response.close(); 
       httpClient.close(); 
      }catch(Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 

    } 
}