0

I write a REST WCF RIA Silverlight 4.0 compatible service, that I can access sucessfully from a javascript + jQuery.1.4.2.js + JSON2.js (and, of course, from .NET 4.0 applications)

Basically, what I'm doing in my Android activity is:

            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);              

When turned to Android app, I noted that I cannot do PUT's operations (GETs worked OK). They returned error 400 - Bad request As it worked OK on js, I used fiddler2 to see what's happend. When I setup the emulator to work throught fiddler proxy, suddenly, the request has turned OK. Then I tryed again without proxy, and it returned to error 400. I tryed also uploading the apk to my Galaxy S and connecting through web. Again, GETs works, but PUTs don't...

Any ideas?

Saludos, OSCAR.

UPDATE

This is previous to execute request without proxy

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

This is posterior to execute request without proxy

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)

This is previous to execute request with proxy

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    

This is posterior to execute request with proxy

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)  
ogry
  • 11
  • 3

3 Answers3

1

Being a problem related to the protocol, I begin to test the diverses athentication schemes in the server. It seems that since 2008, java, nor apache, supports the new NTLMv2 implemented in the new servers.

I found (and lost) a web where is noted to use JCIFS to bring the gap. But the things are not so simple to include the jar, you must also write part of the code, and the support of all that is uncertain and not waranteed. This means, in practical lingo, 'use only basic authentication' but in capital letters...

BTW, I found the way it works. Its simply adding this:

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

Dave, I owe you one big! Many thanks to every one for read the thread!

Saludos, OSCAR.

ogry
  • 11
  • 3
0

Have you tried explicitly setting the charset on the StringEntity?

import org.apache.http.protocol.HTTP;
...
StringEntity entity = new StringEntity(myTable.toString(),HTTP.UTF_8);
dave.c
  • 10,910
  • 5
  • 39
  • 62
  • Thanks for reply! I just tryied... but no way. The command is OK, as it worked when using the fiddler proxy. Is just that without it, don't want to go... seems to be related with the internal implementation of httpClient or something... – ogry Feb 12 '11 at 11:21
  • @ogry I can't see anything obviously wrong with it. You could try outputting as much of the request as you can prior to the sending the POST so that you can compare it with the output from fiddler2. Also some examples I have seen use a `JSONObject` rather than a `JSONStringer`. FYI - you are performing a POST operation, not a PUT. – dave.c Feb 12 '11 at 12:58
  • Ooops! Thanks for the advice, Dave... It works when using fiddler, I think because of proxy, so seems to not be nothing to do with the way you constructs the entity. But I tryied also the JSONObject way, with no difference. I cannot distinghish from the request properties when using fiddler or without using it. I recab alot of data with details... if you think it would help I can update the post with that barabage... or, if you figures something to look more in deep... please, tell me. – ogry Feb 12 '11 at 18:08
0

For anyone referencing this question (about a year after it was asked), I had a similar problem with almost identical code. The problem seems to be with the setCredentials() method. Apparently, it includes some whitespaces that are fine with GET but cause a problem with PUT or POST.

Setting the authorization manually should solve the problem. Something like:

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

Remember to use Base64.URL_SAFE | Base64.NO_WRAP.

Reference: HTTP POST request with authorization on android

Community
  • 1
  • 1
Saad Farooq
  • 13,172
  • 10
  • 68
  • 94