2014-08-27 49 views
3

我對使用JAVA進行的特定REST調用有幾個問題。我是新手,所以我從幾個來源拼湊起來。調用本身看起來是這樣的:Java中的REST調用

String src = AaRestCall.subTrackingNum(trackingNum); 

的REST調用類看起來是這樣的:

public class AaRestCall { 
public static String subTrackingNum (Sting trackingNum) throws IOException { 
    URL url = new URL("https://.../rest/" + trackingNum); 
    String query = "{'TRACKINGNUM': trackingNum}"; 

    //make connection 
    URLConnection urlc = url.openConnection(); 

    //use post mode 
    urlc.setDoOutput(true); 
    urlc.setAllowUserInteraction(false); 

    //send query 
    PrintStream ps = new PrintStream(urlc.getOutputStream()); 
    ps.print(query); 
    ps.close(); 

    //get result 
    BufferedReader br = new BufferedReader(new InputStreamReader(urlc 
     .getInputStream())); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    while ((line=br.readLine())!=null) { 
     sb.append(line); 
    } 
    br.close(); 

    return sb.toString(); 
} 
} 

現在,我對上面幾個問題的什麼是錯的這個一般。

1)如果這個休息調用正在返回一個JSON對象,是否會因爲轉到String而搞砸了?

2)解析出返回的JSON的最佳方式是什麼?

3)我不確定如何格式化查詢字段。我認爲這應該記錄在REST API中?

在此先感謝。

回答

1

哦,我的。有幾個方面你可以改進這些代碼。我甚至不會指出錯誤,因爲我希望你用HTTP客戶端庫替換HTTP調用。我也不知道API所要求的規範,所以讓你在這個抽象級別正確使用POST或GET方法將需要更多的工作。

1)如果這個休息調用正在返回一個JSON對象,那麼通過去一個字符串會得到 搞砸了嗎?

不,但是把這個json編入一個obect是你的工作。像google gson這樣的圖書館可以提供幫助。

2)解析出返回的JSON的最佳方法是什麼?

我喜歡像上面提到的那樣使用gson,但是您可以使用另一個元帥/ unmarhal庫。

3)我不確定如何格式化查詢字段。我假設 應該記錄在REST API中?

是的。看看文檔,並拿出反映json結構的java對象。然後你可以用下面的代碼解析它們。

gson.fromJson(json, MyStructure.class);

HTTP客戶端

請看看使用庫像apache HTTP client,這將讓你的工作更容易編寫HTTP客戶端。

測試

既然你似乎是新來這個,我也建議你看一看像Postman一個工具,它可以幫助你測試你的API調用,如果你懷疑你的代碼已經寫有問題。

2

REST是一種應用於HTTP之上的模式。從你的問題來看,在我看來,你首先需要了解HTTP(以及一般的聊天套接字協議)是如何工作的以及Java API如何處理它。

你可以使用任何Json庫來解析HTTP響應主體(假設它是一個200 OK,你需要檢查並且注意HTTP重定向!),但這不是通常的構建方式。

如果服務公開一個真正的RESTful接口(與較簡單的HTTP + JSON相反),則需要使用四個HTTP動詞,而URLConnection不允許您這樣做。另外,您可能需要添加標頭以進行身份​​驗證,或者可能使用cookie(實際上它只是HTTP標頭,但仍值得單獨考慮)。所以我的建議是使用Apache commons中的HttpClient構建服務的客戶端部分,或者使用客戶端支持的某些JAX-RS庫(例如Apache CXF)。通過這種方式,您可以完全控制通信,同時獲得更好的抽象,而不是使用URLConnection提供的InputStream以及手動序列化/反序列化參數/響應。

關於如何格式化查詢字段的位,您首先需要掌握HTTP的基礎知識。反正肯定的答案取決於遠程服務實現,但你會面臨四種選擇:

  1. 在服務URL
  2. 您的HTTP請求
  3. 多部分的形式編碼體的查詢字符串你的HTTP請求的主體(類似於前者,但不同的MIME類型足以讓人頭痛) - 這通常用於HTTP + JSON服務,該服務也有一個網站,並且可以使用相同的URL上傳表單包含file輸入
  4. 服務定義的(例如application/jsonapplication/xml)編碼爲您的HTTP身體(再次,它真的與前兩點相同,但不同的MIME編碼意味着您將不得不使用不同的API)
1

我認爲您應該使用REST client library而不是寫你自己的,除非它是用於教育目的 - 然後通過一切手段瘋了!

REST服務將以HTTP response響應您的呼叫,有效負載可能也可能不會被格式化爲JSON string。如果是,我建議您使用JSON parsing library將該字符串轉換爲Java表示。

是的,您將不得不求助於特定的REST API:s文檔以獲取詳細信息。

P.S. java URL類被破壞,改爲使用URI。