IIS, кажется, считает, что Android HttpPost - это ПОЛУЧЕНИЕ - PullRequest
0 голосов
/ 04 апреля 2011

ОБНОВЛЕНИЕ: Эти проблемы были вызваны обратным прокси-сервером, выполняющим перенаправление 301. Изменение адреса назначения редиректа устранило проблему.

Я пытаюсь сделать POST-запрос с Android на веб-сервис.

У меня есть веб-служба, работающая на IIS7 со следующим:

<OperationContract()> _
<Web.WebInvoke(BodyStyle:=WebMessageBodyStyle.Bare, Method:="POST", RequestFormat:=WebMessageFormat.Xml, ResponseFormat:=WebMessageFormat.Xml, UriTemplate:="HelloWorld")> _
    Function HelloWorld() As XmlElement 

Когда я отправляю запрос POST на этот URL-адрес из Firefox, он работает как положено.

Когда я делаю запрос с устройства Android, используя следующий код:

String sRequest = "http://www.myserviceurl.com/mysevice/HelloWorld";
ArrayList<NameValuePair> arrValues = new ArrayList<NameValuePair>();
arrValues.add(new BasicNameValuePair("hello", "world"));

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpRequest = new HttpPost(sRequest);
httpRequest.setHeader("Content-Type", "application/x-www-form-urlencoded");
httpRequest.setEntity(new UrlEncodedFormEntity(arrValues));
HttpResponse response = httpClient.execute(httpRequest);

Я получаю ответ «Метод не разрешен» 405, и при просмотре журналов IIS запрос к этому URL-адресу отображается как «GET».

Если я изменю цель запроса на PHP-скрипт, который отображает $ _SERVER ['REQUEST_METHOD'], вывод будет POST.

В web.config веб-службы в качестве глаголов используются GET, HEAD и POST.

Есть что-то, что я упустил из виду?

Ответы [ 2 ]

2 голосов
/ 02 октября 2011

Мне пришлось применить обходной путь, отключив автоматическое перенаправление, а затем перехватив код ответа и URL-адрес перенаправления и повторно выполнив POST.

// return false so that no automatic redirect occurrs
httpClient.setRedirectHandler(new DefaultRedirectHandler()
{
    @Override
    public boolean isRedirectRequested(HttpResponse response, HttpContext context)
    {
        return false;
    }
});

Тогда, когда я выпустил запрос

response = httpClient.execute(httpPost, localContext);
int code = response.getStatusLine().getStatusCode();
// if the server responded to the POST with a redirect, get the URL and reexecute the  POST
if (code == 302 || code == 301)
{
    httpPost.setURI(new URI(response.getHeaders("Location")[0].getValue()));
    response = httpClient.execute(httpPost, localContext);
}
0 голосов
/ 04 апреля 2011

попробуй:

DefaultHttpClient http = new DefaultHttpClient();
    HttpResponse res;
    try {
        HttpPost httpost = new HttpPost(s);
        httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.DEFAULT_CONTENT_CHARSET));

        res = http.execute(httpost);


        InputStream is = res.getEntity().getContent();
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while((current = bis.read()) != -1){
              baf.append((byte)current);
         }
        res = null;
        httpost = null;
        String ret = new String(baf.toByteArray(),encoding);
        return  ret;
       } 
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        return e.getMessage();
    } 
    catch (IOException e) {
        // TODO Auto-generated catch block
        return e.getMessage();
    }
...