2014-06-05 133 views
0

我已經編寫了一個Web服務,現在正在編寫一個測試程序以從外部執行集成測試。我正在使用apache httpclient 4.3寫我的測試人員。根據這裏的代碼:http://hc.apache.org/httpcomponents-client-4.3.x/quickstart.html和這裏:http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/fundamentals.html#d5e186我寫了下面的代碼。HttpPost請求不成功

Map<String, String> parms = new HashMap<>(); 
    parms.put(AirController.KEY_VALUE, json); 
    postUrl(SERVLET, parms); 
    ... 

protected String postUrl(String servletName, Map<String, String> parms) 
     throws AirException{ 
    String url = rootUrl + servletName; 
    HttpPost post = new HttpPost(url); 

    List<NameValuePair> nvps = new ArrayList<NameValuePair>(); 
    for(Map.Entry<String, String> entry:parms.entrySet()){ 
     BasicNameValuePair parm = new BasicNameValuePair(entry.getKey(), entry.getValue()); 
     nvps.add(parm); 
    } 

    try { 
     post.setEntity(new UrlEncodedFormEntity(nvps)); 
    } catch (UnsupportedEncodingException use) { 
     String msg = "Invalid parameters:" + parms; 
     throw new AirException(msg, use); 
    } 

    CloseableHttpResponse response; 
    try { 
     response = httpclient.execute(post); 
    } catch (IOException ioe) { 
     throw new AirException(ioe); 
    } 

    String result; 
    if(HttpStatus.SC_OK == response.getStatusLine().getStatusCode()){ 
     result = processResponse(response); 
    } 
    else{ 
     String msg = MessageFormat.format("Invalid status code {0} received from query {1}.", 
              new Object[]{response.getStatusLine().getStatusCode(), url}); 
     throw new AirException(msg); 
    } 

    return result; 
} 

此代碼成功到達我的servlet。在我的servlet,我有(使用Spring的一個AbstractController):

protected ModelAndView post(HttpServletRequest request, HttpServletResponse response) { 
    String json = String.valueOf(request.getParameter(KEY_VALUE)); 
    if(json.equals("null")){ 
     log.info("Received null value."); 
     response.setStatus(406); 
     return null; 
    } 

而這個代碼總是落入空參數代碼,並返回406

我敢肯定,我失去了一些東西簡單,但看不到它是什麼。

+0

'parms'包含什麼? –

+0

@SotiriosDelimanolis看看前面幾行代碼。 – Thom

+0

是的,但'json'有什麼價值?在控制器中'AirController.KEY_VALUE'與'KEY_VALUE'具有相同的值嗎? –

回答

0

不知道如何調試這是可能的,而不傾倒標題?

post.setEntity(new UrlEncodedFormEntity(nvps)); 

你不需要知道上述結果是什麼標題? 你不需要知道你的代碼編組頭文件的確切集合嗎?

您可以首先使用curl/wget作爲您的服務的客戶端進行測試,使用詳細信息確保您正在使用成功服務的成功標題集。然後,使用你的java客戶端接近那一套頭文件,你應該很好。

例如,您的java客戶端需要使用RequestInterceptor實現來設置哪些東西?

CloseableHttpClient httpClient = HttpClients.custom()  .setConnectionManager(YourConnectionMgr.getInstance()) 
.addInterceptorLast(new HttpRequestInterceptor() { 
    public void process(
    final HttpRequest request, 
final HttpContext context) throws HttpException, IOException { 
.. 
             request.addHeader("Content-Type", "application/json") ; 
             request.addHeader("Content-Type", mimeType) ; 
            request.removeHeaders("Accept-Encoding"); 
            request.removeHeaders("Content-Type"); 
            request.addHeader("Expect", "100-continue"); 
            request.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8") ; 

爲了得到正確的標題可能會解決您的服務器端的問題,但你將需要公開的頭,甚至露出WIRE水平記錄。