Странное поведение httpPost (может быть связано с json, auth, proxy) GET работает, POST работает, но не без прокси (частично решено) - PullRequest
0 голосов
/ 11 февраля 2011

Я пишу REST WCF RIA Silverlight 4.0-совместимую службу, к которой я могу успешно обращаться из javascript + jQuery.1.4.2.js + JSON2.js (и, конечно, из приложений .NET 4.0)

В основном то, что я делаю в своей активности Android:

            HttpPost request = new HttpPost(SERVICE_URI + "/SubmitChanges");             
        request.setHeader("Accept", "application/json; charset=utf-8");             
        request.setHeader("Content-type", "application/json; charset=utf-8");
        // Build JSON string            
        JSONStringer myTable = new JSONStringer()
        .object()
        .key("changeSet")
        .array()
            .object()
            .key("Id").value(0)
            .key("Entity")
                .object()
                    .key("__type").value("MyTable:#MyServiceApp.Web")
                    .key("ID").value(21)
                .endObject()
            .key("Operation").value(4)
            .endObject()
        .endArray()
        .endObject();
        Log.d("WebInvoke", "MyTable : " + myTable.toString());                           
        StringEntity entity = new StringEntity(myTable.toString());

//          entity.setContentType("application/json; charset=utf-8"); 
//          entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE,"application/json; charset=utf-8")); 
            request.setEntity(entity);
            Log.d("WebInvoke", "Entity : " + entity.toString());                           
            // Send request to WCF service             
            DefaultHttpClient httpClient = new DefaultHttpClient();
            httpClient.getCredentialsProvider().setCredentials(new AuthScope(null,-1), new UsernamePasswordCredentials("myuser","mypassword"));
//          HttpClientParams myParam = (HttpClientParams) httpClient.getParams();
//          Log.d("WebInvoke", "Entity : " + myParam.toString());                           

            HttpResponse response = httpClient.execute(request);              

Когда я обратился к приложению Android, я заметил, что не могу выполнять операции PUT (GET работает нормально). Они вернули ошибку 400 - Плохой запрос На js все работало нормально, я использовал fiddler2, чтобы увидеть, что произошло. Когда я настраивал эмулятор для работы через прокси-сервер Fiddler, неожиданно запрос стал работать нормально. Затем я попытался снова без прокси, и он вернулся к ошибке 400. Я также попытался загрузить apk в Galaxy S и подключиться через Интернет. Опять же, GET работает, но PUT не ...

Есть идеи?

Салудос, Оскар.

UPDATE

Это предыдущий запрос на выполнение без прокси

request HttpPost  (id=830085521536) 
    aborted false
    abortLock   ReentrantLock  (id=830085616656)
    connRequest null
    entity  StringEntity  (id=830085531688)
    headergroup HeaderGroup  (id=830085644864)
    params  null
    releaseTrigger  null
    uri URI  (id=830085878840)
httpClient  DefaultHttpClient  (id=830085612544)    
    connManager null
    cookieStore BasicCookieStore  (id=830085604904)
    credsProvider   BasicCredentialsProvider  (id=830085612624)
    defaultParams   null
    httpProcessor   null
    keepAliveStrategy   null
    log Jdk14Logger  (id=830085596488)
    proxyAuthHandler    null
    redirectHandler null
    requestExec null
    retryHandler    null
    reuseStrategy   null
    routePlanner    null
    supportedAuthSchemes    null
    supportedCookieSpecs    null
    targetAuthHandler   null
    userTokenHandler    null

Это задняя часть для выполнения запроса без прокси

request HttpPost  (id=830085521536) 
    aborted false
    abortLock   ReentrantLock  (id=830085616656)
    connRequest null
    entity  StringEntity  (id=830085531688)
    headergroup HeaderGroup  (id=830085644864)
    params  BasicHttpParams  (id=830085486480)
    releaseTrigger  SingleClientConnManager$ConnAdapter  (id=830085855888)
    uri URI  (id=830085878840)
httpClient  DefaultHttpClient  (id=830085612544)    
    connManager SingleClientConnManager  (id=830085927648)
    cookieStore BasicCookieStore  (id=830085604904)
    credsProvider   BasicCredentialsProvider  (id=830085612624)
    defaultParams   BasicHttpParams  (id=830085575968)
    httpProcessor   BasicHttpProcessor  (id=830085617496)
    keepAliveStrategy   DefaultConnectionKeepAliveStrategy  (id=830085544576)
    log Jdk14Logger  (id=830085596488)
    proxyAuthHandler    DefaultProxyAuthenticationHandler  (id=830085951384)
    redirectHandler DefaultRedirectHandler  (id=830085524448)
    requestExec HttpRequestExecutor  (id=830085525992)
    retryHandler    DefaultHttpRequestRetryHandler  (id=830085583064)
    reuseStrategy   DefaultConnectionReuseStrategy  (id=830085882544)
    routePlanner    DefaultHttpRoutePlanner  (id=830085880096)
    supportedAuthSchemes    AuthSchemeRegistry  (id=830085650400)
    supportedCookieSpecs    CookieSpecRegistry  (id=830085516320)
    targetAuthHandler   DefaultTargetAuthenticationHandler  (id=830085583264)
    userTokenHandler    DefaultUserTokenHandler  (id=830085486432)
