我编写了一个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)
答案 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
。