Android HTTPPost Renvoie l'Erreur “Méthode non autorisée.”
Je code un Android 2.2 application qui publie un json stringentity à une Détente de service web.
Fiddler les appels vers le service web à l'identique Json retour comme prévu, et un aspx application web à l'identique Json retourne comme prévu.
Quand je regarde les logs du serveur, je peux voir que le serveur est de répondre à un POST initial verbe avec une 307 rediriger, puis immédiatement un OBTENIR et d'erreur 405.
Fiddler et le aspx journal d'application d'un POST avec une 307 rediriger, puis immédiatement à un autre POSTE et un 200 OK.
Ce qui se passe?
C'est l'activité principale:
package com.altaver.android_PostJson2;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class PostJson extends Activity {
private static final String TAG = "MainActivity";
private static final String URL = "http://web2.altaver.com/sdz/avReSTfulLogin1";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
JSONObject jsonObjSend = new JSONObject();
try {
jsonObjSend.put("Pass", "sz");
jsonObjSend.put("User", "szechman");
Log.i(TAG, jsonObjSend.toString(2));
} catch (JSONException e) {
e.printStackTrace();
}
JSONObject jsonObjRecv = HttpClient.SendHttpPost(URL, jsonObjSend);
//examine JSONObject later
}
}
C'est le code de la classe de faire l'appel de service web:
package com.altaver.android_PostJson2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;
import android.util.Log;
public class HttpClient {
private static final String TAG = "HttpClient";
public static JSONObject SendHttpPost(String URL, JSONObject jsonObjSend) {
try {
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpClientParams.setRedirecting(httpclient.getParams(), true);
//added cookie policy, wild shot in the dark
//httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY, >CookiePolicy.RFC_2109);
HttpPost httpPostRequest = new HttpPost(URL);
StringEntity se;
se = new StringEntity(jsonObjSend.toString());
//Set HTTP parameters
httpPostRequest.setEntity(se);
//httpPostRequest.setHeader("User-Agent", >"com.altaver.android_PostJson2");
httpPostRequest.setHeader("User-Agent", "Mozilla/5.0 (Windows; U; >Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401");
httpPostRequest.setHeader("Accept", "application/json");
httpPostRequest.setHeader("Content-Type", "application/json");
long t = System.currentTimeMillis();
HttpResponse response = (HttpResponse) >httpclient.execute(httpPostRequest);
Log.i(TAG, "HTTPResponse received in [" + >(System.currentTimeMillis()-t) + "ms]");
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
String resultString= convertStreamToString(instream);
instream.close();
resultString = resultString.substring(1,resultString.length()-1); //>remove wrapping "[" and "]"
JSONObject jsonObjRecv = new JSONObject(resultString);
Log.i(TAG,"<jsonobject>\n"+jsonObjRecv.toString()+"\n</jsonobject>");
return jsonObjRecv;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the >BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a >StringBuilder
* and returned as String.
*
* (c) public domain: http://senior.ceng.metu.edu.tr/2009/praeda/2009/01>/11/a-simple-restful-client-at-android/
*/
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
OriginalL'auteur Stuart Zechman | 2011-06-07
Vous devez vous connecter pour publier un commentaire.
Mettre un " /" à la fin de l'URL provoque la redirection de se produire parce que votre serveur aime les url qui se terminent par '/'. POST est entièrement pris en charge par l'URL de votre serveur vous redirige vers, mais le client est en cours d'exécution d'une requête GET quand il se comporte en fonction de votre setRedirecting() appel (cURL n'a exactement la même chose avec le commutateur-L) La solution est de mettre un " /" à la fin de l'URL, ou de saisir l'Emplacement de l'en-tête de la réponse vous-même, puis de lancer un autre POST demande manuellement.
Cela peut être observé dans wireshark. Vous pouvez tester la théorie en essayant d'effectuer une requête GET avec votre navigateur à l'URL par une barre oblique, joints. Que va provoquer le navigateur pour obtenir une 405. Voici le code fixe pour Android, ce code utilise la solution simple d'ajouter un " /" de l'URL (pas de prêt de production):
vous avez été millimètres. Vous m'avez donné un assez gros jambe sur le problème.
Grands travaux il vraiment sauver beaucoup de mon temps merci.
il fonctionne parfaitement pour moi 🙂
j'ai travaillé plus de 3 heures, merci beaucoup 🙂
OriginalL'auteur Thomas Dignan
J'Ai Regardé Les Réponses Ci-Dessus, Et Il Semble Un Peu Trop Compliqué!!!!
Tout ce que je Fait Pour Résoudre Ce(Qui, Comme Certaines Des Réponses des États, Est Le Service Qui Ne permet pas Le POST), Est À Changer:
Pour
Et Que Résolu!
PD: j'ai Été d'Obtenir le Code d'État: 405!
OriginalL'auteur DreamLordOneiros
Le problème ci-dessus se produit souvent si le type de demande dans le service est WebGet e.g
et vous essayez d'accéder à la méthode à l'aide de HttpPost via android.
J'ai le même problème et il m'a fallu des heures juste pour comprendre.
OriginalL'auteur ShresthaGanesh