response    BasicHttpResponse  (id=830085980112)    
    entity  BasicManagedEntity  (id=830085983552)
    headergroup HeaderGroup  (id=830085625184)
    locale  Locale  (id=830085944016)
    params  ClientParamsStack  (id=830085486448)
    reasonCatalog   EnglishReasonPhraseCatalog  (id=830004383520)
    statusline  BasicStatusLine  (id=830085625160)

Это предыдущий запрос на выполнение с прокси

request HttpPost  (id=830085966120) 
    aborted false   
    abortLock   ReentrantLock  (id=830085966520)    
    connRequest null    
    entity  StringEntity  (id=830085971592) 
    headergroup HeaderGroup  (id=830085966392)  
    params  null    
    releaseTrigger  null    
    uri URI  (id=830085966568)  
httpClient  DefaultHttpClient  (id=830085973896)    
    connManager null    
    cookieStore BasicCookieStore  (id=830085974504) 
    credsProvider   BasicCredentialsProvider  (id=830085974144) 
    defaultParams   null    
    httpProcessor   null    
    keepAliveStrategy   null    
    log Jdk14Logger  (id=830085974120)  
    proxyAuthHandler    null    
    redirectHandler null    
    requestExec null    
    retryHandler    null    
    reuseStrategy   null    
    routePlanner    null    
    supportedAuthSchemes    null    
    supportedCookieSpecs    null    
    targetAuthHandler   null    
    userTokenHandler    null    

Это задняя часть для выполнения запроса с прокси

request HttpPost  (id=830085966120) 
    aborted false   
    abortLock   ReentrantLock  (id=830085966520)    
    connRequest null    
    entity  StringEntity  (id=830085971592) 
    headergroup HeaderGroup  (id=830085966392)  
    params  BasicHttpParams  (id=830085980824)  
    releaseTrigger  SingleClientConnManager$ConnAdapter  (id=830085981992)  
    uri URI  (id=830085966568)  
httpClient  DefaultHttpClient  (id=830085973896)    
    connManager SingleClientConnManager  (id=830085978144)  
    cookieStore BasicCookieStore  (id=830085974504) 
    credsProvider   BasicCredentialsProvider  (id=830085974144) 
    defaultParams   BasicHttpParams  (id=830085977232)  
    httpProcessor   BasicHttpProcessor  (id=830085978848)   
    keepAliveStrategy   DefaultConnectionKeepAliveStrategy  (id=830085978816)   
    log Jdk14Logger  (id=830085974120)  
    proxyAuthHandler    DefaultProxyAuthenticationHandler  (id=830085980560)    
    redirectHandler DefaultRedirectHandler  (id=830085980152)   
    requestExec HttpRequestExecutor  (id=830085976912)  
    retryHandler    DefaultHttpRequestRetryHandler  (id=830085980128)   
    reuseStrategy   DefaultConnectionReuseStrategy  (id=830085978800)   
    routePlanner    DefaultHttpRoutePlanner  (id=830085978832)  
    supportedAuthSchemes    AuthSchemeRegistry  (id=830085975792)   
    supportedCookieSpecs    CookieSpecRegistry  (id=830085976320)   
    targetAuthHandler   DefaultTargetAuthenticationHandler  (id=830085980344)   
    userTokenHandler    DefaultUserTokenHandler  (id=830085980776)  
response    BasicHttpResponse  (id=830085927240)    
    entity  BasicManagedEntity  (id=830085863688)   
    headergroup HeaderGroup  (id=830085944256)  
    locale  Locale  (id=830085944272)   
    params  ClientParamsStack  (id=830085980792)    
    reasonCatalog   EnglishReasonPhraseCatalog  (id=830004383520)   
    statusline  BasicStatusLine  (id=830085927216)  

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

Будучи проблемой, связанной с протоколом, я начинаю тестировать схемы проверки подлинности различных серверов на сервере.Похоже, что с 2008 года java и apache поддерживают новый NTLMv2, реализованный на новых серверах.

Я нашел (и потерял) сеть, в которой, как отмечается, используется JCIFS для устранения разрыва.Но все не так просто, чтобы включить jar, вы также должны написать часть кода и поддержку всего, что является неопределенным и не гарантируется.В практическом жаргоне это означает «использовать только базовую аутентификацию», но заглавными буквами ...

Кстати, я нашел способ, которым это работает.Это просто добавление этого:

httpClient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);

Дэйв, я должен тебе один большой!Большое спасибо всем за прочтение темы!

Saludos, OSCAR.

0 голосов
/ 01 февраля 2012

Для любого, кто обращался к этому вопросу (примерно через год после того, как он был задан), у меня была похожая проблема с почти идентичным кодом. Кажется, проблема в методе setCredentials(). По-видимому, он включает в себя некоторые пробелы, которые подходят для GET, но вызывают проблемы с PUT или POST.

Установка авторизации вручную должна решить проблему. Что-то вроде:

request.setHeader("Authorization","Basic "+Base64.encodeToString("login:password".getBytes(),Base64.URL_SAFE|Base64.NO_WRAP););

Не забудьте использовать Base64.URL_SAFE | Base64.NO_WRAP.

Ссылка: HTTP POST-запрос с авторизацией на android

0 голосов
/ 11 февраля 2011

Вы пытались явно установить charset на StringEntity?

import org.apache.http.protocol.HTTP;
...
StringEntity entity = new StringEntity(myTable.toString(),HTTP.UTF_8);
...