奇怪的httpPost行为(可能是json,auth,代理相关)GET工作,POST工作,但不是没有代理(部分解决)

时间:2011-02-11 14:49:31

标签: java android authentication post httpclient

我编写了一个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不会......

有什么想法吗?

Saludos,OSCAR。

更新

这是执行请求之前没有代理

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 个答案:

答案 0 :(得分:1)

作为与协议相关的问题,我开始测试服务器中的多样化身份验证方案。似乎自2008年以来,java和apache都支持在新服务器中实现的新NTLMv2。

我发现(并丢失)一个网站,注意到使用JCIFS来弥补差距。但是包含jar的东西并不是那么简单,你还必须编写部分代码,并支持所有不确定但不会被忽略的代码。这意味着,在实际的术语中,“仅使用基本身份验证”,但以大写字母表示......

顺便说一句,我找到了它的工作方式。它只是添加了这个:

httpClient.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);
戴夫,我欠你一个大! 非常感谢每个人阅读线程!

Saludos,OSCAR。

答案 1 :(得分:0)

您是否尝试在charset上明确设置StringEntity

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

答案 2 :(得分:0)

对于任何引用此问题的人(在被问到大约一年后),我遇到了几乎相同代码的类似问题。问题似乎与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 request with authorization on android