2016-10-13 5 views
0

У меня возникли трудности с определением места ответа BAD, я выполнил запрос в приведенном ниже Java-коде, а также как вызов DELETE REST из интерфейса SOAP, где я получаю успешный 200 ответ. (Звонок идентичен)Java Apache httpdelete - 400 error

Код ниже предназначен для входа & выхода из системы сессии, установив кук - затем передать их в удалении вызова в качестве заголовка

кода Java

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import org.apache.http.Header; 
import org.apache.http.HttpHost; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.config.RequestConfig; 
import org.apache.http.client.methods.HttpDelete; 
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; 

public class testing { 

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

     HttpResponse httpResponse = null; 

     CloseableHttpClient httpclient = HttpClients.createDefault(); 

     RequestConfig requestConfig = RequestConfig.copy(RequestConfig.DEFAULT) 
       .setProxy(new HttpHost("xxx.xxx.xxx.xxx", 8080)) 
       .build(); 

     HttpHost target = new HttpHost("https://xxxxxxxxx.xxxxxxxxx.com"); 

     HttpPost post = new HttpPost("https://xxxxxxxxx.xxxxxxxxx.com/authentications/emails"); 

     post.setConfig(requestConfig); 

     post.addHeader("Accept-Language","en-GB"); 
     post.addHeader("X-ApiKey","xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx"); 
     post.addHeader("Content-Type", "application/json"); 


     StringEntity input = new StringEntity("{\"Password\":\"xxxxxxxxx\",\"Email\":\"[email protected]\"}"); 
     input.setContentType("application/json"); 
     post.setEntity(input); 

     httpResponse = httpclient.execute(target, post); 

     Header[] headers = httpResponse.getAllHeaders(); 

     for (Header header: headers) 
     { 
      System.out.println(header.getName() + ": " + header.getValue()); 
     } 

     String[] ss_id_list = headers[10].getValue().split(";"); 
     String ss_id = ss_id_list[0]; 
     String[] ss_pid_list = headers[11].getValue().split(";"); 
     String ss_pid = ss_pid_list[0]; 

     HttpDelete call = new HttpDelete("https://xxxxxxxxx-xxxxxxxxx.xxxxxxxxx.com/authentications/current"); 

     call.setConfig(requestConfig); 

     call.setHeader("Accept-Language","en-GB"); 
     call.setHeader("X-ApiKey","xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx"); 
     call.setHeader("Cookie", ss_id +";"+ ss_pid +"; ss-opt=temp; X-UAId=xxxxxxxxx;"); 
     call.setHeader("Content-Type", "application/x-www-form-urlencoded"); 

     Header[] rheaders = call.getAllHeaders(); 

     System.out.println(call.toString()); 
     for (Header rheader : rheaders) { 
      System.out.println(rheader.getName() + ": " + rheader.getValue()); 
     } 

     httpResponse = httpclient.execute(target, call); 

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

     StringBuilder content = new StringBuilder(); 
     String line; 
     while (null != (line = br.readLine())) { 
      content.append(line); 
     } 

     System.out.println(httpResponse.getStatusLine()); 

     httpclient.close(); 

    } 





} 

Java Запрос & Response

Access-Control-Allow-Headers: Content-Type 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Origin: * 
Cache-Control: private 
Content-Type: application/json; charset=utf-8 
Date: Thu, 13 Oct 2016 10:33:21 GMT 
X-Frame-Options: SAMEORIGIN 
X-Request-Identifier: xxxxxxxxx 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Set-Cookie: ss-id=xxxxxxxxx; path=/; HttpOnly 
Set-Cookie: ss-pid=xxxxxxxxx; expires=Mon, 13-Oct-2036 10:33:21 GMT; path=/; HttpOnly 
Set-Cookie: ss-opt=temp; expires=Mon, 13-Oct-2036 10:33:21 GMT; path=/; HttpOnly 
Set-Cookie: X-UAId=xxxxxxxxx; expires=Mon, 13-Oct-2036 10:33:21 GMT; path=/; HttpOnly 


DELETE https://xxxxxxxxx.xxxxxxxxx.com/authentications/current HTTP/1.1 
Accept-Language: en-GB 
X-ApiKey: xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx 
Cookie: ss-id=xxxxxxxxx;ss-pid=xxxxxxxxx; ss-opt=temp; X-UAId=xxxxxxxxx; 
Content-Type: application/x-www-form-urlencoded 
HTTP/1.1 400 Bad Request 

SOAP UI Запрос

DELETE https://xxxxxxxxx.xxxxxxxxx.com/authentications/current HTTP/1.1 
Accept-Encoding: gzip,deflate 
X-ApiKey: xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx 
Accept-Language: en-GB 
Cookie: ss-id=xxxxxxxxx;ss-pid=xxxxxxxxx; ss-opt=temp; X-UAId=xxxxxxxxx; 
Content-Type: text/html 
Content-Length: 0 
Host: xxxxxxxxx.xxxxxxxxx.com 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 

SOAP UI Response

HTTP/1.1 200 OK 
Access-Control-Allow-Headers: Content-Type 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Origin: * 
Cache-Control: private 
Content-Encoding: gzip 
Content-Type: application/json; charset=utf-8 
Date: Thu, 13 Oct 2016 10:15:29 GMT 
X-Frame-Options: SAMEORIGIN 
X-Request-Identifier: xxxxxxxxx 
Content-Length: 59 
Connection: keep-alive 

{"IsNewUser":false,"ResponseStatus":{}} 

Прошу прощения за дамп кода & ответов есть что-то очевидно в коде Java мне не хватает. Оба решения Java & SOAP UI используют этот сервер PROXY для этого запроса.

+0

Похоже, ваш Java не посылая 'delete' как запрос * метод *, но как запрос * тело * без метода. – RealSkeptic

+0

С первого взгляда: тип контента отличается. –

ответ

0

Оказывается, мешающая линия:

HttpHost target = new HttpHost("https://xxxxxxxxx.xxxxxxxxx.com"); 

Делая это, однако, с HTTPS соединений не вызывает доверенный сертификат не найдены исключение ошибок.

Я нашел много ответов о реализации диспетчера доверия & Имя хоста верификатор, но не для Apache HTTPClient (Это работает с v4.3)

TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 
    public void checkClientTrusted(X509Certificate[] certs, String authType) { 
    } 
    public void checkServerTrusted(X509Certificate[] certs, String authType) { 
    } 
} }; 

// Install the all-trusting trust manager 
final SSLContext sc = SSLContext.getInstance("TLS"); 
sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(sc, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

// Create all-trusting host name verifier 
X509HostnameVerifier allHostsValid = new X509HostnameVerifier() { 
    public boolean verify(String hostname, SSLSession session) { 
     return true; 
    } 

    public void verify(String arg0, SSLSocket arg1) throws IOException { 
     //Not Required Auto-generated method stub from X509HostnameVerifier 

    } 

    public void verify(String arg0, X509Certificate arg1) throws SSLException { 
     //Not Required Auto-generated method stub from X509HostnameVerifier 

    } 

    public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException { 
     //Not Required Auto-generated method stub from X509HostnameVerifier 

    } 
}; 
CloseableHttpClient httpclient = HttpClients.custom() 
     .setSSLSocketFactory(sslConnectionFactory) 
     .setHostnameVerifier(allHostsValid) 
     .build();