2013-08-21 2 views
0

J'ai examiné de nombreuses questions concernant ce même problème et j'ai essayé de nombreuses solutions proposées sans succès. Celui situé here semble le plus pertinent, comme le commentaire par RedSonic a répondu pourquoi cela ne fonctionne pas.
J'essaie de faire une demande POST ou PUT à mon serveur en utilisant la bibliothèque Apache de Java.Utilisation de HttpPost/Put avec ContentType Java Apache

public static void put(String caseNumber,DefaultHttpClient httpClient) 
     throws Exception { 
    HttpPut putRequest = new HttpPut(
      "http://localhost:8888/servlet/example1/" + caseNumber); 
    putRequest.addHeader("Version", version); 
//  putRequest.setHeader("Content-Type", content); 
//  putRequest.addHeader(new BasicHeader("ContentType", content)); 
    putRequest.setHeader("Accept", accept); 
    putRequest.setHeader("Date", date); 

    List <NameValuePair> nvpsPut = new ArrayList <NameValuePair>(); 
    nvpsPut.add(new BasicNameValuePair("group", jsonPostGroup)); 
    putRequest.setEntity(new UrlEncodedFormEntity(nvpsPut)); 

    HttpResponse response = httpClient.execute(putRequest); 

} 

J'ai essayé de créer une entité séparée et de définir le type de contenu de l'entité, puis définissez l'entité sur la requête. J'ai aussi essayé d'autres choses, mais je n'arrive pas à obtenir la demande d'avoir le type de contenu que je veux passer sans que les paramètres que j'essaye d'envoyer soient vides.

ont également essayé

HttpPut putRequest = new HttpPut("http://localhost:8888/servlet/example1/" + caseNumber); 
putRequest.addHeader("Version", version); 
putRequest.setHeader("Content-Type", content); 
putRequest.setHeader("Accept", accept); 
putRequest.setHeader("Date", date); 

BasicHttpParams bhp = new BasicHttpParams(); 
bhp.setParameter("test", jsonPostGroup); 
putRequest.setParams(bhp); 

HttpResponse response = httpClient.execute(putRequest); 

Log:

BasicClientConnectionManager - Get connection for route {}->http://localhost:8888 
DefaultClientConnectionOperator - Connecting to localhost:8888 
RequestAddCookies - CookieSpec selected: best-match 
RequestAuthCache - Auth cache not set in the context 
RequestTargetAuthentication - Target auth state: UNCHALLENGED 
RequestProxyAuthentication - Proxy auth state: UNCHALLENGED 
DefaultHttpClient - Attempt 1 to execute request 
DefaultClientConnection - Sending request: PUT /servlet/example1/000001994 HTTP/1.1 
wire - >> "PUT /servlet/example1/000001994 HTTP/1.1[\r][\n]" 
wire - >> "Version: 1.1[\r][\n]" 
wire - >> "Content-Type: application/JSON[\r][\n]" 
wire - >> "Accept: vnd.siren+JSON[\r][\n]" 
wire - >> "Date: Wed Aug 21 15:30:00 EDT 2013[\r][\n]" 
wire - >> "Content-Length: 0[\r][\n]" 
wire - >> "Host: localhost:8888[\r][\n]" 
wire - >> "Connection: Keep-Alive[\r][\n]" 
wire - >> "User-Agent: Apache-HttpClient/4.2.5 (java 1.5)[\r][\n]" 
wire - >> "[\r][\n]" 
headers - >> PUT /servlet/example1/000001994 HTTP/1.1 
headers - >> Version: 1.1 
headers - >> Content-Type: application/JSON 
headers - >> Accept: vnd.siren+JSON 
headers - >> Date: Wed Aug 21 15:30:00 EDT 2013 
headers - >> Content-Length: 0 
headers - >> Host: localhost:8888 
headers - >> Connection: Keep-Alive 
headers - >> User-Agent: Apache-HttpClient/4.2.5 (java 1.5) 
wire - << "HTTP/1.1 200 OK[\r][\n]" 
wire - << "Set-Cookie: JSESSIONID=davwq58qgxr8yvyw7bfybbbv;Path=/[\r][\n]" 
wire - << "Expires: Thu, 01 Jan 1970 00:00:00 GMT[\r][\n]" 
wire - << "Content-Type: text/html; charset=ISO-8859-1[\r][\n]" 
wire - << "Content-Length: 0[\r][\n]" 
wire - << "Server: Jetty(9.0.0.v20130308)[\r][\n]" 
wire - << "[\r][\n]" 
DefaultClientConnection - Receiving response: HTTP/1.1 200 OK 
headers - << HTTP/1.1 200 OK 
headers - << Set-Cookie: JSESSIONID=davwq58qgxr8yvyw7bfybbbv;Path=/ 
headers - << Expires: Thu, 01 Jan 1970 00:00:00 GMT 
headers - << Content-Type: text/html; charset=ISO-8859-1 
headers - << Content-Length: 0 
headers - << Server: Jetty(9.0.0.v20130308) 
ResponseProcessCookies - Cookie accepted: "[version: 0][name: JSESSIONID][value: davwq58qgxr8yvyw7bfybbbv][domain: localhost][path: /][expiry: null]". 
DefaultHttpClient - Connection can be kept alive indefinitely 
BasicClientConnectionManager - Releasing connection [email protected] 
BasicClientConnectionManager - Connection can be kept alive indefinitely 

Modifier: J'ai trouvé quelques autres suggestions que je l'ai essayé. Tels que la définition des paramètres sur le httpclient au lieu de la demande (ce qui n'a pas beaucoup de sens dans ce scénario) mais j'ai connu le même problème.

Édition 8/23: Je suis toujours en mesure de transmettre des paramètres via le paramètre Entity et de donner à l'entité une paire nom + valeur. Cependant, comme mentionné, cela enlève le type de contenu. D'autres pensées avant que j'abandonne entièrement?

+0

Tout d'abord, vous écrasez votre '' HttpEntity' en appelant setEntity() 'une seconde fois. Les paramètres de requête ne sont pas une entité. Vous pouvez utiliser la méthode 'setParams (HttpParams)' de 'AbstractHttpMessage' (c'est-à-dire par héritage' HttpPost') pour passer les paramètres de la requête. –

+0

Désolé, le premier setEntity était un reste quand j'essayais un tas de choses différentes. Je vais l'éditer maintenant. J'avais essayé setParams à l'origine sans succès. J'ai juste essayé encore, et ajouterai ce code à la question originale. – user2402831

+0

Ce que vous avez dans votre second extrait de code semble devoir fonctionner. Essayez d'activer la journalisation et vérifiez ce qui est envoyé et ce qui ne l'est pas. Voir [ici] (http://stackoverflow.com/questions/3246792/how-to-enable-logging-for-apache-commons-httpclient-on-android). –

Répondre

0

Ceci est une vieille question, mais ne devriez-vous pas ajouter tous les en-têtes? Certains des appels sont setHeader:

putRequest.addHeader("Version", version); 
putRequest.setHeader("Content-Type", content); 

devrait être:

putRequest.addHeader("Version", version); 
putRequest.addHeader("Content-Type", content); 
+0

Je me souviens dans le cas de cette API, les en-têtes étaient souhaités mais pas nécessaire. En fait, à condition que les en-têtes cassent l'application en raison d'un bogue dans le langage sous-jacent (Business Basic w/Java), l'API a été écrite. J'ai depuis longtemps couru loin de ça! – user2402831

Questions connexes